【问题标题】:Accessing Spring Security Threadlocal user information from outside of spring security从 Spring Security 外部访问 Spring Security Threadlocal 用户信息
【发布时间】:2012-02-28 04:55:29
【问题描述】:

我有多个项目需要将用户登录信息传递给他们调用的 common-api 项目。 common-api 没有通过方法调用传入的用户凭据,所以我希望通过 Threadlocal 变量提供这些信息。

第一个需要提供这些信息的项目是使用 Spring Security 的 rest-web-service-api 项目,它位于我的 common-api 项目之上。

I see that Spring Security stores the user information in a ThreadLocal variable... 有没有办法从 common-api 项目中访问它,而不必知道 Spring Security 是谁设置的?我对 Spring Security 和使用 Threadlocals 的新手非常不熟悉,因此我们将不胜感激。

【问题讨论】:

    标签: 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);
        }
    

    【讨论】:

      猜你喜欢
      • 2014-10-27
      • 2013-09-14
      • 2021-11-10
      • 2011-01-30
      • 2020-05-05
      • 2014-11-26
      • 2018-10-20
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多