Spring security Login 不会将我的表单(POST)传播到控制器

Posted

技术标签:

【中文标题】Spring security Login 不会将我的表单(POST)传播到控制器【英文标题】:Spring security Login does NOT propagate my form(POST) to Controller 【发布时间】:2019-02-19 03:27:47 【问题描述】:

在主页上(permitAll())

我有一个表单(Action "/saveX" authenicated())

我有一个带有 @PostMapping(value="/saveX") 的控制器

用户填写表单数据并点击提交 (POST)

Spring 重定向到默认登录页面

用户输入用户名和密码并点击登录

用户现在可以看到主页(登录功能现在可见)

期待 Spring(成功)登录转发到我的 (@PostMapping)Controller

现在用户已登录

用户填写表单数据并点击提交 (POST)

调用带有@PostMapping(value="/saveX") 的控制器

问题 不应该成功登录导致继续原始操作(即我的表单 POST)

注意 - 会有很多路径可能是验证用户的第一个原因 --- 所以我不会有可以使用的默认成功登录链接

在继续实施更复杂的身份验证机制之前,我想整理这些基础知识 - 所以稍后将替换 Spring 默认登录

非常感谢任何帮助/提示

【问题讨论】:

【参考方案1】:

您可以通过实现 AuthenticationSuccessHandler 来做到这一点,并且需要扩展 SimpleUrlAuthenticationSuccessHandler 这将为您提供重定向决策的选项。

public class RefererRedirectionAuthenticationSuccessHandler 
  extends SimpleUrlAuthenticationSuccessHandler
  implements AuthenticationSuccessHandler 

    public RefererRedirectionAuthenticationSuccessHandler() 
        super();
        setUseReferer(true);
    


在 Spring Security 配置文件中,您需要使用 successHandler() 方法注册您的 AuthenticationSuccessHandler。

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception 
        //put your logic here
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
      .authorizeRequests()
      .antMatchers("/login*")
      .permitAll()
      .anyRequest()
      .authenticated()
      .and()
      .formLogin()
      .successHandler(new RefererAuthenticationSuccessHandler());
    

【讨论】:

已进行两项更改 - 现在登录将用户带到登录页面(而不是之前的主页)

以上是关于Spring security Login 不会将我的表单(POST)传播到控制器的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot & Spring security 总是重定向到 Login

Spring-security /login 重定向

如何在 Grails/Spring Security 插件中禁用 /login/auth

spring security 改变 spring_security_login 表单

spring-security login?logout 重定向到登录

如何禁用 Spring Security 的登录屏幕? [复制]