当我像这样配置spring security时
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Bean
public UserDetailsService userDetailsService(){
return new MyUserDetailsService();
}
@Bean
public MyAuthenticationProvider myAuthenticationProvider(){
MyAuthenticationProvider provider = new MyAuthenticationProvider();
provider.setUserDetailsService(userDetailsService());
return provider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
// TODO Auto-generated method stub
http
.csrf()
.disable()
.authorizeRequests()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
}
然后我像这样配置我的控制器
@GetMapping("/login")
public String showLoginPage(){
System.out.println("GetMapping");
return "login";
}
@PostMapping("/login")
public void authUser(@RequestParam String username,@RequestParam String password){
// just for testing
System.out.println("PostMapping");
}
然后我访问我的登录页面并输入我的用户名和密码,但控制台不会打印"PostMapping"
,这意味着程序不会进入我的方法"authUser"
{{1 }}
虽然我的程序运行成功,但它让我很困惑。我认为spring security会自动完成一些工作,但现在我不知道在哪里将我的Authentications添加到SecurityContextHolder。
我希望有人可以提供帮助,非常感谢
答案 0 :(得分:0)
它由UsernamePasswordAuthenticationFilter
完成,默认处理路径为Post /login
,而Authentication
中已存在SecurityContextHolder
,您可以在控制器中获取它。
如果要禁用表单登录,请更改为此。
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated().and()
.formLogin().disable();
答案 1 :(得分:0)
通常,POST 映射由 CSRFfilters 过滤。虽然在生产环境中不推荐使用,但是可以简单的用于学习案例禁用CSRF过滤器:
http.authorizeRequests().anyRequest().authenticated().and().httpBasic()
.and().logout()
.and().csrf().disable();