当前位置: 首页 > 知识库问答 >
问题:

Spring Boot 2:如果附加了授权头,基本Http身份验证会导致未受保护的endpoint响应401“未授权”

贺皓
2023-03-14

在迁移到Spring Boot 2并为执行器和另一个控制endpoint的应用程序添加基本授权要求后,无法使用Authure标头调用任何未受保护的endpoint。

配置片段:

@Override
public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .requestMatchers(EndpointRequest.to("shutdown")).fullyAuthenticated()
            .antMatchers("/payment/status/*").fullyAuthenticated()
            .and().httpBasic();
}

例如。使用“授权:基本...”调用.../Health将导致401“未授权”,即使它没有受到Spring Security保护。

问题:我如何调整配置,以便可以将带有授权标头的请求发送到任何不受保护的endpoint而不会被拒绝?

UPD:此修复程序按我想要的方式工作

@Override
public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .requestMatchers(EndpointRequest.to("shutdown")).fullyAuthenticated()
            .antMatchers("/payment/status/*").fullyAuthenticated()
            .antMatchers("/payment/**").permitAll()
            .and().httpBasic();
}

< strike> UPD2:没关系,刚刚测试了另一个请求,仍然收到401“未授权”。

curl localhost:8080/payment/<any_endpoint> -H "Authorization: Basic asdadas"
{"code":401,"message":"Unauthorized"}

不幸的是,这种方法覆盖了HttpSecurity匹配器,例如:/payment/变得可访问

@Override
public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
            .authorizeRequests()
            .requestMatchers(EndpointRequest.to("shutdown")).fullyAuthenticated()
            .antMatchers("/payment/status/*").fullyAuthenticated()
            .and().httpBasic();
}

@Override
public void configure(WebSecurity webSecurity) throws Exception {
    webSecurity.ignoring().antMatchers("/payment/**");
}

UPD 3:我创建了一个简单的项目,这个问题正在复制https://github.com/Anoobizzz/SpringSecurity2BasicAuthDemo

    < Li >/内部

共有2个答案

梁楷
2023-03-14

在使用spring security oauth2库时发现了一个解决方案。对我来说,它在org . spring framework . security . oauth 2 . provider . authentication . oauth 2 authenticationprocessingfilter中出错。

我通过重新配置这个解决了这个问题;

OAuth2AuthenticationProcessingFilter.setTokenExtractor(myTokenExtractor)

我的代币提取器我是这样实现的

public class MyTokenExtractor implements TokenExtractor {

private final BearerTokenExtractor bearerTokenExtractor = new BearerTokenExtractor()
@Overide
public Authentication extract(HttpServletRequest request) {
  String requestURI = request.getRequestURI();
  if (requestURI.startsWith("/someuri") {
    return null;
  }
  return bearerTokenExtractor.extract(request);
}
韦高格
2023-03-14

通过调用. AuthizeRequest(),您可以强制对所有这些请求进行授权,因为您没有在某些匹配器上调用.()

我建议在 ** 匹配器上使用 ignore,然后在 allow-all 层之上对指定的匹配器强制执行授权,以便除了显式指定的匹配器之外,所有内容都可以访问。

这实现了您想要做的事情,但请注意,这不是一个最佳实践,原因很好:默认情况下,您应该拒绝所有未授权的流量,并且只明确允许对特定路由模板的未授权请求

也就是说,更明智的做法是在您希望无需身份验证即可访问的路由上显式使用忽略,而不仅仅是**(例如仅用于/home- /about- /login- /signup

 类似资料:
  • 我正在尝试使用基本身份验证获取url。我设置用户/密码如下所示。同样的凭证在邮递员中工作。 我认为凭据设置不正确。这里怎么了?错误:

  • 成功使用带有Azure AD v2身份验证的图形endpoint。一切都很完美。 图形终结点不支持outlook任务,因此需要使用outlook api终结点outlook.office.com/api。 我在使用scope参数进行身份验证时建立作用域。使用相同的代码,只是不同的endpoint。 https://graph.microsoft.com/beta/me/messages-工作htt

  • 这里使用Passport身份验证中间件,从登录api生成jwt令牌并发送到apihttp://localhost:3030/home/在头球,但它的投掷 错误 有棱角的js:12587员额http://localhost:3030/home/401(未经授权)。 angular.js:14525可能未处理的拒绝:{数据:未授权,状态:401,配置:{方法:POST,转换请求:[空],转换响应:[空

  • 我使用的是Spring Boot(1.2.6)和Spring Security(4.0.2)。 安全配置如下所示:

  • 我有一个JavaJSF 2,Spring 3,HiberNate 4JavaEE应用程序,它使用第三方库来验证用户。我将所需的CA证书导入到我的JVM中,将第三个库添加到项目中,并在web.xml.中配置该库从智能卡读取用户详细信息。整个设置正在工作,第三方库将用户带到主页。 以下是我的要求,以确保应用程序。 再次检查该用户是否存在于特定于应用程序的数据库中 我看了这个链接,似乎“身份验证处理过滤

  • 问题内容: 我正在尝试通过以下方式从我的Android / Java源代码访问Basecamp API 。 该URL在中显示了响应,但是当我尝试如上所述访问时,显示了未经授权的异常。 这是通过Android / Java 访问 Basecamp API的 正确方法吗?或请提供给我正确的方法。 问题答案: 该 HttpClient的 不能把从URI登录creditals。 您必须给他们指定的方法。