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