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:真;授予权限:管理员
第二个标签不输出任何内容。
【问题讨论】:
我猜是<security:intercept-url pattern="/**" access="denyAll" />
这个代码导致错误。
@Amitsingh 我尝试删除它...但仍然是同样的错误
请出示您的 Authentication Manager 和 UserDetailsService
@shazin 我更新了帖子。我使用的是spring默认身份验证,是否必须实现 UserDetailsService ?
您的 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
表中。
【讨论】:
登录的用户是否有管理员角色? 是的,我已经打印出<sec:authentication property="principal.authorities"/>
显示您访问的完整 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无法正常工作?