【发布时间】:2019-01-08 11:14:18
【问题描述】:
我正在使用 ThymeLeaf 模板移植应用程序以使用 Mustache 模板,但我没有找到移植 ThymeLeaf 的 sec:authorize 标记的好方法。有没有办法像 Thymeleaf Spring Security extras 提供的那样在 Mustache 中获取 SecurityContext 信息?
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity4</artifactId>
</dependency>
我以为我可以使用@ControllerAdvice 来注入这样的模型属性,但SecurityContextHolder.getContents().getAuthentication() 为空。但是,我可以很好地检查 HttpServletRequest 对象上的角色。这似乎是一个时间问题,因为在我的主要@Controller 中,我能够访问Authentication 对象。我可以提取主体名称,isAuthenticated() 返回正确的值。这是我尝试使用@ControllerAdvice:
package com.example;
import java.util.Map.Entry;
import java.util.stream.Stream;
import javax.servlet.http.HttpServletRequest;
import org.example.security.entity.UserRole;
import org.example.security.entity.UserRole.Role;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice
public class TemplateAdvice {
private static String ANONYMOUS_USER = "anonymousUser";
private Authentication authentication;
private Object principal;
private String username;
private boolean isAuthenticated;
private boolean isAnonymous;
private HttpServletRequest request;
public TemplateAdvice() {
this.authentication = SecurityContextHolder.getContext()
.getAuthentication();
if (this.authentication != null) {
this.principal = this.authentication.getPrincipal();
this.username = this.authentication.getName();
}
this.isAnonymous = this.principal == null
|| this.username.equals(ANONYMOUS_USER);
}
@ModelAttribute
public void addDefaultAttributes(HttpServletRequest request,
Model model) {
this.request = request;
model.addAttribute("isAuthenticated", this.authentication.isAuthenticated());
model.addAttribute("isAnonymous", this.isAnonymous);
model.addAttribute("username", this.username);
model.addAttribute("isAuthenticated", hasAnyRole()); // hack
model.addAttribute("isAdminOrSuper",
hasRole(UserRole.Role.ADMIN)
|| hasRole(UserRole.Role.SUPER)); // this works
}
private boolean hasRole(Role role) {
return this.request.isUserInRole(role.name());
}
private boolean hasAnyRole() {
return Stream.of(UserRole.Role.values())
.anyMatch(role -> hasRole(role));
}
}
我正在通过使用拉出contextPath 和_csrf.token,
spring.mustache.expose-request-attributes=true
spring.mustache.request-context-attribute=req
并希望可以类似地公开一些安全上下文。
我在 Google 上找不到很多示例。有没有一种检查用户是否经过身份验证以及他们在 Mustache 模板中的角色的好方法?
【问题讨论】:
标签: java spring-security thymeleaf mustache