Доступ к информации пользователя Spring Security Threadlocal из-за пределов безопасности Spring - PullRequest
0 голосов
/ 06 февраля 2012

У меня есть несколько проектов, которым нужно передать информацию о входе пользователя в проект common-api, который они вызывают.Common-api не имеет учетных данных пользователя, передаваемых через вызовы методов, поэтому я надеюсь сделать эту информацию доступной через переменные Threadlocal.

Первый такой проект, которому необходимо сделать эту информацию доступным, - это rest-web-service-api, который использует Spring Security и находится поверх моего проекта common-api.

Я вижу, что Spring Security хранит информацию о пользователе в переменной ThreadLocal ... isЕсть ли способ получить доступ к этому из проекта Common-API, не обязательно знать, что Spring Security это кто?Я совершенно не знаком с Spring Security и новичком в использовании Threadlocals, поэтому любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 11 февраля 2012

Публикация моего собственного решения на случай, если оно пригодится кому-то еще в будущем.

Spring security (по умолчанию) фактически хранит информацию о пользователе в переменной Threadlocal, ноcommon-api не будет иметь к нему доступа, пока не добавит зависимость безопасности пружины - если это так, к пользовательской информации можно получить доступ (при условии, что вы выполняете в том же потоке), используя следующий фрагмент:

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.Итак, я создал bean-компонент Singleton в common-api, который содержит мои собственные определенные переменные 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);
    }
...