我正在尝试学习Spring安全性。
在完成一些教程之后,我发现其中一些使用UserRole,而一些使用实现身份验证的UserAuthentication类。 我试图实现(和工作)的是创建一个实现UserDetailsService的自定义MyUserDetailsService,并授予权限(角色?),如下所示:
private List<GrantedAuthority> buildUserAuthority(Set<UserRole> userRoles) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
// Build user's authorities
for (UserRole userRole : userRoles) {
setAuths.add(new SimpleGrantedAuthority(userRole.getRole()));
}
List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(setAuths);
return Result;
}
我想知道User Roles和GrantedAuthorities之间的区别(例如在使用@PreAuthorize(hasRole ...)vs @PreAuthorize(hasAuthority ...)时),如果他们做同样的事情,为什么两者都存在?或者使用一个与另一个相比的优点。
答案 0 :(得分:1)
关于你的评论 &#34;有些人正在使用UserRole而其他人使用UserAuthentication&#34; ,这些实际上是两个不同的概念 - UserRole用于用户授权,另一个用于用户身份验证。为什么一个用于另一个仅仅是实现验证和授权用户的解决方案的各种情况的问题。验证用于确定她说她是谁以及授权的用户是否可以实际执行请求。关于你的教程,我可能已经离开了,因为我还没有看到它,但我希望这有助于你理解其中提到的两个不同的概念,以及为什么它们是赞美不竞争的概念。
关于您实施的方向,我认为您已经使用自定义详情服务走上了正确的轨道,过去我已经做了无数次,并且效果很好。关于您关于用户角色和GrantedAuthority
的问题 - 我认为将GrantedAuthority
视为抽象是安全的,这使您能够提供自定义字符串令牌以识别/分类某些用户/系统/等等。在一组。哪个基本上是UserRole太对了?我不是Spring安全贡献者,但我的猜测是GrantedAuthority
是为了简单地在其安全域上下文中抽象角色的概念而创建的。
通过将您的角色字符串放入GrantedAuthority
,您可以说,经过身份验证的用户具有以下权限 - 角色。 @PreAuthorize
采用EL字符串,如果用户被授予&#39;,则该字符串可以与经过身份验证的用户授予的权限集合中的一个字符串匹配。如果用户未被授予权限/角色,则她无法执行请求。对于你的要求,概念是相同的。
来自Spring文档:
@PreAuthorize("hasRole('ROLE_USER')")
public void create(Contact contact);
此外,此页面也很有用(请参阅:15.3方法安全表达式): Spring Expressions
我希望这会有所帮助。