首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SessionCreationPolicy.STATELESS时从Spring获取当前登录用户

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

Stack Overflow用户
提问于 2020-07-02 22:49:33
回答 2查看 540关注 0票数 1

我想使用带有Spring Security5的Keyclock服务器来实现这个example

我将使用带有JWT令牌的OAuth2.0身份验证。我感兴趣的是如何让当前登录的用户进入Rest端点?

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

一种可能的方法是使用以下代码:

代码语言:javascript
复制
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
  String username = ((UserDetails)principal).getUsername();
} else {
  String username = principal.toString();
}

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

EN

回答 2

Stack Overflow用户

发布于 2020-07-02 23:26:16

默认情况下,SecurityContextHolder使用ThreadLocal来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法。以这种方式使用ThreadLocalquite safe if care is taken to clear the thread after the present principal’s request is processed。当然,Spring Security会自动为您处理此问题,因此无需担心。

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

代码:

代码语言:javascript
复制
        if (stateless) {
            http.setSharedObject(SecurityContextRepository.class,
                    new NullSecurityContextRepository());
        }

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

代码:

获取用户详细信息的方法

代码语言:javascript
复制
    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

代码语言:javascript
复制
.sessionManagement()
     .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

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

票数 1
EN

Stack Overflow用户

发布于 2020-07-02 23:19:26

在服务验证令牌之后,您可以解析它,并将其放入securitycontext中,它可以包含各种数据,因此您必须照看它。例如,主题包含用户名等...

代码语言:javascript
复制
SecurityContextHolder.getContext().setAuthentication(userAuthenticationObject);

SecurityContextHolder的上下文维护一个ThreadLocal条目,因此您可以在问题中编写它的同一线程上访问它。请注意,如果使用反应式(webflux)方法,则必须将其放入反应式上下文中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62699068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档