如何从会话范围 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();
}
}
我想从会话范围的 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();
}
}