当Spring Security拒绝访问时,无法通过@ExceptionHandler进行处理的问题(但Spring Boot可以处理)

首先

最近我有机会接触到Spring。我写过的Java只限于5年前之前的时代,因此在参考了他人在Qiita上的文章后,学会了注解和方法链等1个”现代化的Java”。

所以,关于我们想要建立的系统大致如下。

    • ユーザ認証を行う。これはSpring Security使えばよいようだ。

 

    • ロールも使って特定ページには管理者しかアクセスできないようにする。

 

    エラーページはSpring Bootが出してるようだけどデフォルトのままじゃもちろん駄目なのでエラーハンドリングを行う。

所以,当我研究了最后的错误处理方法后,我发现只需要在方法上添加@ExceptionHandler注释即可。以上是前提部分。

请注意,我已将下面的代码(用于重现情况的代码)全部放在GitHub上。
https://github.com/junjis0203/spring-security-boot-error-example

暂且尝试使用@ExceptionHandler

使用@ExceptionHandler注解,并在返回值中以String形式返回视图名称。

    @ExceptionHandler
    @ResponseStatus(code = HttpStatus.INTERNAL_SERVER_ERROR)
    public String handle(Exception e) {
        logger.error(e.toString());
        return "error";
    }

请确认以没有授予管理员权限的用户访问时,是否能正确显示返回的视图。

handle-error.jpg

好吧,我很大概地捕捉了异常,但实际上是哪个异常呢……嗯?(。´・ω・)?日志没打印出来。是日志配置有问题吗?

春季安全「嘿呀」

「从何时开始,我误以为自己可以进行错误处理」沢田「你是谁!?」

Spring Security过滤了该请求,也就是说,它没有到达控制器。
澤田:“什么!那为什么我的自定义视图会显示出来呢?”

Spring Boot「わいやで」的中文说法可以是「春季引导」或者「春动」。

春季启动器「哦,你在做这个啊」
沢田「嗯?」
春季启动器「在这里写着。简单来说,它被注册为Servlet容器的全局错误页面。也就是说,哪怕是Spring Security抛出的错误,我也能够处理」
沢田「并没有写要使用error.html啊」
春季启动器「看源代码」

解决方案

所以,使用Spring Security进行访问控制时,发现无法捕获权限错误,但是发现使用Spring Boot可以捕获。
对我来说,只要弄清楚”为什么权限错误没有被处理”和”为什么尽管没有被处理但自己编写的页面还是显示出来”这两个问题就好了,所以我放置了error/403.html来提示没有访问权限。

結尾

最近写的关于Sinatra的文章,我个人非常喜欢关于「编程规范」的话题,所以在这一点上,Spring非常有趣。
另外,我也非常喜欢阅读代码并思考「这到底是如何运行的?」,但是Spring的代码太复杂了。在找到主体之前,要经过多少个接口和抽象类啊。但是幸好我之前稍微做了一些源代码搜索,在这次的BasicErrorController上相对比较快地找到了(笑)

由于我熟悉JUnit4,所以对于充分利用注释编程方面有一定的了解。
广告
将在 10 秒后关闭
bannerAds