Session 如何在会话中存储用户ID,以便下一个资源能够在SpringSecurity中访问它

Session 如何在会话中存储用户ID,以便下一个资源能够在SpringSecurity中访问它,session,spring-security,Session,Spring Security,我正在使用Spring安全性进行Spring+struts2+hibernate集成以进行身份验证。以下是application security.xml文件: <http> <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" /> <intercept-url pattern="/**" filters="none" /> <form

我正在使用Spring安全性进行Spring+struts2+hibernate集成以进行身份验证。以下是
application security.xml
文件:

<http>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" filters="none" />
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/>
    <logout logout-success-url="/logged_out.jsp" />
</http>
调试了一个代码,发现当请求转发到
/homePage.action
时,
SecurityContextHolder
值被清除

有没有办法让这个
userid
可用于
homepage.action

我搜索了很多,但没有最终确定。似乎我必须编写一些定制的过滤器实现,并将其挂接到spring安全过滤器链中(以便会话管理仅在spring级别完成)


有人能给点建议吗

有几件事你必须考虑:

首先,您必须从最小到最大设置过滤器。因为如果有一个筛选器与请求匹配,则忽略其余筛选器。查看配置中的问题

Second,如果身份验证成功完成,
SecurityContextHolder
surly将包含当前用户的
UserDetails
。因此,身份验证可能存在问题


Third,在
UserDetails
中没有
userId
属性。(我假设你的意思不是
username
)所以如果你想要他的ID,你是否必须拥有自己的类来扩展
UserDetails
,并在其中放入
userId
属性,或者在
USER
表中查找(使用
UserDetails.getUsername
)并检索他的ID。

我更改了
application security.xml
文件(如下所示), 现在问题似乎已经解决了。
主要变化来自

<intercept-url pattern="/**" filters="none" /> 

致:





我认为,如果用户已正确验证,则不应清除SecurityContextHolder值。filters=“none”用于所有URL?SecurityContextHolder在用户成功身份验证后保留UserDetails。filters=“none”因为所有URL都会导致跳过spring安全性,因此我们无法调用任何与安全性相关的方法。您可能应该在问题中澄清为什么需要登录表单,而需要完全不安全的应用程序。此外,此配置将绕过登录提交URL。你真的能登录吗?当你提交登录表单时,你没有得到404吗?这实际上不是真的。在Spring Security 3.0中,在
拦截url
设置中使用
filters=“none”
与访问限制无关,因此顺序无关紧要。此外,如果请求绕过安全链(如此处所述),则无论用户是否已成功通过身份验证,
SecurityContextHolder
将不包含任何内容。您好,我更改的application-security.xml如下所示,前一个是错误的。
<intercept-url pattern="/**" filters="none" /> 
<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />  
<http>
    <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/inputUser.action" access="ROLE_ADMIN" />
    <intercept-url pattern="/getDeleteUsers.action" access="ROLE_ADMIN" />

    <intercept-url pattern="/login-fail.jsp" filters="none" />  
    <intercept-url pattern="/logged_out.jsp" filters="none" />   

    <intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />  
    <form-login login-page="/login.jsp" default-target-url="/homePage.action" authentication-failure-url="/login-fail.jsp"/>

    <logout logout-success-url="/logged_out.jsp"/>
</http