我正在研究Spring Security,我正在使用Spring Security 3.2.7并且对servlet集成功能有疑问
请参阅Spring文档
3.1.3。 HttpServletRequest.isUserInRole(字符串)
HttpServletRequest.isUserInRole(String)将确定SecurityContextHolder.getContext()。getAuthentication()。getAuthorities()是否包含带有传递给isUserInRole(String)的角色的GrantedAuthority。
通常,用户不应将“ROLE_”前缀传递给此方法,因为它会自动添加。例如,如果要确定当前用户是否具有“ROLE_ADMIN”权限,则可以使用以下内容:
boolean isAdmin = httpServletRequest.isUserInRole(“ADMIN”);
这可能有助于确定是否应显示某些UI组件。例如,仅当当前用户是管理员时,您才可以显示管理员链接。
然而,当我试过时,我发现了httpServletRequest.isUserInRole(“ADMIN”);返回false,而httpServletRequest.isUserInRole(“ROLE_ADMIN”);返回true。
是否有任何特殊配置要求在调用isUserInRole时自动添加“ROLE_”前缀?
以下是我的配置(来自示例应用程序)
<authentication-manager>
<authentication-provider>
<user-service>
<user name="jimi" password="jimispassword" authorities="ROLE_USER, ROLE_ADMIN" />
<user name="bob" password="bobspassword" authorities="ROLE_USER" />
</user-service>
</authentication-provider>
</authentication-manager>
答案 0 :(得分:2)
我找到了解决方法。通过比较Spring Security 3.2.7和4.0.1之间的类 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper 的源代码,我发现在4.0.1中属性 rolePrefix 初始化为值&#34; ROLE _&#34;但不是3.2.7。
Spring Security 3.2.7
private final String rolePrefix;
Spring Security 4.0.1
private String rolePrefix =&#34; ROLE _&#34 ;;
所以看起来前缀&#34; ROLE _&#34;不会自动添加Spring Security 3.2.7
使用Migrating from Spring Security 3.x to 4.x (XML Configuration)中的示例,我创建了一个BeanPostProcessor来设置&#34; ROLE _&#34;到SecurityContextHolderAwareRequestFilter的rolePrefix属性。
public class DefaultRolesPrefixPostProcessor implements BeanPostProcessor, PriorityOrdered {
...
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof SecurityContextHolderAwareRequestFilter) {
SecurityContextHolderAwareRequestFilter filter = (SecurityContextHolderAwareRequestFilter) bean;
filter.setRolePrefix("ROLE_");
}
return bean;
}
}
以上解决方案适用于我的情况,但我不确定这是否是正确的方法。