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

Authentication spring security 3.1允许用户签名并进入受限页面,authentication,spring-security,Authentication,Spring Security,我使用SpringSecurity3.1进行身份验证,登录工作正常。当用户注册时,我希望用户无需登录即可进入受限页面 在stackoverflow上有几个类似的问题,答案略有不同,我已经尝试过这些问题,但似乎没有什么对我有用。以下是我的安全配置: <http pattern="/resources/**" security="none" /> <http pattern="/login" security="none" /> <http patter

我使用SpringSecurity3.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();
setDetails(新的WebAuthenticationDetails(请求));
Authentication auth=authenticationManager.authenticate(upaToken);
SecurityContextHolder.getContext().setAuthentication(upaToken);
返回“重定向:”;
将显示登录页面,而不是重定向到受限页面。我错过了什么


我还希望避免调用来验证用户。这似乎没有必要,因为用户刚刚注册。但是删除它似乎不会改变任何事情。

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

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

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

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

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

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

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

...

一般来说,最好为每个URL保留可用的spring安全过滤器链,不要手动重写其功能。

您的注册控制器(包含显示的代码)映射到哪个URL?它映射到/user/createAccount。谢谢!在会话中保存上下文是缺少的。不必对JSSessionID做任何事情。我想我无法避免身份验证部分。在SO的其他地方,有人说在Spring SecurityContext中保存UsernamePasswordAuthenticationToken就足够了,但它似乎不够。对于当前请求,它会这样做,然后当下一个请求到来时,Spring security将在会话中查找经过身份验证的上下文,如果找不到,将重定向回登录页面
<http>
    <intercept-url pattern="/user/createAccount" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/**" access="ROLE_USER" /> 
    ...
</http>