1

在我的应用程序中,我通常为访问管理创建三个表。角色、权限以及在角色和权限之间映射的关联表。

我正在尝试将这种方法转换为 Spring 安全性,在阅读了 [这篇文章][1] 之后,我认为我走在了正确的轨道上。我创建了一个自定义 AuthenticationProvider 并实现了authenticate()这样的方法:

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString());

    if(profile == null){
        throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal()));
    }

    String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString());

    if(!profile.getPasswordHash().equals(suppliedPasswordHash)){
        throw new BadCredentialsException("Invalid credentials");
    }

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities());

    return token;
}

profile.getAuthorities()方法创建一个权限列表(权限包含在我自己的 GrantedAuthority 实现中)。因此,使用此列表创建了 UsernamePasswordAuthenticationToken 对象。这是处理此问题的 UserProfile.getGrantedAuthorities() 方法:

public Collection<? extends GrantedAuthority> getAuthorities() {
    Set<ProduxAuthority> authorities = new HashSet<ProduxAuthority>();
    for (Role role : roles) {
        for (Right right : role.getRights()) {
            ProduxAuthority produxAuthority = new ProduxAuthority(right.getName());
            authorities.add(produxAuthority);
        }
    }
    return authorities;
}

我的问题是这是否是正确的方法。我的印象是我应该将角色填充到 GrantedAuthorities 而不是权限,但我想使用权限来保护方法和 url,因为它让我对授权有更细粒度的控制。我将如何做到这一点?Spring中的ROLE和PERMISSION有什么区别?权限是否映射到权限,我可以使用 hasPermission() 来保护基于权限而不是角色的东西吗?

4

1 回答 1

3

我将再次回答我自己的问题:

Spring不知道hasPermission方法使用的权限和权限只适用于Spring安全中相对复杂的Domain Object Security/ACL。Spring 的简单安全只知道角色和角色或更通用的“权限”(一般意义上,不要与域对象安全/ACL 中的权限混淆),例如 IS_AUTHENTICATED_ANONYMOUSLY 在身份验证的第三个构造函数参数中传递给 Spring对象的。

我总结了我自己网站上的所有内容,并创建了一个示例实现,将权限填充到角色中,并且以这种方式仍然非常灵活。

http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

于 2012-11-06T19:06:19.110 回答