相关疑难解决方法(0)

Spring security的SecurityContextHolder:会话或请求绑定?

Userprincipal是否从SecurityContextHolder绑定到请求或会话中检索?

UserPrincipal principal = (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

这是我访问当前登录用户的方式.如果当前会话被销毁,这会失效吗?

java spring spring-security java-ee

60
推荐指数
1
解决办法
4万
查看次数

如何自定义SecurityContextPersistenceFilter的行为?

我开发了一个使用基于令牌的身份验证的无状态REST API,我通过SecurityContextHolder.getContext().setAuthentication(authentication)在自定义安全过滤器中调用,手动将Authentication对象添加到安全上下文.我一直遇到上下文没有正确设置的问题,我认为是由于这个原因:

在请求之间存储SecurityContext

在单个会话中接收并发请求的应用程序中,将在线程之间共享相同的SecurityContext实例.即使正在使用ThreadLocal,它也是从HttpSession为每个线程检索的相同实例.如果您希望临时更改运行线程的上下文,则会产生影响.如果您只使用SecurityContextHolder.getContext(),并对返回的上下文对象调用setAuthentication(anAuthentication),则Authentication对象将在共享同一SecurityContext实例的所有并发线程中更改....

您可以自定义SecurityContextPersistenceFilter的行为,为每个请求创建一个全新的SecurityContext,防止一个线程中的更改影响另一个线程.

所以问题是 - 你如何改变SecurityContextPersistenceFilter的行为?

我希望安全上下文不与http会话相关联,但不希望将会话创建策略设置为无状态,因为我仍然希望实现CSRF保护等.

multithreading spring-security security-context servlet-filters spring-boot

12
推荐指数
1
解决办法
599
查看次数