如何用另一个角色集替换用户的角色集合?

时间:2016-05-12 13:22:31

标签: grails spring-security

我想知道如何更新用户角色,我尝试了以下方法:
注意:User = Personne,UserRole = PersonneRole
清除列表并将其替换为新列表:

    @Transactional
    def myaction(Personne personne,List<String> roles){ // roles is a list of authorities
            def role
            personne.personneRoles*.delete()// tried PersonneRoles.findByPersonne(personne)*.delete() as well
            personne.personneRoles.clear()
            roles.each {  role=Role.findByAuthority(it);personne.personneRoles.add(new PersonneRole(personne,role)) }
            if(!personne.save(flush:true))
                return false
            ....

我也跟着this tutorial但是没有工作:

@Transactional
def action(Personne personne,List<String> roles){
    def role
    def temp = []
    temp += personne.personneRoles
    temp.each{personneRole ->
        personne.removeFromPersonneRoles(personneRole)
        personneRole.delete()
    }
    roles.each {  role=Role.findByAuthority(it);personne.personneRoles.add(new PersonneRole(personne,role)) }
    if(!personne.save(flush:true))
        return false
...

在这两种情况下我都收到错误告诉我&#34; ....被拒绝的值[ROLE_ADMIN_APP]
什么是一个有效的角色,但已经告诉了这个人,这意味着该集合没有被清除,任何解决方案都可以吗?谢谢

2 个答案:

答案 0 :(得分:3)

在spring security UI插件https://github.com/grails-plugins/grails-spring-security-ui/blob/master/grails-app/services/grails/plugin/springsecurity/ui/SpringSecurityUiService.groovy中查看grails.plugin.springsecurity.ui.SpringSecurityUiService,看看他是如何做到的。它会删除所有相关角色并重新添加它们(请参阅void updateUser)

    UserRole.removeAll user
    addRoles user, roleNames
    removeUserFromCache user

答案 1 :(得分:0)

这是有效的:

def myaction(Personne personne,List<String> roles){
        def role
        personne.personneRoles.clear()
        PersonneRole.removeAll(personne)
        roles.each {
            role=Role.findByAuthority(it)
            personne.addToPersonneRoles(new PersonneRole(personne,role))
        }
        if(!personne.save())
        ...

但我必须补充:

personneRoles cascade: "all-delete-orphan"

到我的班级Personne或我收到以下错误:

A different object with the same identifier value was already associated with the session : [ma.ac.uir.ecine.authentification.PersonneRole#PersonneRole(personne:Personne(email:example0@gmail.com), role:Role(authority:ROLE_MEMBRE), id:null, version:null)]
任何人都可以向我解释为什么请?