Spring Security:检查用户是不是具有分层角色的方法
Posted
技术标签:
【中文标题】Spring Security:检查用户是不是具有分层角色的方法【英文标题】:Spring Security: method to check if a user has a Hierarchical RoleSpring Security:检查用户是否具有分层角色的方法 【发布时间】:2017-10-31 00:44:25 【问题描述】:如何检查用户在运行时是否具有分层角色?
我知道这个url授权解决方案@PreAuthorize("hasRole('ROLE_ADMIN')")
但是如果我必须检查角色,则在方法内?
例如:
ROLE_ADMIN > ROLE_USER > ROLE_GUEST
if (user.hasRole('ROLE_USER'))
do something;
在此示例中,如果用户具有 ROLE_ADMIN,则条件必须为真,因为在分层角色中 ROLE_ADMIN > ROLE_USER。
谢谢
【问题讨论】:
我不会写这段代码:if (user.hasRole('ROLE_USER') || user.hasRole('ROLE_ADMIN')) do something ,但前提是 (user.hasRole ('ROLE_USER')),只有最低角色 如果您的用户同时拥有 ROLE_ADMIN 和 ROLE_USER,则不必这样做 为什么需要方法内部的检查?为什么不使用@PreAuthorize
(您似乎认为这与基于 URL 的安全性无关)。
【参考方案1】:
感谢大家的回复。 也许我找到了解决方案。 我用这个@Configuration 创建了一个自定义的分层角色系统:
@Bean
public RoleHierarchy roleHierarchy()
RoleHierarchyImpl roleHierarchy = new RoleHierarchyImpl();
roleHierarchy.setHierarchy("ROLE_SUPERADMIN > ROLE_ADMIN ROLE_ADMIN > ROLE_USER ROLE_USER > ROLE_GUEST");
return roleHierarchy;
@Bean
public RoleHierarchyVoter roleVoter()
return new RoleHierarchyVoter(roleHierarchy());
@Bean
public DefaultWebSecurityExpressionHandler expressionHandler()
DefaultWebSecurityExpressionHandler expressionHandler = new DefaultWebSecurityExpressionHandler();
expressionHandler.setRoleHierarchy(roleHierarchy());
return expressionHandler;
之后我创建了一个帮助函数:
public static boolean hasHierarchyRole(String role, RoleHierarchy roleHierarchy)
Collection<? extends GrantedAuthority> authorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Collection<? extends GrantedAuthority> hierarchyAuthorities = roleHierarchy.getReachableGrantedAuthorities(authorities);
for (GrantedAuthority authority : hierarchyAuthorities)
if (authority.getAuthority().equals(role))
return true;
return false;
而且似乎有效。
【讨论】:
以上是关于Spring Security:检查用户是不是具有分层角色的方法的主要内容,如果未能解决你的问题,请参考以下文章
在 Spring Security 中检查现有的 HttpSession
具有 Security EvaluationContextExtensionSupport 的 Spring Data JPA 不起作用
在 Spring Security 中基于某种所有权设置用户角色