首页 > 解决方案 > 如何支持 REST API 项目的基本认证和承载认证

问题描述

我是 Spring Security 的新手并且仍在学习它,所以我的问题可能很幼稚,请耐心等待。

我有 Sprint Boot Rest API 项目,它公开了某些 API。我已经为所有 API 实现了基于不记名令牌的身份验证。例如 /user 、 /resource 、 /appointment

现在对于特定控制器的少数 api,我希望实现基本身份验证。这些 API 将被另一个不公开的服务使用。为了获得 API 的安全性,我希望为这些 api 设置基本身份验证。例如 /internal/api1 , internal/api2 .. 等等

我无法区分ResourceServerConfigurerAdapterWebSecurityConfigurerAdapter中的 url 。也不确定应该使用哪个来添加basicAuth()使用 antmatchers

标签: spring-bootspring-securitybasic-authenticationbearer-tokenspring-security-rest

解决方案


通过阅读您的问题,您想要的是为两个不同的端点提供两种身份验证类型(令牌和 httpBasic)。它可以通过创建两个不同的 WebSecurityConfigurerAdapter bean 来实现。Spring Boot 实现了这一点,可以像下面这样完成:

  • @Order(1) - /resource|user|appointment/** 受不记名令牌身份验证保护。
  • @Order(2) - /internal/** 受基本身份验证保护。

在此处查看Spring Boot的文档和示例代码。

   @EnableWebSecurity
   public class SecurityConfig {

    @Configuration
    @Order(1)
    public class ApiSecurityConfig extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/resource/**")
                .antMatcher("/user/**")
                .antMatcher("/appointment/**")
                .authorizeRequests()
                    .anyRequest().authenticated()
                .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    .and().addFilterBefore(jwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
        }
    }

    @Configuration
    @Order(2)
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                .authorizeRequests()
                .antMatchers("/internal/**")
                .and()
                .httpBasic();
        }
    }

}

推荐阅读