【问题标题】:How to segregate authentication mechanism of multiple controllers如何隔离多个控制器的认证机制
【发布时间】:2021-07-01 23:47:00
【问题描述】:

我有一个 Web 应用程序,它具有集成到 UI 的控制器的端点,以及通过 REST 控制器公开的另一组端点。 UI Controller 通过 SSO 进行身份验证,而 Rest Controller 端点通过基本身份验证。由于 UI 控制器端点属于请求映射 (/) 而其余控制器端点属于 "/non-ui/" ,我如何防止任何对 ui 具有 sso 访问权限的人访问 "/non-ui" 端点?

基本上我想在“/non-ui/”端点上禁用 spring 安全性。

我已经使用下面的网络安全配置来排除。但是,这意味着任何对 ui ("/") 具有 sso 访问权限的人都可以访问 "/non-ui/**"。

public void configure(WebSecurity webSecurity) {
        webSecurity.ignoring().antMatchers("/non-ui/**");
    }

如果我使用以下建议,尽管它会拒绝任何有权访问 ui 的人访问“/non-ui/”端点。但是,如果有人尝试通过第三方服务访问“/non-ui/”端点,它也会受到干扰,因为无论如何请求只会在提到denyAll的地方登陆应用程序。

.authorizeRequests()
                    .antMatchers("/non-ui/**")
                    .denyAll()

【问题讨论】:

    标签: spring spring-boot rest spring-security basic-authentication


    【解决方案1】:

    您可以配置 2 个WebSecurityConfigurerAdapter,哪个 UI 和 REST 控制器有自己的WebSecurityConfigurerAdapter。每个WebSecurityConfigurerAdapter 代表一个SecurityFilterChain

    当有多个SecurityFilterChain时,会按照优先级顺序逐一检查SecurityFilterChain,第一个匹配的将用于处理请求。所以排序很重要,你应该配置具有更具体 URL 模式的SecurityFilterChain 比具有更通用 URL 模式的具有更高的优先级。否则,具有更通用 URL 模式的将始终首先匹配,并忽略具有更具体 URL 模式的那个。就像我们在Java中捕获异常时,我们应该先捕获更具体的异常。

    因此,在您的情况下,其余控制器(即 /non-ui)比 UI 控制器(即 /)具有更具体的 URL 模式,它应该具有更高的优先级:

    @Configuration
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public class RestApiSecurity extends WebSecurityConfigurerAdapter{
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.antMatcher("/non-ui/**");
                //continue configure http ......
            }
    
    }
    

    UI 控制器的优先级应该较低。还需要拒绝它访问 /non-ui :

    @Configuration
    @Order(Ordered.LOWEST_PRECEDENCE)
    public class UiSecurity extends WebSecurityConfigurerAdapter{
    
            @Override
            protected void configure(HttpSecurity http) throws Exception {
                http.antMatcher("/**"); // Or you can ignore it as it will match everything by default
                    .authorizeRequests()
                        .antMatchers("/non-ui/**").denyAll();
    
                //continue configure http ......
            }
    
    }
    

    【讨论】:

    • 感谢您的解决方案。但是,我有 1 个疑问,非 ui 端点受到其他服务提供商的保护。因此,如果有人尝试通过邮递员或其他一些应用程序直接调用这些端点,他们会设置基本身份验证。所以在这种情况下,如果我不创建 RestApiSecurity 并且只有 UiSecurity 具有最低顺序,我的场景仍然可以工作或实现吗?
    • 没有。我的解决方案需要创建两个WebSecurityConfigurerAdapter。一个用于 rest-api ,一个用于 ui 。如果不创建 RestApiSecurity ,它们的端点将不受保护。
    • 假设如果其他端点(非 ui)已经受到第三方服务的保护,那么我们不需要保护它们并防止那些非 ui 端点被 sso 授权的人访问,我们可以按照您的建议在 UiSecurity 中使用 antMatchers("/non-ui/**").denyAll()。
    • 你的意思是其余端点已经被3rd 方服务保护?你的意思是它的安全性不受你控制,你想禁用spring security对其url有任何影响?如果是的,请更新问题以使其更清楚
    • 您理解正确。我想禁用 spring 安全性以对非 ui 端点控制器产生任何影响。感谢您为我的用例提供正确的话。也更新了问题
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 2018-10-05
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多