如何在Spring Security中获取AccessDeniedException的"原因"/原因?

Ric*_*ini 9 spring exception-handling exception spring-security

我们将Spring Security 3.1.3-RELEASE与方法级安全性一起使用.它完美地运作.

我想记录,也许展现给用户,为什么他越来越拒绝访问.

使用org.springframework.security.web.access.AccessDeniedHandlerImpl子类,我可以获得对org.springframework.security.access.AccessDeniedException抛出的引用,但是我找不到一种方法来确定导致它的原因(例如,"缺少角色ROLE_ADMIN"或其他东西).

我错过了什么,还是根本不存在?

Mac*_*rko 5

不幸的是,Spring Security 中可用的默认实现是不可能的。

我调查了源代码并...

MethodSecurityInterceptor负责保护方法调用。它将访问决策委托给AccessDecisionManager。我检查了每一个AccessDecisionManager可用的开箱即用的实现。

  • 基于肯定的
  • 基于共识
  • 一致通过

他们每个人都AccessDeniedException以类似的方式抛出异常。

case AccessDecisionVoter.ACCESS_DENIED:
                throw new AccessDeniedException(
                      messages.getMessage("AbstractAccessDecisionManager.accessDenied",
                      "Access is denied")
                 );
Run Code Online (Sandbox Code Playgroud)

AbstractAccessDecisionManager.accessDenied 是消息的名称,可以本地化。

对于英语,它是:

AbstractAccessDecisionManager.accessDenied=Access is denied
Run Code Online (Sandbox Code Playgroud)

有多种开箱即用的语言,您可以自行翻译,但是...

就是这样,没有更多关于异常原因的信息。

有关异常消息本地化的更多信息:

http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html#localization