如果存在多个AuthenticationProvider,则不会将AccesDenied请求转发到AuthenticationEntryPoint

时间:2019-04-16 07:54:16

标签: spring-security keycloak

在Spring Security项目中,我已经通过常规的KeycloakWebSecurityConfigurerAdapter方法配置了Keycloak。 Keycloak本身一切正常。

我现在添加了一个需要通过basic-auth授权的特定URL。为此,我配置了第二个配置,该URL的antMatcher的优先级高于Keycloak配置。当我访问该URL时,此方法工作正常,可以触发基本身份验证,并且可以对其进行身份验证。

但是在对此URL进行身份验证之后,我无法再通过我的Keycloak特定URL进行身份验证。当前的逻辑如下:我有一个Keycloak登录URL(/auth/login),该URL由项目中的控制器处理。处理方法带有@Secured注释,要求用户具有他仅在通过Keycloak进行身份验证后才能获得的角色。因此,对于第一次登录,拒绝对/auth/login URL的请求,并抛出AccessDeniedException。 然后Spring在ExceptionTranslationFilter中自动执行的操作:它将请求委派给身份验证入口点,该入口点是Keycloak特定的实现,可以完成所有操作。

但是,在此特定情况下的问题是,如果用户不是“匿名”用户,则在ExceptionTranslationFilter#handleSpringSecurityException中Spring将不会委托给身份验证入口点。由于用户先前已经通过基本身份验证URL进行了身份验证,因此Spring在上下文中找到此身份验证对象,然后不将该用户视为匿名用户。我猜这里的逻辑是Spring认为这是失败的登录尝试之类的。

我该怎么办,如果Spring在上下文中找到一些不相关的身份验证,Spring还可以将请求委派给已配置的身份验证入口点?

0 个答案:

没有答案