在我的应用程序中,我通常为访问管理创建三个表。角色、权限以及在角色和权限之间映射的关联表。
我正在尝试将这种方法转换为 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() 来保护基于权限而不是角色的东西吗?