【问题标题】:Accessing Spring Security Threadlocal user information from outside of spring security从 Spring Security 外部访问 Spring Security Threadlocal 用户信息
【发布时间】:2012-02-28 04:55:29
【问题描述】:
【问题讨论】:
标签:
java
spring
api
spring-security
thread-local
【解决方案1】:
在这里发布我自己的解决方案,以防对其他人有用。
Spring security(默认情况下)确实将用户信息存储在 Threadlocal 变量中,但是 common-api 将无法访问它,除非它添加了 spring-security 依赖项 - 如果这样做,用户信息可以使用以下 sn-p 访问(假设您在同一个线程中执行):
SecurityContext secureContext = SecurityContextHolder.getContext();
Authentication auth = secureContext.getAuthentication();
Object principal = auth.getPrincipal();
String userName = null;
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
userName = userDetails.getUsername();
} else {
userName = principal.toString();
}
但是我实现的解决方案不同,因为我不想将 Spring Security 引入 common-api 项目,并且我不能总是依赖 Spring Security 作为 API 的用户。因此,我在 common-api 中创建了一个 Singleton bean,其中包含我自己定义的 ThreadLocal 变量,这些变量可以从其他项目中设置并从 common-api 项目中访问(同样,假设它们在同一个线程中运行)。
代码片段:
public class CommonAPIThreadLocalStorageManager {
private static CommonAPIThreadLocalStorageManager instance;
// Typical singleton private constructor, static getInstance here
private ThreadLocal<String> userID = new ThreadLocal<String>();
public String getUserID() {
return userID.get();
}
public void setUserID(String userID) {
this.userID.set(userID);
}