Spring Security 401未经许可甚至未经许可

时间:2018-10-20 09:30:22

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

我正在使用Spring安全性来保护REST服务中的某些端点。

这是安全配置类:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, jsr250Enabled = true, prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // Other methods

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .cors()
                .and()
                .csrf()
                .disable()
                .exceptionHandling()
                .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
                .and()
                .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .authorizeRequests()
                .antMatchers("/",
                        "/favicon.ico",
                        "/**/*.png",
                        "/**/*.gif",
                        "/**/*.svg",
                        "/**/*.jpg",
                        "/**/*.html",
                        "/**/*.css",
                        "/**/*.js")
                .permitAll()
                .antMatchers(HttpMethod.POST, "/api/auth/**")
                .permitAll()
                .anyRequest()
                .authenticated();

        // Add our custom JWT security filter
        http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

    }
}

如您所见,我可以通过以下方式获得对 / api / auth / signup / api / auth / signin 的完全访问权限: 1}}

由于某种原因,当我在邮递员中尝试这些请求时,“注册” 请求工作正常,但“登录” 无效,并给了我“ 401未经授权”
我也尝试过 .antMatchers(HttpMethod.POST, "/api/auth/**").permitAll()

这是我的控制器:

.antMatchers("/**").permitAll()

5 个答案:

答案 0 :(得分:2)

我有同样的问题,不确定,但我认为您需要此命令:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers(HttpMethod.POST, "/api/auth/**")
            .permitAll()
            .antMatchers("/",
                    "/favicon.ico",
                    "/**/*.png",
                    "/**/*.gif",
                    "/**/*.svg",
                    "/**/*.jpg",
                    "/**/*.html",
                    "/**/*.css",
                    "/**/*.js")
            .permitAll()                   
            .anyRequest()
            .authenticated()
            .and()
            .cors()
            .and()
            .exceptionHandling()
            .authenticationEntryPoint(this.jwtAuthenticationEntryPoint)
            .and()
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .csrf()
            .disable();

    // Add our custom JWT security filter
    http.addFilterBefore(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);

}

答案 1 :(得分:1)

您的配置由于评估 antMatcher 的顺序而无法正常工作

 .and()
 .authorizeRequests()
 .antMatchers("/",
    "/favicon.ico",
    "/**/*.png",
    "/**/*.gif",
    "/**/*.svg",
    "/**/*.jpg",
    "/**/*.html",
    "/**/*.css",
    "/**/*.js")
 .permitAll()
 .antMatchers(HttpMethod.POST, "/api/auth/**")
 .permitAll()
 .anyRequest()
 .authenticated();

请求匹配规则的顺序很重要,更具体的规则应排在第一位。这两个 antMatcher 规则之间存在一些冲突,因此第二个规则即 .antMatchers(HttpMethod.POST,“ / api / auth / ”)**被忽略。

因此顺序应为:-

 .antMatchers(HttpMethod.POST, "/api/auth/**")
 .permitAll()
 .antMatchers("/",
    "/favicon.ico",
    "/**/*.png",
    "/**/*.gif",
    "/**/*.svg",
    "/**/*.jpg",
    "/**/*.html",
    "/**/*.css",
    "/**/*.js")
 .permitAll()

答案 2 :(得分:0)

我上次做这件事我记得订单很重要。

func getValues(m interface{}) []interface{} {
    v := reflect.ValueOf(m)

    result := make([]interface{}, 0, v.Len())

    for _, k := range v.MapKeys() {
        result = append(result, v.MapIndex(k).Interface())
    }
    return result
}

答案 3 :(得分:0)

您需要在配置方法中添加以下内容 / error是由于任何异常导致应用程序发生错误时的默认回退,并且默认情况下受保护。

    protected void configure(HttpSecurity httpSecurity) throws Exception {
    //disable CRSF
    httpSecurity
            //no authentication needed for these context paths
            .authorizeRequests()
            .antMatchers("/error").permitAll()
            .antMatchers("/error/**").permitAll()
            .antMatchers("/your Urls that dosen't need security/**").permitAll()

下面的代码段

 @Override
 public void configure(WebSecurity webSecurity) throws Exception
   {
     webSecurity
    .ignoring()
        // All of Spring Security will ignore the requests
        .antMatchers("/error/**")
     }  

现在,当allowAll Urls发生异常时,您将不会获得401并获得500个异常的详细信息

答案 4 :(得分:0)

我遇到了同样的问题,这是因为我没有使用默认的 jdbc 架构,所以我传递了默认 UserDetailsS​​ervice 和我的权限表所需的查询为空,因此无法通过用户名搜索结果。