当前位置: 首页 > 知识库问答 >
问题:

Spring@ExceptionHandler不捕获AccessDeniedException

冯祺
2023-03-14

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

@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 的方法不起作用。这里有工作吗?

共有2个答案

乔伯寅
2023-03-14

我猜你定义了一个

有一个默认的AccessDeniedHandler(与默认的Spring Security设置一起提供)。请阅读本文了解更多详细信息。

卢德惠
2023-03-14

Spring Security的请求处理都发生在过滤器链中,在调用dispatcher 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响应。

 类似资料:
  • 我有一个方面类,用于记录使用泛型方法之前和之后(周围)的方法执行情况: 在方法中,我抛出了一个在logMethod中捕获的可抛出异常,并抛出了一个自定义异常,而不是类型 在我的控制器建议中,我有以下内容: 项目结构: 控制台:

  • 在我的spring boot应用程序中,我有一个用于post请求的控制器,它生成和使用JSON请求,并且我为这个控制器定义了@ExceptionHandler,它使用HttpMediaTypeNotAcceptableException来捕获HttpMediaTypeNotAcceptableException(406状态代码)异常。 现在,每当我调用带有错误的ACCEPT头(如applicati

  • 我的Spring Boot服务将执行一项工作,并在成功后退出0(没有restcontroller),但我也希望它在每个异常时退出,因此我在类上添加了并放置了以下方法: 一切正常,但当我抛出一个IllegalArgumentException时,方法不会被调用。首先,我有一个没有参数的void方法,然后我开始尝试使用字符串返回和至少一个参数--这是不需要的。 这怎么行?有没有更好的方法让我的案例对每

  • 在另一个用@ControllerAdvice注释的类中,我有一个ExceptionHandler,它捕获IllegalArgumentException并将其转换为HTTP状态码为400的格式化响应。 当通过触发API的有效路径来执行此操作时,一切正常。当我尝试调用API的无效/不存在路径时,会出现问题。调用HandlerInterceptor并引发异常,但未触发我的ExceptionHandle

  • 我使用的是Spring Boot1.5.7。我有一个ExceptionHandler用于返回ResponseEntity的异常 在返回ResponseEntity/@responseBody(JSON/XML响应)的api调用期间发生异常的情况下,这种方法工作得很好 null

  • 我创建了一个类来保存一些@ExceptionHandler,这样我就可以捕捉InvalidWSUserException,并用一个JSON字符串响应,通知请求客户机请求中的令牌无效。 我已经在另一个项目中工作了这个,但我似乎无法在这个新项目中工作。 InvalidWSUserException为空,因为处理程序应该处理响应; 为了确认,我在浏览器中看到的输出是错误500 json响应;其中应该是来