6

我有一个使用以下代码设置的异常处理程序

@ExceptionHandler(Throwable.class)
public @ResponseBody CustomResponse handleException(Throwable throwable){
    // handles exception, returns a JSON
}

我正在使用 Spring Security 3.1。当我尝试在没有身份验证的情况下执行操作时,应用程序会引发 AccessDeniedException。它永远不会用到这种方法。但适用于其他例外情况。这是它应该工作的方式吗?还是我的代码有问题?

看起来像一个解决方案。但如果我能在一个点处理异常会更好。

这是我的配置文件

<global-method-security secured-annotations="enabled" pre-post-annotations="enabled" />
<http auto-config="true" use-expressions="true">
    //intercept urls
    <form-login login-page="/signin" default-target-url="/" always-use-default-target="true"/>
</http>

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="encoder" />
    </authentication-provider>
</authentication-manager>

<!-- This encoder doesn't require a salt -->
<beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />

更新

此处用户未经过身份验证 (ROLE_ANONYMOUS)。当我尝试访问受保护的页面时,它会将我重定向到登录 URL。我的问题是,我进行了 AJAX 调用。所以重定向到返回 ModelAndView 的方法是行不通的。这附近有工作吗?

4

2 回答 2

10

Spring Security 的请求处理全部发生在过滤器链中,在调用调度程序 servlet 之前,因此它对 Spring MVC 异常处理程序一无所知,实际上完全可以在没有 Spring MVC 的情况下使用。

您看到的是未经身份验证用户的预期行为,但您不希望将 Ajax 调用重定向到 UI 代码。很难准确地说出最佳解决方案是什么,因为对于未经身份验证的 ajax 调用,您希望行为是什么并不明显。例如,如果您希望它们简单地以 403 失败,那么您可以将 ajax api 分离到一个单独的过滤器链中。例如,如果您的 ajax 调用/ajaxapi可以在现有的之前添加以下链定义:

<http pattern="/ajaxapi/**" create-session="never" use-expressions="true" entry-point-ref="entryPoint">
    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<bean entryPoint="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

然后,ajax 调用将只得到 403 响应,直到用户通过浏览器界面进行身份验证。

于 2013-01-20T15:01:49.637 回答
2

我猜你<access-denied-handler>在你的 spring 安全配置中定义了一个。这个处理程序正在捕获AccessDeniedException. 这可能就是为什么你没有在你的 generic 中得到它ExceptionHandler

有一个默认的 AccessDeniedHandler(带有默认的 spring 安全设置)。请阅读本文了解更多详情。

于 2013-01-20T11:45:49.567 回答