You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring Security时如何向登录页传递查询参数且避免405错误

问题根因

你遇到的两个问题本质是同一配置错误导致的:

  • Spring Security的formLogin配置中,如果仅设置loginPage没有显式指定loginProcessingUrl,默认会把loginPage的地址作为登录表单提交的目标地址,且要求请求方法为POST
  • 你的/index接口只声明了@GetMapping,仅支持GET请求,所以登录时提交的POST请求直接被拦截返回405,根本没有进入认证流程,自然不会调用UserDetailsService

解决方案

修改Spring Security配置,显式指定登录请求的处理地址即可,该地址无需自己实现Controller,由Spring Security自动处理:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/pages/user/**").hasRole("CLIENT")
            .antMatchers("/pages/admin/**").hasRole("ADMIN")
            .antMatchers("/pages/guest/**").permitAll()
            .antMatchers("/*").permitAll()
            .and().formLogin()
            .loginPage("/index?showDialog=true")
            // 新增这一行,指定登录表单提交的地址,可自定义
            .loginProcessingUrl("/doLogin")
            .permitAll()
            .usernameParameter("login")
            .passwordParameter("psw")
            .and()
            .logout()
            .permitAll()
            .logoutSuccessUrl("/");
}

同时修改登录弹窗内的表单配置:

  • 表单method设置为POST
  • 表单action设置为上面配置的/doLogin
  • 如果没有关闭CSRF防护(Spring Security默认开启),需要在表单内添加CSRF参数隐藏域:
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>

如果不需要CSRF防护,也可以在配置中添加关闭配置(不推荐生产环境使用):

http.csrf().disable();

内容的提问来源于stack exchange,提问作者DozezQuest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:18:03