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

我们是否可以使用httpbasic和OAuth2作为API依赖于路径变量?

东郭翰音
2023-03-14

下面是我将考虑的两种情况。

1)假设对于用户(其名称在path变量中提供)xyz,如果xyz不具有OAuth的特性,我希望使用httpBasic对其进行身份验证

2)如果另一个用户abc具有OAuth的特性,我希望使用OAuth/OpenID Connect对其进行身份验证。

共有1个答案

章锦
2023-03-14

好吧,我自己做了一些研究,找到了一个解决方案。我是这么做的,

-使用WebSecurityConfigurerAdapter创建了一个httpbasic配置,现在在任何拦截器开始它的任务之前,我已经创建了一个请求匹配器,它将检查授权头是Basic还是Bearer。

      //By default this filter order is 100 and OAuth has filter order 3
      @Order(2)
    public class MicroserviceSecurityConfigurationHttpBasic extends  WebSecurityConfigurerAdapter { 
          @Override
          protected void configure(HttpSecurity http) throws Exception {
             http.csrf().disable().exceptionHandling()
            .authenticationEntryPoint(customAccessDeniedHandler())
            .and().headers().frameOptions().disable()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .requestMatcher(new BasicRequestMatcher())
            .authorizeRequests()
            .antMatchers("/api/**").authenticated()
            .and().httpBasic();

          }
          private class BasicRequestMatcher implements RequestMatcher {
            @Override
            public boolean matches(HttpServletRequest httpRequest) {
             String auth = httpRequest.getHeader("Authorization");
             String requestUri = httpRequest.getRequestURI();
             //Fetching Identifier to provide OAuth Security to only specific urls
             String identifier= requestUri.substring(requestUri.lastIndexOf("/") + 1, requestUri.length());

            //Lets say for identifier ABC only, I want to secure it using OAuth2.0
           if (auth != null && auth.startsWith("Basic") && identifier.equalsIgnoreCase("ABC")) {
             auth=null;
              }
           //For ABC identifier this method will return null so then the authentication will be redirected to OAuth2.0 config.
           return (auth != null && auth.startsWith("Basic"));
            }
        }
  }

-在此之后,我用ResourceServerConfigurerAdapter创建了OAuth2.0配置,下面是它的一瞥。

    //Default filter order=3 so this will be executed after WebSecurityConfigurerAdapter 
    public class MicroserviceSecurityConfiguration extends ResourceServerConfigurerAdapter {
       ...
      //Here I am intercepting the same url but the config will look for bearer token only
      @Override
public void configure(HttpSecurity http) throws Exception {
    http.csrf().disable().exceptionHandling()
    .and().headers().frameOptions().disable()
    .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and().authorizeRequests()
    .antMatchers("/api/**").authenticated();
    }
   }
 类似资料:
  • 问题内容: 在Spring 3.0中,我可以有一个可选的path变量吗? 例如 在这里我想还是要调用相同的方法。 一种明显的解决方法是声明为请求参数: 然后/json?type=abc&track=aa或/json?track=rr将工作 问题答案: 你不能具有可选的路径变量,但是可以有两个调用相同服务代码的控制器方法:

  • 一个项目在Google App Engine上运行。该项目具有依赖项,该依赖项使用的类由于安全限制而无法在应用程序引擎上调用(它不在白名单上)。我(非常有黑客感)的解决方案是将该类的修改版本复制到我的项目中(匹配原始类的名称和包),而不需要受限类。这在dev和live上都适用,我假设是因为我的源代码出现在外部依赖项之前的类路径中。 为了让它更干净一些,我决定将该类的修改版本放入它自己的项目中,该项

  • 上一章介绍了类型类的概念,这种模式使设计出来的程序既拥抱扩展性,又不放弃具体的类型信息。 这一章,我们还将继续探究 Scala 的类型系统,讲讲另一个特性, 这个特性可以将 Scala 与其他主流编程语言区分开:依赖类型,特别是,路径依赖的类型和依赖方法类型。 一个广泛用于反对静态类型的论点是 “the compiler is just in the way”, 最终得到的都是数据,为什么还要建立

  • 我想拆分我的验证器的声明和实现,与Spring boot环境中的这个问题非常相似。看起来好像是我让它几乎起作用了。我看到我的验证器实际上是由Spring验证调用的,但在执行验证后,Hibernate会抛出一个异常: 这是因为是一个接口(如预期)。 我已经这样配置了Spring(这是一个不同问题的答案): 我的自定义验证器: 所以它试图通过验证器名称找到一个Spring bean。所以我有一个验证器

  • 问题内容: 我有这个变量: 我想在像SCSS这样的选择器中使用它: 因此输出变为CSS: 但这是行不通的。可能吗? 问题答案: 如果在字符串中使用,例如在URL中使用: