我正在努力学习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 ...)时),如果他们做同样的事情,为什么两者都存在?或者使用一个与另一个相比的优点 .
1 回答
关于您对"some are using UserRole while others use UserAuthentication"的评论,这些是两个不同的概念 - UserRole用于用户授权,另一个用于用户身份验证 . 为什么一个用于另一个仅仅是实现验证和授权用户的解决方案的各种情况的问题 . 验证用于确定她说她是谁以及授权的用户是否可以实际执行请求 . 关于你的教程,我可能已经离开了,因为我还没有看到它,但我希望这有助于你理解其中提到的两个不同的概念,以及为什么它们是赞美不竞争的概念 .
关于你实施的方向,我认为你过去无数个时间已经完成了它并且运行良好 . 关于你关于用户角色和
GrantedAuthority
的问题 - 我认为将GrantedAuthority
视为抽象是安全的,允许你提供自定义字符串标记来识别/分类某些用户/系统/等 . 在一组 . 哪个基本上是UserRole太对了?我不是Spring安全贡献者,但我的猜测是创建了GrantedAuthority
以简单地在其安全域上下文中抽象角色的概念 .通过将您的角色字符串放入
GrantedAuthority
,您可以说经过身份验证的用户具有以下权限 - 角色 .@PreAuthorize
接受一个EL字符串,该字符串可以匹配经过身份验证的用户's granted authorities collection if the user is '授予权限/角色的其中一个字符串,然后她无法执行请求 . 对于你的要求,概念是相同的 .从Spring文档:
此外,此页面也很有用(请参阅:15.3方法安全表达式):Spring Expressions
我希望这有帮助 .