如何从会话范围 spring bean 访问登录的主体

How to access the logged-in Principal from a session scoped spring bean

我想从会话范围的 spring bean 访问登录用户,这可能吗?

我没有使用 spring 安全性,而是使用 openam 为我的 Web 应用程序提供安全性,所以我不能使用它(正如我在互联网上的许多示例中看​​到的那样):

(User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

是否可以将与您从中获得的名称相同的名称注入到我的会话范围的 bean 中:

HttpServletRequest.getUserPrincipal().getName()

您可以尝试创建一个拦截器并将登录用户设置为您的会话 bean 的 属性,它可以注入您的拦截器。

像这样:

public class SessionDataInitializerInterceptor extends HandlerInterceptorAdapter {

    private static final Logger LOG = Logger.getLogger(SessionDataInitializerInterceptor.class);

    @Autowired
    SessionData sessionData;

    public SessionDataInitializerInterceptor() {
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        Principal principal = request.getUserPrincipal();
        if (principal != null) {
            if (sessionData.getUser() == null) {
                sessionData.setUser(principal.getName());
            }
        } else {
            LOG.error(String.format("No user principal in request for url[%s]", request.getRequestURL().toString()));
        }
        return true;
    }

}

不要忘记将您的拦截器映射到适当的 URL。

这也有效:

@Component
@SessionScope
public class SessionData {

    @Autowired
    private HttpServletRequest request;

    @PostConstruct
    public void init() {
        Principal principal = request.getUserPrincipal();        
    }
}