【问题标题】:Spring Security 3.2.7 HttpServletRequest.isUserInRole(String) does not automatically add "ROLE_" prefixSpring Security 3.2.7 HttpServletRequest.isUserInRole(String) 不会自动添加“ROLE_”前缀
【发布时间】:2015-07-20 16:59:18
【问题描述】:

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

参考 Spring 文档

3.1.3。 HttpServletRequest.isUserInRole(String)

HttpServletRequest.isUserInRole(String) 将确定 SecurityContextHolder.getContext().getAuthentication().getAuthorities() 是否包含 GrantedAuthority,其角色传递给 isUserInRole(String)。

通常用户不应将“ROLE_”前缀传入此方法,因为它是自动添加的。例如,如果要确定当前用户是否具有“ROLE_ADMIN”权限,可以使用以下命令:

boolean isAdmin = httpServletRequest.isUserInRole("ADMIN");

这可能有助于确定是否应显示某些 UI 组件。例如,您可能仅在当前用户是管理员时才显示管理员链接。

但是,当我尝试时,我发现 httpServletRequest.isUserInRole("ADMIN");返回 false,而 httpServletRequest.isUserInRole("ROLE_ADMIN");返回真。

调用 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>

【问题讨论】:

    标签: java spring spring-security


    【解决方案1】:

    我已经找到了解决方案。通过比较 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

    私有字符串 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;
        }
    }
    

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

    【讨论】:

    • 对于spring security 4.1,可以在configure(HttpSecurity http)方法中使用http.servletApi().rolePrefix("")将该前缀设置为空。
    猜你喜欢
    • 2012-01-09
    • 2016-01-17
    • 2020-06-10
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2017-06-28
    • 2022-11-17
    相关资源
    最近更新 更多