spring-security Spring.授权后一次性添加session属性

djmepvbi  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(138)

堆栈:Spring安全和Thymeleaf。
我有以下问题:我想根据用户的角色显示或不显示所有html模板中的某些元素。
因此,我需要一个布尔变量“isAdmin”在所有模板中,以便我可以使用它的条件:

<p th:if="${isAdmin}">Admin functionality</p>

请帮我找到最好的解决方案。我尝试过的:

**选项1。**我可以在所有控制器中向模型添加变量。但我认为这是一个不好的做法。
**选项2.**我可以直接从会话中使用“th:with”将变量注入到主体中:

<body th:with="isAdmin=
    ${session
    .SPRING_SECURITY_CONTEXT
    .getAuthentication()
    .getAuthorities()
    .contains(T(com.example.model.enums.Role).ADMIN)}">

但是声明太长了,我也没有在Thymeleaf中找到关于全局变量作用域的信息。

**选项3。**我知道我应该在用户会话中添加自定义属性。而且我应该在授权后只添加一次。我想不出比覆盖successForwardUrl更好的方法了,在新的控制器中添加属性并重定向到主页。

第一个
但我仍然认为这不是最好的解决办法。

s8vozzvw

s8vozzvw1#

看起来你在寻找最好的解决方案
Thymeleaf与Spring Security有着特殊的集成
您可以检查docs here
首先,您应该将org.thymeleaf.extras依赖项添加到项目中:

<dependency>
    <groupId>org.thymeleaf.extras</groupId>
    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

下一步:将Thymeleaf sec命名空间添加到.html模板:

<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">

最后,您可以检查用户角色并显示不同角色的具体内容:

<div sec:authorize="hasRole('ROLE_ADMIN')">
    <p>Admin functionality</p>
</div>

sec:authentication也可用于检索用户名和角色:

<div sec:authorize="isAuthenticated()">
    User: <span sec:authentication="name">User name</span>
    Roles: <span sec:authentication="principal.authorities">User roles</span>
</div>

相关问题