Spring安全许可全部返回401

Posted

技术标签:

【中文标题】Spring安全许可全部返回401【英文标题】:Spring security permitall return 401 【发布时间】:2021-11-18 22:41:40 【问题描述】:

Spring 安全配置

 @Override
    protected void configure(HttpSecurity http) throws Exception 

    http.cors().and()
            .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
            .authorizeRequests()
            .antMatchers("/admin").hasRole("ADMIN")
            .antMatchers("/api/auth/**").permitAll()
            .antMatchers("/api/test/**").permitAll()
            .antMatchers("/").permitAll()
            .antMatchers("/favicon.ico").permitAll()
            .antMatchers("/static/**").permitAll()
            .antMatchers("/manifest.json").permitAll()
            .antMatchers("/logo192.png").permitAll()
            .anyRequest().authenticated();

    http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);

我也试过了,但没有产生任何结果

.antMatchers(HttpMethod.POST, "/api/auth/**").permitAll()

/api/auth/注册返回

error: "Unauthorized"
message: "Full authentication is required to access this resource"
path: "/error"
status: 401

Request URL: https://mysuite.ru/api/auth/signup

我该如何解决这个问题?

更新

@Configuration
public class MvcSecurityConfig implements WebMvcConfigurer 
@Value("$path.frontend")
private String frontendPath;
@Value("$frontendStaticResourcesPathPatterns")
private String[] frontendStaticResourcesPathPatterns;
private static final String BASE_API_PATH = "/";

public void addResourceHandlers(ResourceHandlerRegistry registry)
    String pathToFrontend = "file:" + this.frontendPath;
    String pathToIndexhtml = pathToFrontend + "/index.html";

    registry
            .addResourceHandler(frontendStaticResourcesPathPatterns)
            .setCachePeriod(0)
            .addResourceLocations(pathToFrontend);

    registry.addResourceHandler("/", "/**")
            .setCachePeriod(0)
            .addResourceLocations(pathToIndexHTML)
            .resourceChain(true)
            .addResolver(new PathResourceResolver() 
                @Override
                protected Resource getResource(String resourcePath, Resource location) throws IOException 
                    if (resourcePath.startsWith(BASE_API_PATH) || resourcePath.startsWith(BASE_API_PATH.substring(1))) 
                        return null;
                    
                    return location.exists() && location.isReadable() ? location : null;
                
            );



这是我的 Spring MVC 配置。 这会导致问题吗? 我也尝试沿着路径一步一步地做 permitAll 但它不起作用(api/,api/auth,api/autn/**)

【问题讨论】:

【参考方案1】:

在 Ant 匹配器中,** 匹配路径中的零个或多个目录。给定您的请求 URL,您只需要匹配零个或多个字符。话虽如此,请尝试将您的 Ant 匹配器替换为以下内容:

.antMatchers(HttpMethod.POST, "/api/auth/*").permitAll()

【讨论】:

结果是一样的 如果您删除所有其他 Ant 匹配器并仅使用 antMatchers("/api/**").permitAll() 会发生什么? 我删除了所有内容,只留下了这个,结果没有改变【参考方案2】:

通过您的过滤器,因为任何 API 请求都通过过滤器。您的 API 无法通过过滤器,因此您得到 401 响应。

尝试将此添加到您的 Spring 安全配置中:

@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring().antMatchers("/api/auth/**");

或将其添加到 OncePerRequestFilter:

    @Override
    protected boolean shouldNotFilter(HttpServletRequest request) throws ServletException 
        return new AntPathMatcher().match("/api/auth/**", request.getServletPath());
    

【讨论】:

【参考方案3】:

默认情况下,Spring Security 启用了 CSRF 保护,因此当您执行不安全的请求(POST、PUT、DELETE)时,您必须提供 CSRF 令牌

在您的配置方法中,您可以禁用它以检查它是否可以工作。

http.csrf().disable()

我建议您禁用 CSRF 保护可能对您的应用有害,您应该确定是否需要使用它。

另外,如果您使用的是 Spring Security 的 5.4 或更高版本,您可以启用跟踪日志来帮助您调试它。

logging.level.org.springframework.security=TRACE

您可以在reference docs获取更多详细信息。

【讨论】:

以上是关于Spring安全许可全部返回401的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security - 获取登录页面时,安全性尝试进行身份验证并返回 401 错误

Spring Security 测试返回 401(未经授权)

为啥 Spring Boot Actuator 返回 404 而不是 401?

webpack服务器中的rest API调用(来自角度)返回401

Spring Boot:禁用 Spring Boot 单元测试的安全性 [重复]

Spring 返回 401 而不是 200 状态