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

Spring 如何隔离多个控制器的身份验证机制,spring,spring-boot,rest,spring-security,basic-authentication,Spring,Spring Boot,Rest,Spring Security,Basic Authentication,我有一个web应用程序,它具有集成到UI的控制器的端点,以及通过REST控制器公开的另一组端点。UI控制器通过SSO进行身份验证,而Rest控制器端点通过基本身份验证。由于UI控制器终结点位于请求映射(/)下,而rest控制器终结点位于“/non-UI/”下,因此如何防止任何对UI具有sso访问权限的人访问“/non-UI”终结点 基本上,我想在“/非ui/”端点上禁用spring安全性 我使用了以下web安全配置来排除。但是,这意味着任何对ui(“/”)具有sso访问权限的人都可以访问“/非u

我有一个web应用程序,它具有集成到UI的控制器的端点,以及通过REST控制器公开的另一组端点。UI控制器通过SSO进行身份验证,而Rest控制器端点通过基本身份验证。由于UI控制器终结点位于请求映射(/)下,而rest控制器终结点位于“/non-UI/”下,因此如何防止任何对UI具有sso访问权限的人访问“/non-UI”终结点

基本上,我想在“/非ui/”端点上禁用spring安全性

我使用了以下web安全配置来排除。但是,这意味着任何对ui(“/”)具有sso访问权限的人都可以访问“/非ui/**”

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

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

您可以配置2
websecurityConfigureAdapter
哪个UI和REST控制器有自己的
websecurityConfigureAdapter
。每个
WebSecurityConfigureAdapter
表示一个
SecurityFilterChain

当存在多个
SecurityFilterChain
时,它将根据优先级顺序逐个检查
SecurityFilterChain
。第一个匹配的将用于处理请求。因此,排序很重要,您应该使用更具体的URL模式配置
SecurityFilterChain
,它的优先级高于使用更一般URL模式的。否则,将始终首先匹配具有更通用URL模式的URL,而忽略具有更特定URL模式的URL。就像在Java中捕获异常一样,我们应该首先捕获一个更具体的异常

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

@配置
@顺序(有序。最高优先级)
公共类RestApiSecurity扩展了WebSecurity配置适配器{
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.antMatcher(“/non-ui/**”);
//继续配置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 ......
        }

}

谢谢你的解决方案。但是,我有一个疑问,非ui端点受到其他服务提供商的保护。因此,如果有人试图通过postman或其他应用程序直接调用这些端点,他们会设置基本身份验证。因此,在这种情况下,如果我不创建RestApiSecurity,并且仅使用具有最低阶的UiSecurity,我的方案是否仍然有效或可以实现?否。我的解决方案需要创建两个
WebSecurityConfigureAdapter
。一个用于RESTAPI,一个用于ui。如果不创建
RestApiSecurity
,它们的端点将不受保护。假设rest端点(非ui)已经受到某个第三方服务的保护,那么我们不需要保护它们,为了防止sso授权人员访问这些非ui端点,我们可以使用antMatchers(“/non-ui/**”)。denyAll()在您建议的UiSecurity中。什么意思是rest端点已经受到第三方服务的保护?您的意思是它的安全性不受您的控制,并且您想禁用spring安全性以对其url产生任何影响?如果是,请更新问题以使其更清楚您理解正确。我想禁用spring安全性以对非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 ......
        }

}