当前位置: 首页 > 知识库问答 >
问题:

当SessionCreationPolicy启动时,从Spring获取当前登录用户。使用无状态

公冶才
2023-03-14

我想用带有Spring Security 5的Keyclock服务器实现这个示例。

我将使用OAuth2。0使用JWT令牌进行身份验证。我感兴趣的是如何让当前登录的用户进入Restendpoint?

我已将Spring Security配置为不使用http存储用户会话。会话管理()。sessionCreationPolicy(sessionCreationPolicy.STATELESS)

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

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

但我不知道这会不会奏效。有人能给那个案子提些建议吗?


共有2个答案

吕俊哲
2023-03-14

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

SecurityContextHolder.getContext().setAuthentication(userAuthenticationObject);

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

葛成双
2023-03-14

SecurityContextHolder、SecurityContext和身份验证对象

默认情况下,SecurityContextHolder使用ThreadLocal来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法。如果在处理当前主体的请求后注意清除线程,以这种方式使用ThreadLocal是非常安全的。当然,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());
    }

会话管理

.sessionManagement()
     .sessionCreationPolicy(SessionCreationPolicy.STATELESS)

您可能希望探索使用Spring Security的方法,以使用SessionCreationPolicy获取当前用户的详细信息。无国籍

 类似资料:
  • sp_get_current_userid() 功能: 获取当前登录用户ID 参数: 无 返回: int,当前登录的用户id,如果未登录返回0

  • sp_get_current_user() 功能: 获取当前登录用户信息,包括users表里详细信息; 参数: 无 返回: 数组,用户包括users表里详细信息

  • 接口说明 获取当前登录用户的ID 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /usercenter/api/userinfo/v1.0.0/getLoginUserId 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 是 当前登录用户的TOKEN 响应字段说明 参数

  • 接口说明 获取当前登录用户的ID 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 如开启https功能,请求地址的协议应改为https,如:https://www.example.com/wish3dearth/api/access/v1.0.0/getLicenseInfo API地址 GET /usercenter/api/userinfo/v1.0

  • 我正在构建一个jhipster应用程序。我正在尝试获取一个基于当前登录用户的对象列表。在线上有几个简单的例子,比如jhipster博客演示,描述了如何通过当前登录用户获取当前用户的博客--我想模仿一下。在演示中有一种回购方法: 我尝试用以下方法来模拟:

  • 接口说明 获取当前登录用户的信息 如需调用,请访问 开发者文档 来查看详细的接口使用说明 该接口仅开放给已获取SDK的开发者 API地址 GET /usercenter/api/userinfo/v1.0.0/getLoginUserInfo 是否需要登录 是 请求字段说明 参数 类型 请求类型 是否必须 说明 token string header 是 当前登录用户的TOKEN 响应字段说明 参