Spring Security 3.2.7 HttpServletRequest.isUserInRole(String)不会自动添加“ROLE_”前缀

时间:2015-05-10 00:39:59

标签: java spring spring-security

我正在研究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>

1 个答案:

答案 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;
    }
}

以上解决方案适用于我的情况,但我不确定这是否是正确的方法。