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 集成包