我想使用带有Spring Security5的Keyclock服务器来实现这个example。
我将使用带有JWT令牌的OAuth2.0身份验证。我感兴趣的是如何让当前登录的用户进入Rest端点?
我已经将Spring Security配置为不使用http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);存储用户会话。
一种可能的方法是使用以下代码:
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
String username = ((UserDetails)principal).getUsername();
} else {
String username = principal.toString();
}但我不知道它会不会起作用。有人能为这种情况提供一些建议吗?
发布于 2020-07-02 23:26:16
默认情况下,SecurityContextHolder使用ThreadLocal来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法。以这种方式使用ThreadLocal是quite safe if care is taken to clear the thread after the present principal’s request is processed。当然,Spring Security会自动为您处理此问题,因此无需担心。
SessionManagementConfigurer由isStateless()方法组成,该方法为无状态策略返回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());
}sessionManagement
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)您可能想探索一下Methods with Spring Security to get current user details with SessionCreationPolicy.STATELESS
发布于 2020-07-02 23:19:26
在服务验证令牌之后,您可以解析它,并将其放入securitycontext中,它可以包含各种数据,因此您必须照看它。例如,主题包含用户名等...
SecurityContextHolder.getContext().setAuthentication(userAuthenticationObject);SecurityContextHolder的上下文维护一个ThreadLocal条目,因此您可以在问题中编写它的同一线程上访问它。请注意,如果使用反应式(webflux)方法,则必须将其放入反应式上下文中。
https://stackoverflow.com/questions/62699068
复制相似问题