hasRole() 不工作错误 Http 状态 403 - 访问被拒绝

Posted

技术标签:

【中文标题】hasRole() 不工作错误 Http 状态 403 - 访问被拒绝【英文标题】:hasRole() not working error Http Status 403 - Access is denied 【发布时间】:2015-12-03 16:50:58 【问题描述】:

以下是我的安全配置文件中的配置:

<security:http use-expressions="true">
    <security:intercept-url pattern="/adminarea"
        access="hasRole('admin')" />
    <security:intercept-url pattern="/logincheck"
        access="permitAll" />
    <security:intercept-url pattern="/newaccount"
        access="permitAll" />
    <security:intercept-url pattern="/createnewaccount"
        access="permitAll" />
    <security:intercept-url pattern="/home"
        access="isAuthenticated()" />
    <security:intercept-url pattern="/static/**"
        access="permitAll" />
    <security:intercept-url pattern="/" access="permitAll" />
    <security:intercept-url pattern="/**" access="denyAll" />
    <security:form-login login-page="/"
        authentication-failure-url="/?error=true" default-target-url="/home" />
</security:http>

我正在使用 spring 默认登录,它工作正常。但是当我尝试访问/adminarea 时,我得到了Http Status 403 - Access is denied 错误。任何帮助。

已编辑:AuthenticationManager

<security:authentication-manager>
    <security:authentication-provider>
        <security:jdbc-user-service
            data-source-ref="dataSource" />
    </security:authentication-provider>
</security:authentication-manager>

JSP 上的代码:

<sec:authentication property="principal"/>
<sec:authorize access="hasRole('admin')">
    <a href="$pageContext.request.contextPath/adminarea">Admin Area</a>
</sec:authorize>

第一个标签输出如下

rg.springframework.security.core.userdetails.User@6d8e08d5:用户名:zubi@yahoo.com;密码保护];启用:真; AccountNonExpired:真;凭据非过期:真; AccountNonLocked:真;授予权限:管理员

第二个标签不输出任何内容。

【问题讨论】:

我猜是&lt;security:intercept-url pattern="/**" access="denyAll" /&gt;这个代码导致错误。 @Amitsingh 我尝试删除它...但仍然是同样的错误 请出示您的 Authentication Manager 和 UserDetailsS​​ervice @shazin 我更新了帖子。我使用的是spring默认身份验证,是否必须实现 UserDetailsS​​ervice ? 您的 Spring Security 版本是什么?如果它 【参考方案1】:

我通过将 DB 中的角色设置为 ROLE_XXX 或在我的情况下为 ROLE_ADMIN 来解决问题。然后使用以下代码:

安全配置:

<security:intercept-url pattern="/adminarea"
        access="hasRole('ROLE_ADMIN')" />

JSP:

<sec:authorize access="hasRole('ROLE_ADMIN')">
    <a href="$pageContext.request.contextPath/adminarea">Admin Area</a>
</sec:authorize>

从我的实验中得到它的工作。我想定义的角色需要在CAPITAL 中,并且应该以ROLE_ 为前缀。

希望对遇到此问题的人有所帮助。

【讨论】:

【参考方案2】:

我假设您已经创建了以下表格

  create table users(
      username varchar_ignorecase(50) not null primary key,
      password varchar_ignorecase(50) not null,
      enabled boolean not null);

  create table authorities (
      username varchar_ignorecase(50) not null,
      authority varchar_ignorecase(50) not null,
      constraint fk_authorities_users foreign key(username) references users(username));
      create unique index ix_auth_username on authorities (username,authority);

您的应用程序上下文 xml 中的上述身份验证管理器配置所要求的。

并且您已将角色 admin 插入到 authorities 表中。

【讨论】:

登录的用户是否有管理员角色? 是的,我已经打印出&lt;sec:authentication property="principal.authorities"/&gt; 显示您访问的完整 url,admin 打印是否带括号? 让我们continue this discussion in chat。

以上是关于hasRole() 不工作错误 Http 状态 403 - 访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security 授权标签 - HTTP 状态 500

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

Spring security 4 @PreAuthorize("hasRole()") 不起作用

Spring安全+ JWT +认证和hasRole无法正常工作?

Spring Security 保护路由 hasRole,hasAuthority 不适用于 CORS http 请求

Spring @Secured 和 @PreAuthorize 不能正常工作(总是状态 403)