当前位置: 首页 > 知识库问答 >
问题:

Spring Security 3.2.7HttpServletRequest.ISUserInRole(String)不自动添加“role_”前缀

张鹏鹍
2023-03-14

我正在学习Spring Security并使用Spring Security 3.2.7,对servlet集成特性有疑问

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

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

boolean isAdmin=httpServletRequest.isUserInRole(“admin”);

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

<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个答案

秦楚
2023-03-14

我已经找到了解决办法。通过比较Spring Security 3.2.7和4.0.1之间org.springframework.Security.web.servletapi.securityContextHolderAwareRequestWrapper类的源代码,我发现在4.0.1中,rolePrefix属性的初始化值为“role_”,而在3.2.7中不是这样。

Spring安全3.2.7

私有最终字符串RolePrefix;

在从Spring Security 3.x迁移到4.x(XML配置)的示例中,我创建了一个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;
    }
}

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

 类似资料:
  • 问题内容: 我的Web安全配置中包含以下代码: 因此,我在数据库中添加了一个具有“ ADMIN”角色的用户,并且尝试与此用户登录时总是收到403错误,然后为spring启用了日志功能,并发现以下行: 为什么Spring Security在寻找“ ROLE_ADMIN”而不是“ ADMIN”? 问题答案: 在Spring 4中,有两个方法,并且在类中定义。这两种方法仅检查你的自定义角色名称,而不添加

  • 我的Web安全配置中有以下代码: 因此,我在数据库中添加了一个具有“admin”角色的用户,当我使用该用户进行登录时,总是会出现403错误,然后我启用了spring的log,并发现了这一行: 为什么Spring Security要查找“role_admin”而不是“admin”?

  • 问题内容: 我有一些代码: 我正在尝试通过使用JSON来应用这样的行(如jQuery文档中所示)或完全删除供应商前缀版本来改善此类行。 更改元素上的CSS属性时,jQuery的方法是否自动应用任何必需的供应商前缀? 问题答案: 正如@zeroflagL所写,自jQuery1.8.0起确实添加了浏览器特定的前缀。 在早期版本中,jQuery不会自动完成此操作。您将必须自己完成操作,也可以使用jQue

  • 问题内容: 我正在开发一个项目,通过添加Hibernate批注来保留一些POJO。我遇到的一个问题是这样的代码失败,因为Hibernate尝试将内的子字段映射到同一列上(即,两者都试图映射到colum ,从而导致错误)。 由于会有很多出现这样在整个系统中,这将是很好,如果有一个选项来自动添加一个前缀列的名称(例如使列是,,,),而不必基于每个应用覆盖领域基础。Hibernate是否具有此功能,或者

  • 问题内容: 在MySQL中,是否可以在自动递增前面附加一个字母。我的数据库中有几个表,其中一些表具有通过自动增量创建的唯一ID。我希望能够通过前面的字母来区分自动生成的数字。 这不是绝对必需的功能,但只会帮助简化小型任务。 问题答案: 不幸的是你不能那样做。至少不是在sql中。自动增量字段是整数类型,因此在其中添加字母会违反约束。 我希望这可以引导您朝正确的方向发展。

  • 问题内容: 我正在开发一个项目,其中通过添加Hibernate批注来保留一些POJO。我遇到的一个问题是,这样的代码失败了,因为Hibernate尝试将内的子字段映射到同一列上(即,两者都试图映射到colum ,从而导致错误)。 由于会有很多出现这样在整个系统中,这将是很好,如果有一个选项来自动添加一个前缀列的名称(例如使列是,,,),而不必基于每个应用覆盖领域基础。Hibernate是否具有此功