spring security 3.1允许用户签名并进入受限制的页面

时间:2013-06-10 02:39:04

标签: authentication spring-security

我正在使用Spring Security 3.1进行身份验证,登录正常。当用户注册时,我希望用户无需登录即可继续访问受限页面。

在stackoverflow上有几个类似的问题,答案略有不同,我试过这些,但似乎没有什么对我有用。这是我的安全配置:

<http pattern="/resources/**" security="none" />       
<http pattern="/login" security="none" /> 
<http pattern="/user/forgotPassword" security="none" />
<http pattern="/user/createAccount" security="none" />
<http>
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    <form-login login-page="/login" default-target-url="/defaultUrl"
        always-use-default-target="true"
        authentication-failure-url="/loginfailed" />
</http>

这是我的代码(在用户创建并添加到数据库之后):

UsernamePasswordAuthenticationToken upaToken = new UsernamePasswordAuthenticationToken(user.getName(), user.getPassword());
request.getSession();
upaToken.setDetails(new WebAuthenticationDetails(request));
Authentication auth = authenticationManager.authenticate(upaToken);
SecurityContextHolder.getContext().setAuthentication(upaToken);

return "redirect:<restricted-page>";

不显示重定向到受限页面,而是显示登录页面。我错过了什么?

我还想避免对用户进行身份验证的调用。这似乎是不必要的,因为用户刚刚注册了。但删除它似乎并没有改变任何东西。

2 个答案:

答案 0 :(得分:1)

您需要将上下文保存到会话中

HttpSession session = request.getSession();
session.setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());

如果未设置JSESSIONID cookie,则需要将其设置为会话ID

答案 1 :(得分:1)

问题的根本原因是,由于以下规则,您的/ user / createAccount URL未被Spring安全过滤器覆盖:

<http pattern="/user/createAccount" security="none" />

其中一个Spring Security过滤器可以自动在请求之间保留SecurityContext。不要进行低级会话操作,最好为/ user / createAccount启用过滤器链,并允许任何用户访问此URL。您可以使用以下语法执行此操作:

<http>
    <intercept-url pattern="/user/createAccount" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    ...
</http>

一般情况下,最好为每个URL留下工作弹簧安全过滤器链,不要手动重写其功能。