gpt4 book ai didi

spring - 使用 SessionCreationPolicy.STATELESS 时从 Spring 获取当前登录用户

转载 作者:行者123 更新时间:2023-12-05 06:14:50 32 4
gpt4 key购买 nike

我想实现这个 example将 Keyclock 服务器与 Spring Security 5 结合使用。

我将使用带有 JWT token 的 OAuth2.0 身份验证。我对如何让当前登录的用户进入 Rest Endpoint 很感兴趣?

我已将 Spring Security 配置为不使用 http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); 存储用户 session 。

一种可能的方法是使用这段代码:

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}

但我不知道它是否会起作用。有人可以为这种情况提供一些建议吗?

最佳答案

SecurityContextHolder, SecurityContext and Authentication Objects

默认情况下,SecurityContextHolder 使用 ThreadLocal 来存储这些详细信息,这意味着安全上下文始终可用于 同一执行线程中的方法。以这种方式使用 ThreadLocal如果在处理当前委托(delegate)人的请求后注意清除线程 是非常安全的。当然,Spring Security 会自动为您处理此事,因此您无需担心。

SessionManagementConfigurerisStateless() 方法组成,该方法为无状态策略返回 true。基于该 http,将共享对象设置为 NullSecurityContextRepository 并用于请求缓存 NullRequestCache。因此 HttpSessionSecurityContextRepository 中将没有可用的值。因此,使用静态方法的用户可能不会遇到无效/错误详细信息的问题

代码:

        if (stateless) {
http.setSharedObject(SecurityContextRepository.class,
new NullSecurityContextRepository());
}

if (stateless) {
http.setSharedObject(RequestCache.class, new NullRequestCache());
}

代码:

获取用户详情的方法

    public static Optional<String> getCurrentUserLogin() {
SecurityContext securityContext = SecurityContextHolder.getContext();
return Optional.ofNullable(extractPrincipal(securityContext.getAuthentication()));
}

private static String extractPrincipal(Authentication authentication) {
if (authentication == null) {
return null;
} else if (authentication.getPrincipal() instanceof UserDetails) {
UserDetails springSecurityUser = (UserDetails) authentication.getPrincipal();
return springSecurityUser.getUsername();
} else if (authentication.getPrincipal() instanceof String) {
return (String) authentication.getPrincipal();
}
return null;
}


public static Optional<Authentication> getAuthenticatedCurrentUser() {
log.debug("Request to get authentication for current user");
SecurityContext securityContext = SecurityContextHolder.getContext();
return Optional.ofNullable(securityContext.getAuthentication());
}

session 管理

.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

您可能想探索 Methods with Spring Security to get current user details with SessionCreationPolicy.STATELESS

关于spring - 使用 SessionCreationPolicy.STATELESS 时从 Spring 获取当前登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62699068/

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