2016-05-12 3 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

посмотрите в grails.plugin.springsecurity.ui.SpringSecurityUiService в плагине UI весенней безопасности безопасности https://github.com/grails-plugins/grails-spring-security-ui/blob/master/grails-app/services/grails/plugin/springsecurity/ui/SpringSecurityUiService.groovy и посмотрите, как он это делает. Она удаляет все связанные с ним роли и вновь складывает их (см недействительным 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)] 

любой может объяснить мне, почему, пожалуйста?

Смежные вопросы