gpt4 book ai didi

java - 为什么失败处理在 Spring Security X.509 身份验证中不起作用?

转载 作者:行者123 更新时间:2023-11-30 08:38:19 25 4
gpt4 key购买 nike

我有一个带有 X509 过滤器的自定义过滤器(X509AuthenticationFilter 的子类)。 X509 过滤器的唯一工作是从请求中提取证书。我有一个相应的 AuthenticationProvider,如果凭据无效,它会抛出一个 BadCredentialsException。我的意图是,当 AuthenticationProvider 抛出 BadCredentialsException 时,BadCredentialsException 导致请求转发到 message.jsp .然而,它并没有这样做。调试时,我注意到异常被抛出、捕获并存储在 WebAttributes.AUTHENTICATION_EXCEPTION...下,但其他 Spring Security 类似乎都没有使用异常,我找不到任何方法来使用故障处理程序。

<security:http auto-config="false" pattern="/role/**" access-decision-manager-ref="adm" entry-point-ref="http403EntryPoint">
<security:anonymous enabled="false"/>
<security:access-denied-handler error-page="/message.jsp"/>
<security:custom-filter ref="authFilter" position="PRE_AUTH_FILTER" />
</security:http>

<bean id="http403EntryPoint" class="..." />

<bean id="authFilter" class="...">
<property name="authenticationManager" ref="authenticationManager" />
<property name="continueFilterChainOnUnsuccessfulAuthentication" value="false" />
</bean>

我已经为 authFilter 尝试了 PRE_AUTH 和 X509 过滤器选项。我还尝试过使用和不使用 continueFilterChainOnUnsuccessfulAuthentication 选项的 authFilter。两者都没有任何区别,错误不会由 spring security 处理。

我想要的是:

Spring Security框架提供的错误处理X509认证方式。我不在乎它是否被视为“预授权”,尽管我认为 Spring Security 可能需要将过滤器放置在预授权或 X509 位置。我想要有关如何使这项工作正常进行的提示或有关要查看的内容的具体信息。

最佳答案

通常在 Spring Security 中,由于未捕获的 AuthenticationException(BadCredentialsException 扩展)重定向到页面的工作方式如下:

  1. FilterSecurityInterceptor 抛出一个 AuthenticationException
  2. AuthenticationExceptionExceptionTranslationFilter 捕获。
  3. ExceptionTranslationFilter 将请求发送到 entry-point-ref 进行身份验证。

这个事件循环发生在 end of the filter chain 附近.但是,您的自定义 X509AuthenticationFilterAuthenticationProvider 会在链中更早的时候验证证书。要将失败的证书验证重定向,请执行以下操作:

  1. 让您的 AuthenticationManager/AuthenticationProvider 抛出一个 BadCredentialsException,就像您目前正在做的那样。
  2. 允许您的自定义 X509AuthenticationFilter 取消与请求关联的 Authentication(这应该是它从 AbstractPreAuthenticatedProcessingFilter 继承的行为)。
  3. 稍后在链中安装一个单独的 FilterSecurityInterceptor,为没有 Authentication 的请求抛出 AuthenticationException,这将导致请求被发送到入口点。

这可以按如下方式完成:

<security:http auto-config="false" pattern="/role/**" entry-point-ref="failureMessageEntryPoint">
<security:anonymous enabled="false"/>
<security:custom-filter ref="authFilter" position="PRE_AUTH_FILTER"/> <!-- authenticationManager will throw a BadCredentialsException, resulting in a null Authentication for the request -->
<security:intercept-url pattern="/role/**" access="isAuthenticated"/> <!-- will reject requests with a null Authentication by throwing an AuthenticationCredentialsNotFoundException -->
<!-- AuthenticationExceptions will be caught by auto-configured ExceptionTranslationFilter, and sent to entry point -->
</security:http>

<bean id="failureMessageEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"> <!-- not actually for login, but will work as an entry point that redirects to a page -->
<constructor-arg value="/message.jsp"/>
</bean>

<bean id="authFilter" class="...">
<property name="authenticationManager" ref="authenticationManager"/>
<!-- let continueFilterChainOnUnsuccessfulAuthentication default to true to allow the intercept-url to reject the request -->
</bean>

关于java - 为什么失败处理在 Spring Security X.509 身份验证中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36631175/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com