我想知道如何更新用户角色,我尝试了以下方法:
(注意: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]
什么是一个有效的角色,但已经告诉了这个人,这意味着该集合没有被清除,任何解决方案都可以吗?谢谢
答案 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)]
任何人都可以向我解释为什么请?