【问题标题】:Excluding GrantedAuthority from userDetails in spring security在 Spring Security 中从 userDetails 中排除 GrantedAuthority
【发布时间】:2013-11-18 17:02:17
【问题描述】:

我想将角色视为用户的一个属性,而不是拥有一个独立的角色类,因此我不需要在我的数据库中有一个角色表。但是通用 spring UserDetails 服务通过GrantedAuthority(即Collection<GrantedAuthority> getAuthorities()) 作为用户详细参数之一。

我想要做的是用我的“用户”类中声明的角色(字符串角色)替换这个通用的GrantedAuthority 参数,如下所示。

@Entity(name="usr")
public class User {
    @Id
    @Column(unique=true)
    private String username;
    private String password;
    private String role;

    public String getUsername() {               
        return username;        
    }

    public void setUsername(String username) {          
        this.username = username;       
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }
}

还有我的 customUserdetail 服务类:

@Service
@Transactional(readOnly = true)
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository repository;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {               
        try {
            x.y.User  user = repository.findByUsername(username);

            boolean enabled = true;
            boolean accountNonExpired = true;
            boolean credentialsNonExpired = true;
            boolean accountNonLocked = true;

            return new User(
                    user.getUsername(), 
                    user.getPassword(),
                    enabled,
                    accountNonExpired,
                    credentialsNonExpired,
                    accountNonLocked,
                    user.getRole());        

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }               
}

它返回一个错误,因为我传递了user.getRole(),它是String,而不是Collection<GrantedAuthority> getAuthorities(),这是spring security 中的默认角色类型。

如何自定义它以便可以使用我已声明为“用户”类的属性的角色(字符串类型)?

Mind: 必须保留正常的安全流程!。意思是,不影响正常的spring安全流程。

提前谢谢你!

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    可以通过您的用户实体实现 UserDetails 接口并覆盖 getAuthorities() 方法来完成:

    public class User implements UserDetails {
        ...
        private String role;
        ...
    
        @Override
        public Set<GrantedAuthority> getAuthorities() {
            Set<GrantedAuthority> authorities = new HashSet<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority(this.role));
            return authorities;
        }
    }
    

    最好遵守 Spring Security 的角色名称命名约定,即以“ROLE_”前缀开头。

    【讨论】:

    • 我也尝试过这样做。但是当方法 getAuthorities() 被调用时,this.role 始终为空。
    【解决方案2】:

    您的数据模型与 Spring Security 及其合同截然不同。顺便说一句,在 Spring Security 中,一个用户可以有多个角色。这是由其接口制定的合同的一部分。您提出的数据模型违反了这一点,因此如果没有大量我喜欢称之为“Frankensteining”的东西,就无法与 Spring Security 一起使用。您还将失去 Spring Security 设计带来的大量灵活性。简而言之,付出比付出更多。

    【讨论】:

      猜你喜欢
      • 2015-03-14
      • 2013-10-31
      • 1970-01-01
      • 2015-01-17
      • 2016-03-16
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多