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

Java hasRole()不工作错误Http状态403-访问被拒绝,java,spring-security,Java,Spring Security,以下是我的安全配置文件中的配置: <security:http use-expressions="true"> <security:intercept-url pattern="/adminarea" access="hasRole('admin')" /> <security:intercept-url pattern="/logincheck" access="permitAll" /> <se

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

<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>
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; 密码:[受保护];启用:真;AccountNoExpired:正确;无需证明的凭证:真实;AccountNonLocked:true;授权权限:管理员


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

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

  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
表中。

我通过将数据库中的角色设置为
role\u XXX
或在我的情况下设置为
role\u admin
解决了这个问题。然后使用以下代码:

安全配置:

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

JSP:


从我的实验中得到的。我想定义的角色需要大写,并且应该以
角色作为前缀


希望它能帮助任何遇到这个问题的人。

我猜是
这个代码导致了错误。@amitshigh我试图删除它…但仍然是相同的错误请显示您的身份验证管理器和UserDetailsService@shazin我更新了帖子。我使用的是spring默认身份验证,我必须实现UserDetailsService吗?您的spring安全版本是什么?如果其<4.x,您可以尝试hasRole('ROLE\u admin')或hasAuthority('ROLE\u admin')或大写ROLE\u admin登录的用户是否具有admin角色?是的,我已通过打印出
检查显示您访问的完整url,并且admin打印为带括号还是不带括号?让我们看看。
<security:intercept-url pattern="/adminarea"
        access="hasRole('ROLE_ADMIN')" />
<sec:authorize access="hasRole('ROLE_ADMIN')">
    <a href="${pageContext.request.contextPath}/adminarea">Admin Area</a>
</sec:authorize>