accessDeniedHandler用于处理AccessDeniedException异常,当用户没有权限访问当前请求的资源时抛出此异常,并跳转自这里配置的/accessDenied.jsp页面。
authenticationEntryPoint(认证入口点),这里定义了用户登录的页面。系统为我们提供了3个认证入口点的实现:
认 证 入 口 点 | 作 用 |
BasicProcessingFilterEntryPoint | 通过向浏览器发送一个HTTP 401(未授权)消息,由浏览器弹出登录对话框,提示用户登录 |
AuthenticationProcessingFilterEntryPoint | 将用户重定向到一个基于HTML表单的登录页面 |
CasProcessingFilterEntryPoint | 将用户重定向至一个Yale CAS登录页面 |
这里我们使用AuthenticationProcessingFilterEntryPoint认证入口点,提供给用户一个友好的登录界面,只是为了给用户更好的体验。
filterSecurityInterceptor(过滤器安全拦截器),该过滤器首先调用认证管理器来判断用户是否已被成功验证,如果没有被验证则重定向到登录界面。否则,从Authentication获取用户的权限信息,然后从objectDefinitionSource中获取URL所对应的权限,最后调用accessDecisionManager(访问决策管理器)来判断用户当前拥有的权限是否与当前受保护的URL资源对应的权限匹配,如果匹配就可以访问该URL资源,否则将抛出AccessDeniedException异常并返回客户端浏览器一个403错误(如果用户定义了 accessDenied页面则会被重定向到该页,见:异常处理过滤器exceptionTranslationFilter中配置的 accessDeniedHandler Bean),访问决策管理的的工作机制将在随后更详细介绍,这里先给出过滤器安全拦截器的配置如下:
2
3 class ="org.springframework.security.intercept.web.FilterSecurityInterceptor"
4
5 p:authenticationManager-ref ="authenticationManager"
6
7 p:accessDecisionManager-ref ="accessDecisionManager" >
8 < property name ="objectDefinitionSource" >
9 < value > <![CDATA[
10
11 CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
12 PATTERN_TYPE_APACHE_ANT
13 /admins/**=ROLE_SUPERVISOR
14 /user/**=ROLE_USER,IS_AUTHENTICATED_REMEMBERED
15 /default.jsp=ROLE_USER,IS_AUTHENTICATED_REMEMBERED
16 /**=IS_AUTHENTICATED_ANONYMOUSLY
17 ]]> </ value >
18 </ property >
19 </ bean >
从配置可以看出来,过滤器安全拦截器用到了我们前面配置的认证管理器,过滤器安全拦截器使用authenticationManager并调用它的 providers(提供者列表)来对用户的身份进行验证并获取用户拥有的权限。如果用户被成功认证,过滤器安全拦截器将会使用 accessDecisionManager(访问决策管理器)来判断已认证的用户是否有权限访问受保护的资源,这些受保护的资源由 objectDefinitionSource属性定义。
访问决策管理器(accessDecisionManager):
2 class ="org.springframework.security.vote.AffirmativeBased"
3 p:allowIfAllAbstainDecisions ="false" >
4 < property name ="decisionVoters" >
5 < list >
6 < bean class ="org.springframework.security.vote.RoleVoter" />
7 < bean class ="org.springframework.security.vote.AuthenticatedVoter" />
8 </ list >
9 </ property >
10 </ bean >