首页 文章

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

提问于
浏览
0

我正在研究Spring Security,我正在使用Spring Security 3.2.7并且对servlet集成功能有疑问

请参阅Spring文档

3.1.3 . HttpServletRequest.isUserInRole(String)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 回答

  • 2

    我找到了解决方案 . 通过比较Spring Security 3.2.7和4.0.1之间的类 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper 的源代码,我发现在4.0.1中,属性 rolePrefix 初始化为值"ROLE_"但不在3.2.7中 .

    Spring Security 3.2.7

    private final String rolePrefix;

    Spring Security 4.0.1

    private String rolePrefix =“ROLE_”;

    因此,似乎没有为Spring Security 3.2.7自动添加前缀“ROLE_”

    通过Migrating from Spring Security 3.x to 4.x (XML Configuration)中的示例,我创建了一个BeanPostProcessor来将"ROLE_"设置为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;
        }
    }
    

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

相关问题