2016-05-12 30 views
0

我不知道我該如何更新用戶角色,我嘗試以下方法:
注: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 
... 
兩種情況下

我得到一個錯誤,告訴我說:」 ......拒絕值ROLE_ADMIN_APP]
這是一個有效的角色,但已經在人之後,這意味着該集合沒有被清除,請解決任何問題?謝謝

+0

您可能需要在刪除角色和添加新角色之間執行'personne.save()'。 –

+0

讓我做@NonTrasctionnal動作嗎? – hereForLearing

+0

不,你不知道。 –

回答

3

在彈出安全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,看看他是怎麼做到的。它丟棄所有相關的角色和重新添加它們(見無效UpdateUser兩個)

UserRole.removeAll user 
    addRoles user, roleNames 
    removeUserFromCache user 
+0

removeAll會刪除所有角色,但不能創建新角色:/ – hereForLearing

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" 

我的課個人或我得到以下錯誤:

A different object with the same identifier value was already associated with the session : [ma.ac.uir.ecine.authentification.PersonneRole#PersonneRole(personne:Personne(email:[email protected]), role:Role(authority:ROLE_MEMBRE), id:null, version:null)] 

任何人都可以向我解釋爲什麼好嗎?

相關問題