绕过特定请求后,身份验证对象为空

Posted

技术标签:

【中文标题】绕过特定请求后,身份验证对象为空【英文标题】:Authentication object is null after bypassing the particular request 【发布时间】:2021-03-26 09:05:54 【问题描述】:

我在 webConfigSecurity 类中使​​用以下代码绕过来自客户端的一些请求

@Override
public void configure(WebSecurity webSecurity) throws Exception

    webSecurity.ignoring().antMatchers("/adminSettings/get/**")
             .antMatchers("/cases/sayHello/**").antMatchers("/cases/**/downloadPdfFolderPBC/**");

在controller api方法中需要用户详细信息进一步执行,而获取用户详细信息时认证对象为null,所以会抛出“用户未通过身份验证”的异常

 public static User get() 
        final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null) 
            UserPrincipal principal = (UserPrincipal) authentication.getPrincipal();
            if (principal == null) 
                throw new InsufficientAuthenticationException("User not authenticated");
            
            return principal.getUser();
        
        throw new AuthenticationCredentialsNotFoundException("User not authenticated");
    

我是 Spring Security 的新手,在这种情况下,我应该如何获取登录的用户详细信息

【问题讨论】:

请求如何被认证? Spring Security 本质上是一组请求过滤器,用于拦截和验证凭据 - 如果您未在请求中提供凭据,则 Spring Security 无需进行验证。 使用 json webtokens 对每个请求进行身份验证。就我而言,我绕过了该请求。绕过认证后为空。 如果你为一个给定的请求绕过了 Spring Security,那么就没有设置SecurityContextHolderignoring() 表示“Spring Security 不应该对这个请求做任何事情”。 【参考方案1】:

而不是 ignoring(),这会导致 Spring Security 跳过这些请求,我相信您想使用 permitAll(),而不是像这样:

@Override
public void configure(HttpSecurity http) throws Exception 
    http
        .authorizeRequests((requests) -> requests
            .antMatcher("/adminSettings/get/**").permitAll()
            .antMatcher("/cases/sayHello/**").permitAll()
            // ... etc
            .anyRequest().authenticated()
        )
        .formLogin(Customizer.withDefaults());

通过这种方式,Spring Security 仍将使用登录用户填充SecurityContextHolder,但所有permitAll 端点都不需要身份验证。

【讨论】:

以上是关于绕过特定请求后,身份验证对象为空的主要内容,如果未能解决你的问题,请参考以下文章

即使在 IDP 使用 SAML 成功登录后,获取身份验证对象仍为空

仅针对特定用户的 SSH 身份验证绕过密码身份验证

MobileFirst 身份验证框架是不是提供任何选项来显式绕过特定资源的安全检查?

thymeleaf 中的身份验证对象为 null 或为空

Shiro又爆高危漏洞,Apache Shiro身份验证绕过漏洞安全风险通告

Firebase 身份验证在页面重新加载时在 nuxtjs 中间件中为空