为什么春天的安全让春天mvc的postmapping控制器不起作用

时间:2016-12-29 04:52:26

标签: spring-mvc spring-security

当我像这样配置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。

我希望有人可以提供帮助,非常感谢

2 个答案:

答案 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();