我想用带有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();
}
但我不知道这会不会奏效。有人能给那个案子提些建议吗?
服务验证令牌后,您可以解析它,并将其放入securitytext,它可以包含各种数据,因此您必须根据需要照顾它。例如,主题包含用户名等...
SecurityContextHolder.getContext().setAuthentication(userAuthenticationObject);
SecurityContextHolder的上下文维护一个ThreadLocal条目,因此您可以在问题中编写它的同一线程上访问它。请注意,如果使用反应式(webflux)方法,则必须将其放在反应式上下文中。
SecurityContextHolder、SecurityContext和身份验证对象
默认情况下,SecurityContextHolder
使用ThreadLocal
来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法。如果在处理当前主体的请求后注意清除线程,以这种方式使用ThreadLocal
是非常安全的。当然,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()
.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 响应字段说明 参