gpt4 book ai didi

spring - 如何在使用 Redis session 存储的 Spring Boot 应用程序中获取当前主体

转载 作者:可可西里 更新时间:2023-11-01 11:14:59 29 4
gpt4 key购买 nike

我有许多 Spring Boot(1.5.3 版)微服务应用程序都共享一个 Redis session 存储。我在类路径上有以下依赖关系,用户能够登录并且他们的 session 存储在 Redis 中:

<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

每个微服务中的 Controller 端点使用@Preauthorize 注释来确保当前用户具有适当的授予权限来调用端点。安全性似乎设置正确,因为这些注释确实确保只有具有正确角色的用户才能调用。但是,我还需要将尝试调用端点的用户的名称输出到审计日志。为此,我有以下方法应将用户名作为字符串返回:

private String userDetailsString() {
StringBuilder buf = new StringBuilder();
SecurityContext context = getSecurityContext();
Authentication authentication = context.getAuthentication();
if(authentication != null) {
UserDetails principal = (UserDetails)authentication.getPrincipal();
buf.append("Requested by: ");
buf.append(principal.getUsername());
} else {
buf.append("Requested by: null");
}
return buf.toString();
}

protected SecurityContext getSecurityContext() {
return SecurityContextHolder.getContext();
}

但是,身份验证对象始终为空。为什么是这样?在此类应用程序中访问当前委托(delegate)人的首选方式是什么?请注意,此代码需要驻留在 Controller 类之外。

我猜@Preauthorize 注释背后的代码必须以某种方式访问​​此委托(delegate)人以确定它们是否具有适当的角色?

最佳答案

您可以使用 EventListener 来获得成功:AuthorizedEvent 或失败 AuthorizationFailureEvent

@EventListener(value = {AuthorizedEvent.class})
public void onApplicationEvent(AuthorizedEvent event) {
log.info("Authorization : {}", event.getAuthentication().getName());
}

关于spring - 如何在使用 Redis session 存储的 Spring Boot 应用程序中获取当前主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52374778/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com