Spring Boot Security不会通过WebSecurity忽略certian url

时间:2016-05-13 22:49:29

标签: spring-security spring-boot restful-authentication

我在Spring Security中使用Spring boot 1.3.2。 我有以下配置(HttpSecurity http)方法来强制进行身份验证

    protected void configure(HttpSecurity http) throws Exception {

    RequestMatcher csrfRequestMatcher = new RequestMatcher() {
          private AntPathRequestMatcher[] requestMatchers = {
              new AntPathRequestMatcher("/iams/w/*")
          };
          @Override
          public boolean matches(HttpServletRequest request) {
            for (AntPathRequestMatcher rm : requestMatchers) {
              if (rm.matches(request)) { return true; }
            }
            return false;
          } // method matches

        };      


    http
        .csrf()
        .requireCsrfProtectionMatcher(csrfRequestMatcher)
        .and()
        .authorizeRequests()
            .anyRequest().authenticated()
            .and()
        .requestCache()
            .requestCache(new NullRequestCache())
            .and()
        .httpBasic();
}

我有以下配置(WebSecurity web)方法忽略下面的一些网址;

    public void configure(WebSecurity web) throws Exception {

    web.ignoring().antMatchers(
            "/myapp/docs/**",
            "/myapp/docs/*",
            "/myapp/docs/index.html",
            "/resources/**", 
            "/static/**");

}

http://127.0.0.1:9000/myapp/docs/index.html的http请求仍然需要用户名/密码(身份验证)并返回"状态":401,"错误":"未授权" ... 实际上WebSecurity上的忽略url都没有工作,因为它还需要身份验证。如果我提供auth然后它工作。我怎么能在这里简单地忽略一些网址(例如" / myapp / docs / **")。我在SecurityConfig类中有以下定义

@EnableWebSecurity

@EnableGlobalMethodSecurity(prePostEnabled = true) 公共类SecurityConfig扩展了WebSecurityConfigurerAdapter {

我错过了什么?请告知。

3 个答案:

答案 0 :(得分:0)

您的代码中存在错误顺序。

http
    .csrf()
    .requireCsrfProtectionMatcher(csrfRequestMatcher)
    .and()
    .authorizeRequests()
        .anyRequest().authenticated()
        .and()
    .requestCache()
        .requestCache(new NullRequestCache())
        .and()
    .httpBasic();

因此,需要对任何请求进行身份验证。您可以直接使用antMatchers

http
        .authorizeRequests()
        .antMatchers("/iams/w/*")
        .authenticated()
        .and()
        .httpBasic()
        .and()
        .requestCache()
        .requestCache(new NullRequestCache())
        .csrf().disable()

我希望它对你有所帮助。

答案 1 :(得分:0)

感谢您的回复,但有您的建议,我的" / iams / w / *"完全没有受到保护。我可以找到所有这些网址; " /艾姆斯/文档/ **" ," / iams / w / "和" / iams / api / "没有基本的认证。以下是根据您的建议设置。在这里,我想保护" / iams / w"和" / iams / api /"使用用户名/密码,但让每个人都可以访问" / iams / docs / *"没有用户名/密码。这是基于spring boot restful的实现,但是希望公开一些像docs这样的url,以便所有人都能访问它而不是api调用。

    public void configure(WebSecurity web) throws Exception {

    web.ignoring().antMatchers(
            "/iams/docs/**",
            "/iams/docs/*",
            "/iams/docs/index.html",
            "/static/**");

}


@Override
protected void configure(HttpSecurity http) throws Exception {

    http
    .authorizeRequests()
    .antMatchers("/iams/api/**","/iams/api/v1/*")
    .authenticated()
    .and()
    .httpBasic()
    .and()
    .requestCache()
    .requestCache(new NullRequestCache())
    .and()
    .csrf().disable();
}

答案 2 :(得分:0)

可能更容易使用尽可能简单的一组模式来保护不安全,然后简单地说其他一切都是安全的。

这可能更接近你想要的东西:

public static final String[] NOT_SECURED = {"/iams/docs/**","/static/**"};

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(NOT_SECURED);
}


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .authorizeRequests()
      .antMatchers(NOT_SECURED).permitAll()
      .anyRequest().authenticated()
      .and()
      .httpBasic()
      .and()
      .requestCache()
      .requestCache(new NullRequestCache())
      .and()
      .csrf().disable();
}