【问题标题】:Change user roles by userDetailsManager通过 userDetailsManager 更改用户角色
【发布时间】:2014-07-05 23:48:55
【问题描述】:

我想更改用户的角色。更改用户在数据库中的角色。一切都基于 Spring Security。

我的代码:

UserDetails user = userDetailsManager.loadUserByUsername(userData.getUser().getUsername());

user.getAuthorities().add(new SimpleGrantedAuthority(role));

userDetailsManager.updateUser(user);

错误:

Error:(99, 30) java: method add in interface java.util.Collection<E> cannot be applied to
given types;
  required: capture#1 of ? extends org.springframework.security.core.GrantedAuthority
  found: org.springframework.security.core.authority.SimpleGrantedAuthority
  reason: actual argument    
org.springframework.security.core.authority.SimpleGrantedAuthority cannot be converted to   
capture#1 of ? extends org.springframework.security.core.GrantedAuthority by method   
invocation conversion

我不知道为什么会出现这个错误。否则如何更改用户的角色?

【问题讨论】:

  • SimpleGrantedAuthority 是否扩展 GrantedAuthority?你能显示它的代码吗?
  • 是的,它实现了这个接口。
  • 试试GrantedAuthority ga = new SimpleGrantedAuthority(role); user.getAuthorities().add(ga);
  • 没什么,它不起作用:(

标签: java spring spring-security roles


【解决方案1】:
  1. 问题是您无法将已知类型添加到包含未知类型的列表中。 (见https://stackoverflow.com/a/3716945/755183
  2. 用户是不可变的,因此为了修改您应该克隆现有用户并使用新角色

【讨论】:

    【解决方案2】:

    您可以通过从现有用户创建一个新的 UserDetails 对象来更新给定用户的角色,然后调用 UserDetailsManager.updateUser() 方法,如下所示:

        UserDetails oldDetails = userDetailsManager.loadUserByUsername(user);
        UserDetails newDetails = new User(user, oldDetails.getPassword(),  newRole);
        userDetailsManager.updateUser(newDetails);
    

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 2012-08-23
      • 1970-01-01
      相关资源
      最近更新 更多