如何隔离多个控制器的身份验证机制

8yoxcaq7  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(372)

我有一个web应用程序,它有一个集成到ui的控制器的端点,还有一组通过rest控制器公开的端点。ui控制器通过sso进行身份验证,而rest控制器端点通过基本身份验证。既然ui控制器终结点属于请求Map(/),而rest控制器终结点属于“/non-ui/”,那么如何防止任何对ui具有sso访问权限的人访问“/non-ui”终结点?
基本上我想在“/non-ui/”端点上禁用Spring Security 。
我使用了下面的web安全配置来排除。但是,这意味着任何对ui(“/”)具有sso访问权限的人都可以访问“/非ui/**”。

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

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

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

i86rm4rw1#

您可以配置2 WebSecurityConfigurerAdapter 哪个ui和rest控制器有自己的 WebSecurityConfigurerAdapter . 每个 WebSecurityConfigurerAdapter 表示 SecurityFilterChain .
当有多个 SecurityFilterChain ,它将检查 SecurityFilterChain 根据优先级顺序逐个处理。第一个匹配的将用于处理请求。所以排序很重要,您应该配置 SecurityFilterChain 使用更具体的url模式比使用更一般的url模式具有更高的优先级。否则,将始终首先匹配具有更一般url模式的url,而忽略具有更特定url模式的url。就像在java中捕获异常一样,我们应该首先捕获一个更具体的异常。
因此,在您的情况下,rest控制器(即/非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控制器应具有较低的优先级。还需要拒绝其访问/非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 ......
        }

}

相关问题