我正在为 Spring Security 和异常处理而苦苦挣扎。
我在我的 servlet 上下文中配置了以下异常处理程序:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="defaultErrorView" value="/errors/general-error"/>
<property name="defaultStatusCode" value="500" />
<property name="warnLogCategory" value="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"/>
</bean>
这会捕获任何未捕获的异常,并显示一般错误页面。
我还使用服务器上的 CAS 单点登录配置了 Spring Security。如果在我的安全配置中,我有以下内容:
<security:intercept-url pattern="/secure/**" access="hasRole('USER')" />
如果未经身份验证的用户访问“/secure”,他们会被正确重定向到登录,然后他们返回并可以查看该页面。
我更喜欢PreAuthorise()
在 MVC 方法上使用注释,而不是手动定义 URL。因此,如果我有以下注释:
@PreAuthorize("hasRole('USER')")
@RequestMapping("/secure")
public String displaySecurePage(
...
}
不会发生到 CAS SSO 服务器的重定向,Spring 只是显示一般错误页面,并带有异常org.springframework.security.access.AccessDeniedException: Access is denied
为什么定义访问权限的两种方式之间存在差异,以及如何使用PreAuthorise
带有 Spring 的注释正确引导未经身份验证的用户登录,并且仍然有一个异常处理程序来捕获其他异常?