sec:authorize 在 Spring 启动应用程序中使用 Thymeleaf 时未按预期工作
Posted
技术标签:
【中文标题】sec:authorize 在 Spring 启动应用程序中使用 Thymeleaf 时未按预期工作【英文标题】:sec:authorize not working as expected using Thymeleaf in a Spring boot application 【发布时间】:2018-12-10 19:26:38 【问题描述】:我正在尝试添加指向表中新行的链接,此链接应该只能由管理员角色访问。
弹簧靴:1.4.0.RELEASE & thymeleaf-extras-springsecurity4.version : 2.1.2.RELEASE
<sec:authorize access="hasRole('ROLE_ADMIN')">
<tr>
<td>...</td>
<td>...</td>
</tr>
</sec:authorize>
使用的命名空间是:
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
WebSecurityConfigAdapter:
http.authorizeRequests()
.antMatchers("/api/systemuser/*").access("hasRole('ROLE_ADMIN')")
//.antMatchers("/*").access("hasRole('ROLE_ADMIN')")
//.antMatchers("/ui/report/win").access("hasRole('ROLE_USER')")
//.antMatchers("/userError").access("hasRole('ROLE_ERROR')")
.antMatchers("/swagger*/**", "/about", "/").authenticated()
.anyRequest().authenticated()
.and()
.httpBasic()
.authenticationEntryPoint(authenticationEntryPoint)
;
http.csrf().disable();
但是使用此代码,即使没有 ADMIN 权限的用户也可以查看表的行。
有人可以帮助我前进吗?
【问题讨论】:
在执行(AuthenticationProvider.authenticate(...) 的过程中,您确定为用户添加正确的角色吗? 是的,我确定 你可以尝试去掉对.access()
的调用,直接使用hasRole("ADMIN")
方法。你也不应该再需要 ROLE_
前缀了。
他需要显示/隐藏一个html元素,即使去掉了access()他仍然有同样的必要性。
【参考方案1】:
它应该有效.. 我很确定您也将 ROLE_ADMIN 添加到该用户。 尝试调试呈现您使用标签的 jsp 的控制器,并从身份验证中获取您的主体对象
authentication.getPrincipal()
并遍历对象直到找不到GrantedAuthority,然后检查用户是否具有ROLE_ADMIN
【讨论】:
似乎多个依赖项之间存在版本冲突,这就是它不起作用的原因。现在可以正常使用了,谢谢。以上是关于sec:authorize 在 Spring 启动应用程序中使用 Thymeleaf 时未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot Security - Thymeleaf sec:authorize-url 不起作用
Spring Security Role Hierarchy 不适用于 Thymeleaf sec:authorize
<sec:authorize ifAnyGranted 或 ifAnyGranted 在 SPRING SECURITY 中不起作用
将 Spring Boot 1.5 升级到 2 <sec:authorize> 不起作用
Spring Security - Thymeleaf - 我可以在 sec:authorize 标签中评估 SPEL 表达式吗?
sec:authorize 不起作用 - Spring Boot 2、Thymeleaf 3、Thymeleaf Spring Security 5 集成包