【问题标题】:Spring Security Config not skipping authentication for certain URLsSpring Security Config 不会跳过某些 URL 的身份验证
【发布时间】:2017-04-28 21:33:34
【问题描述】:

我尝试了十几种不同的配置,但我无法让 Spring Security 执行我正在尝试的用例。 我希望安全人员执行以下操作

  1. 对指定 URL 使用基本身份验证 (/api/service/**)

  2. 如果与所有其他 URL 一起发送,则不验证基本身份验证

目前,每当我向 /api/service/** 之外的任何 URL 发送请求时,它都可以正常工作,但是,如果我发送带有基本身份验证令牌的那些它然后尝试对其进行身份验证。我不希望令牌被所有其他 URL 完全忽略。有没有办法做到这一点?

    @Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf().disable()
        .authorizeRequests().antMatchers("/api/service/**").hasRole("ROLE_SERVICE")
        .and()
            .httpBasic().authenticationEntryPoint(authenticationEntryPoint)
        .and()
            .exceptionHandling().accessDeniedHandler(new RestAccessDeniedHandler())
        .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}

我也尝试添加.authorizeRequests().antMatchers("**").anonymous().authorizeRequests().antMatchers("**").permitAll(),但它们都没有成功。我也试过删除 .httpBasic() 但没有进行验证。

任何帮助将不胜感激。

使用:Spring Security 3.2.9.RELEASE 和 Spring MVC 3.2.13.RELEASE。

【问题讨论】:

  • 所以当您向不需要身份验证的 url 发送带有身份验证标头的请求时,它会尝试进行身份验证吗?
  • 正确,我知道这听起来像是一个奇怪的用例,但大多数 API 都是完全开放的,所以我只想能够对某些 API 进行身份验证,因为我无法控制其他人是否会添加不同的身份验证在标题中。编辑:如果我提供了无效的基本身份验证令牌,那么它是坏的。如果我提供一个基本的身份验证令牌,它将正确地验证 /api/service/** 到其他 API 中它可以工作(因为它正在通过 Spring Security 进行身份验证)。

标签: java spring spring-mvc authentication spring-security


【解决方案1】:

使用这个

.authorizeRequests()
         .antMatchers("/api/service/**").hasRole("ROLE_SERVICE")
         .anyRequest().permitAll()

【讨论】:

  • 有了这个基本的身份验证永远不会被验证,所以即使是 /api/services/** 调用。
  • 权限分配的顺序很重要。你确定你只在.antMatchers("/api/service/**").hasRole("ROLE_SERVICE")之后才给.anyRequest().permitAll()
  • 你也有/api/service/**/api/services/**。你的问题只有service,在评论中你提到services
猜你喜欢
  • 1970-01-01
  • 2012-03-06
  • 2013-02-23
  • 2014-09-06
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2012-11-25
相关资源
最近更新 更多