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”?