使用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
相关产品推荐
相关产品推荐

