diff --git a/grails-app/conf/BootStrap.groovy b/grails-app/conf/BootStrap.groovy index 6c97418..5f7c8ab 100644 --- a/grails-app/conf/BootStrap.groovy +++ b/grails-app/conf/BootStrap.groovy @@ -55,7 +55,9 @@ class BootStrap { println "########### Start Create Admin User ###########" - def adminUser = new User(username: 'admin', password: 'admin').save(flush: true) + User.withTransaction { + def adminUser = new User(username: 'admin', password: 'admin').save(flush: true) + UserRoleGroup.create(adminUser,adminGrup,true) println "########### End Create Admin User ###########" @@ -80,6 +82,7 @@ class BootStrap { UserRoleGroup.create(adminUser2,roleAdminGrup,true) UserRoleGroup.create(adminUser2,roleGroupAdminGrup,true) println "########### End Create AdminUser ###########" + } } def destroy = { diff --git a/grails-app/conf/BuildConfig.groovy b/grails-app/conf/BuildConfig.groovy index 8e4245d..d13cb6b 100644 --- a/grails-app/conf/BuildConfig.groovy +++ b/grails-app/conf/BuildConfig.groovy @@ -66,5 +66,6 @@ grails.project.dependency.resolution = { //compile ":coffee-asset-pipeline:1.5.0" //compile ":handlebars-asset-pipeline:1.3.0.1" compile ':spring-security-core:2.0-RC4' + compile ":envers:2.1.0" } } diff --git a/grails-app/controllers/com/mapaxe/security/UserController.groovy b/grails-app/controllers/com/mapaxe/security/UserController.groovy index c5060f4..d2a7a39 100644 --- a/grails-app/controllers/com/mapaxe/security/UserController.groovy +++ b/grails-app/controllers/com/mapaxe/security/UserController.groovy @@ -7,7 +7,6 @@ import grails.transaction.Transactional @Transactional(readOnly = true) class UserController { - static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] def index(Integer max) { diff --git a/grails-app/domain/com/mapaxe/security/User.groovy b/grails-app/domain/com/mapaxe/security/User.groovy index 8f39e3b..ca8ad75 100644 --- a/grails-app/domain/com/mapaxe/security/User.groovy +++ b/grails-app/domain/com/mapaxe/security/User.groovy @@ -1,5 +1,8 @@ package com.mapaxe.security +import org.hibernate.envers.Audited + +@Audited class User { transient springSecurityService diff --git a/grails-app/domain/com/mapaxe/security/UserRevisionEntity.groovy b/grails-app/domain/com/mapaxe/security/UserRevisionEntity.groovy new file mode 100644 index 0000000..d854355 --- /dev/null +++ b/grails-app/domain/com/mapaxe/security/UserRevisionEntity.groovy @@ -0,0 +1,28 @@ +package com.mapaxe.security + +import envers.SpringSecurityRevisionListener +import org.hibernate.envers.RevisionEntity +import org.hibernate.envers.RevisionNumber +import org.hibernate.envers.RevisionTimestamp + +@RevisionEntity(SpringSecurityRevisionListener.class) +class UserRevisionEntity { + + @RevisionNumber + Long id + + @RevisionTimestamp + Long timestamp + + User currentUser + + static constraints = { + currentUser(nullable: true) + } + + static transients = ['revisionDate'] + + public Date getRevisionDate() { + return new Date(timestamp); + } +} \ No newline at end of file diff --git a/src/groovy/envers/SpringSecurityRevisionListener.groovy b/src/groovy/envers/SpringSecurityRevisionListener.groovy new file mode 100644 index 0000000..08a4c97 --- /dev/null +++ b/src/groovy/envers/SpringSecurityRevisionListener.groovy @@ -0,0 +1,14 @@ +package envers + +import com.mapaxe.security.User +import com.mapaxe.security.UserRevisionEntity +import org.hibernate.envers.RevisionListener + +class SpringSecurityRevisionListener implements RevisionListener { + def springSecurityService + public void newRevision(Object entity) { + UserRevisionEntity revisionEntity = (UserRevisionEntity) entity + User user = springSecurityService?.currentUser + revisionEntity.currentUser = user + } +} diff --git a/src/groovy/envers/SpringSecurityServiceHolder.groovy b/src/groovy/envers/SpringSecurityServiceHolder.groovy new file mode 100644 index 0000000..2808767 --- /dev/null +++ b/src/groovy/envers/SpringSecurityServiceHolder.groovy @@ -0,0 +1,13 @@ +package envers + +import grails.plugin.springsecurity.SpringSecurityService + + +class SpringSecurityServiceHolder { + + static SpringSecurityService springSecurityService + + SpringSecurityServiceHolder(SpringSecurityService springSecurityService) { + this.springSecurityService = springSecurityService + } +} \ No newline at end of file diff --git a/test/unit/com/mapaxe/security/UserRevisionEntitySpec.groovy b/test/unit/com/mapaxe/security/UserRevisionEntitySpec.groovy new file mode 100644 index 0000000..a6a06cb --- /dev/null +++ b/test/unit/com/mapaxe/security/UserRevisionEntitySpec.groovy @@ -0,0 +1,20 @@ +package com.mapaxe.security + +import grails.test.mixin.TestFor +import spock.lang.Specification + +/** + * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions + */ +@TestFor(UserRevisionEntity) +class UserRevisionEntitySpec extends Specification { + + def setup() { + } + + def cleanup() { + } + + void "test something"() { + } +}