Spring Security“转发:”指令无法转发到登录表单


问题内容

用户创建帐户后,我要自动登录该用户。

我有由Springs过滤器处理的标准表单登录/postlogin。如果我转到http://localhost/postlogin它,尝试登录我(由于未包含post参数而失败),但进行了适当的尝试。

但是,如果我想以编程方式登录用户,然后尝试从控制器返回:“ forward:/ postlogin”,则会收到404。

我假设forward:指令没有通过过滤器,因此没有被处理UsernamePasswordAuthenticationFilter

如何以编程方式手动诱导登录?我想在用户创建一个新帐户后执行此操作(注册完成后应立即将其登录到该帐户)。


问题答案:

我误读了另一条指南,并意识到正确的处理方法如下:

1)在SecurityContextHolder上手动设置身份验证令牌

    UsernamePasswordWithAttributesAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( loadUserByUsername(username), password, authorities );
    SecurityContextHolder.getContext().setAuthentication(authenticationToken);

2) 不要 在此时渲染页面,或使用forward:指令。您必须使用redirect:指令。

return "redirect:/accountcreated";

如果呈现页面,则页面将正常加载,但是会话对象将丢失,因为将创建新的j_session_id,但不会将其发送到浏览器中级请求,并且下一个请求将使用旧的j_session_id,从而失去了新会话对象和认证。

使用forward:指令将绕过身份验证过滤器,不好。

但是重定向:导致更新的会话信息进入浏览器。