Spring Security 不会抛出任何异常

Posted

技术标签:

【中文标题】Spring Security 不会抛出任何异常【英文标题】:Spring Security does not throw any exceptions 【发布时间】:2014-12-22 19:33:40 【问题描述】:

我的 spring 安全配置:

<security:http auto-config="true"  use-expressions="true" >
<security:intercept-url pattern="/game/**" access="isAuthenticated()"/>
<security:intercept-url pattern="/**" access="permitAll"/>

<security:form-login password-parameter="password"  username-parameter="username"  login-page="/"
            default-target-url="/game/" login-processing-url="/processLogin" authentication-failure-url="/"/>
<security:logout logout-url="/game/logout" logout-success-url="/" delete-cookies="true" invalidate-session="true"/>
<security:access-denied-handler ref="accessDeniedHandler" />
</security:http>

自定义处理程序:

@Component
public class AccessDeniedHandler extends AccessDeniedHandlerImpl 
@Override
public void handle(HttpServletRequest request,
                   HttpServletResponse response, AccessDeniedException exception)
        throws IOException, ServletException 
    super.handle(request, response, exception);
    

异常解析器:

<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key=".AccessDeniedException">accessDenied</prop>
        </props>
    </property>
</bean>

我遇到的问题是 spring security 不会抛出任何异常。例如,当我输入受保护的 url 时,它会将我重定向到登录页面。如果我从配置中删除登录页面,它会将我重定向到 Spring Security 默认登录表单。因此,我无法处理任何异常,例如 AccessDeniedException。正如您在上面看到的,我已经定义了自定义访问拒绝处理程序,它覆盖了句柄方法,但它甚至没有进入它。我也尝试过使用 SimpleMappingExceptionResolver,但这也不起作用。 所以我的问题是:如何让 Spring Security 抛出异常,以便我可以通过解析器或自定义处理程序捕获它们?

【问题讨论】:

AccessDeniedHandler 仅适用于经过身份验证的用户。也许如果您更详细地解释您要达到的目标。例如,您为什么不希望 Spring Security 对用户进行身份验证? 嗨,卢克,感谢您提供的信息。不知道它仅适用于经过身份验证的用户。我要做的只是在未经身份验证的用户尝试仅访问经过身份验证的用户的内容但没有将其映射到任何 url 时显示我的错误页面,以便用户无法手动输入 /denied 例如。 从您的问题中不清楚用户实际上是如何通过身份验证的,或者您为什么不希望他们在访问该站点时成为身份验证。如果要覆盖身份验证过程以拒绝访问,可以使用自定义AuthenticationEntryPoint。默认开启将重定向到登录页面。也不要使用auto-config。无论您是否配置它,它都会创建登录设置。只需将其删除。 删除了自动配置,谢谢。现在关于我的问题,假设有人进入主页(他们尚未经过身份验证)并手动尝试通过键入正确的 url 来访问经过身份验证的用户的内容。在这种情况下,spring 只是自动将它们重定向到登录页面,而我想要做的只是显示错误页面,但同样,没有将其映射到 url 地址。 因此,如上所述,您要覆盖显示登录页面的默认行为。例如,请参阅this answer。 【参考方案1】:

我的 AccessDeniedHandler 不起作用的原因是因为它仅适用于经过身份验证的用户,因此为了在未经身份验证的用户尝试仅为经过身份验证的用户访问内容时显示错误页面(这是试图捕获AccessDeniedException),您应该编写您的自定义入口点,并覆盖默认入口点。

感谢 Luke Taylor 向我澄清这一点。

【讨论】:

以上是关于Spring Security 不会抛出任何异常的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常

Spring boot 前后台分离项目 怎么处理spring security 抛出的异常