1

我正在使用 Spring Security 进行 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时,我无法进入userid课堂homePage.action(struts 中的动作类)。

下面是代码:

UserDetails userDetails = (UserDetails)
  SecurityContextHolder.getContext().getAuthentication().getPrincipal();

调试了一段代码,发现当请​​求转发到时/homePage.actionSecurityContextHolder值被清除。

有什么办法可以让课堂userid可用吗?homepage.action

我已经搜索了很多,但无法最终确定。似乎我必须编写一些自定义过滤器实现并挂钩到弹簧安全过滤器链(以便会话管理仅在弹簧级别完成)。

谁能给点指点?

4

2 回答 2

0

我更改了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

在 spring security 中,SecurityContextHolder被填充SecurityContextPersistenceFilter,因此它应该通过 spring security 过滤器链。(filters="none"正如卢克所指出的那样,在这里不起作用)。

添加<intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER" />
确保当请求进行时应用弹簧过滤器链login-submission并且homePage.action

于 2012-08-22T09:12:18.623 回答
0

您必须考虑几件事:

首先,您必须将过滤器从最小到最大。因为如果有一个过滤器匹配请求,其余过滤器将被忽略。看你配置的问题

其次,如果认证成功,SecurityContextHoldersurly 会包含当前用户的UserDetails. 所以身份验证可能有问题

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

于 2012-08-15T11:02:01.673 回答