Spring Security不允许资源

时间:2014-11-21 17:24:15

标签: spring-security spring-boot

我有配置

http.csrf().disable();
    http.authorizeRequests()
                    .antMatchers("/**").authenticated()
                    .antMatchers("/shutdown").permitAll()
                    .and().formLogin().passwordParameter("password").usernameParameter("username")
                    .and().formLogin().loginPage("/authentication.html").permitAll()
                    .and().formLogin().loginProcessingUrl("/login")
                    .and().formLogin().failureUrl("/authentication.html")
                    .and().formLogin().defaultSuccessUrl("/",false);

身份验证工作完美,但我无法在没有身份验证的情况下访问/关闭。这可能是什么原因?

/ shutdown - 弹簧启动的关闭钩。

3 个答案:

答案 0 :(得分:4)

如前所述,“/ **”表示任何请求,仅使用匹配的第一个模式。需要注意的一点是,您可以稍微清理一下配置。请参阅下面的清洁版:

http
   .csrf().disable()
   .authorizeRequests()
       .antMatchers("/shutdown").permitAll()
       .anyRequest().authenticated()
       .and()
   .formLogin()
       .loginPage("/authentication.html")
       .loginProcessingUrl("/login")
       .failureUrl("/authentication.html")
       .permitAll();

变化的重点:

  • 您不应该两次输入http。你当然可以这样做,但这不是必需的,它可以节省你输入
  • .antMatchers(“/ **”)的别名是.anyRequest(),它读得好多了
  • 指定.formLogin()的属性时,只需指定.formLogin()一次。比如http,你可以多次说明,但是不要这样做更简洁
  • defaultSuccessUrl不需要false参数(它相当于一起省略参数)。例如,您可以声明.defaultSuccessUrl(“/”),而不是.defaultSuccessUrl(“/”,false)。此外,.defaultSuccessUrl的默认值已经是“/”。这意味着您可以将它们全部删除。
  • 您会注意到我遵循this blog
  • 中概述的JavaConfig的确切格式

答案 1 :(得分:1)

故意以这种方式设计。请参阅Spring Boot Guide中的Actuator endpoints description。并且有充分的理由。在没有任何安全性的情况下让关闭钩子保持打开是一个坏主意。任何知道该网址的人都可能会关闭您的应用程序。

答案 2 :(得分:0)

这是正常的。 Spring按顺序尝试模式,并在第一个匹配时停止。由于您的第一个模式是/**,因此它会捕获所有模式,甚至不会分析下一个模式。你应该总是将catctll作为最后的模式:

http.csrf().disable();
    http.authorizeRequests()
                    .antMatchers("/shutdown").permitAll()
                    .antMatchers("/**").authenticated()
                    .and().formLogin().passwordParameter("password").usernameParameter("username")
                    .and().formLogin().loginPage("/authentication.html").permitAll()
                    .and().formLogin().loginProcessingUrl("/login")
                    .and().formLogin().failureUrl("/authentication.html")
                    .and().formLogin().defaultSuccessUrl("/",false);