Spring security hasRole() 给出错误 403 - 访问被拒绝

Posted

技术标签:

【中文标题】Spring security hasRole() 给出错误 403 - 访问被拒绝【英文标题】:Spring security hasRole() giving Error 403 - Access is denied 【发布时间】:2016-04-27 23:50:38 【问题描述】:

我正在尝试查看只有管理员才能查看的特定页面,但每次我提出请求时都会收到错误消息。它似乎与我的安全上下文文件中的 hasRole() 有关。

错误只是说 HTTP 状态 403 - 当我请求查看管理 jsp 页面时访问被拒绝

安全上下文.xml:

<security:http use-expressions="true">
    <security:intercept-url pattern="/admin" access="hasAnyRole('admin')" />
    <security:form-login login-page="/login"
        authentication-failure-url="/login?error=true" />
    <security:logout logout-success-url="/loogedout" />
    <security:intercept-url pattern="/createoffer" access="isAuthenticated()" />
    <security:intercept-url pattern="/docreate" access="isAuthenticated()" />
    <security:intercept-url pattern="/offercreated" access="isAuthenticated()" />
    <security:intercept-url pattern="/" access="permitAll" />
    <security:intercept-url pattern="/loggedout" access="permitAll" />
    <security:intercept-url pattern="/newaccount" access="permitAll" />
    <security:intercept-url pattern="/createaccount" access="permitAll" />
    <security:intercept-url pattern="/accountcreated" access="permitAll" />
    <security:intercept-url pattern="/static/**" access="permitAll" />
    <security:intercept-url pattern="/login" access="permitAll" />
    <security:intercept-url pattern="/offers" access="permitAll" />
    <security:intercept-url pattern="/**" access="denyAll" />
</security:http>

我的数据库中的两个表是用户(用户名、电子邮件、启用、密码)和权限(用户名、权限)。

谁能建议我的错误是什么或如何解决?

【问题讨论】:

你能把详细的错误信息贴出来吗,没有它对你没有多大帮助。 @JasonZ 抱歉,我已经编辑了错误的帖子。 您是否以admin 登录? @JasonZ 是的,以管理员身份登录,我可以执行所有其他任务。 @您要访问的URL 是什么?是/admin吗? 【参考方案1】:

请确认当您以管理员身份登录时,您确实拥有管理员角色。 请查看以下代码的输出:getCurrentUser().getAuthorities(); 在允许所有人的任何流程中。 这将简单地列出您登录用户拥有的所有角色。

public UserInfo getCurrentUser() 
        UserInfo userInfo = null;
        SecurityContext securityContext = SecurityContextHolder.getContext();
        if (securityContext != null && null != securityContext.getAuthentication()) 
            Object principal = securityContext.getAuthentication().getPrincipal();
            if (UserInfo.class.isAssignableFrom(principal.getClass())) 
                userInfo = (UserInfo) principal;
            
        
        return userInfo;
    

【讨论】:

【参考方案2】:

默认情况下 spring 添加了 ROLE_ 前缀,因此将 hasAnyRole('admin') 更改为 hasAnyRole('ROLE_admin') 应该可以修复错误,除非您有自定义实现。

参考:

http://docs.spring.io/spring-security/site/docs/current-SNAPSHOT/apidocs/org/springframework/security/access/vote/RoleVoter.html

https://docs.spring.io/spring-security/site/docs/3.2.3.RELEASE/apidocs/org/springframework/security/core/userdetails/jdbc/JdbcDaoImpl.html#setRolePrefix(java.lang.String)

【讨论】:

以上是关于Spring security hasRole() 给出错误 403 - 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

如何对 Spring Security @PreAuthorize(hasRole) 进行单元测试?

Spring Security 中的 hasRole() 无法正常工作 [重复]

Spring Security 'Roles' 和 'Privileges' 和 Thymeleaf 'hasRole' 和 'hasAuthority'

如何使用 Spring Security 检查 Java 代码中的“hasRole”?

Spring Security with hibernate:hasRole() 在配置中不起作用

Spring Security中html页面设置hasRole无效的问题