Spring Security 的架构
一、要对Web资源进行保护, 最好的办法莫过于Filter, Spring Security 对Web资源的保护,
就是靠Filter实现的。一般来说, Filter 应该配置在 web.xml 中, 但Spring Security
在web.xml 中配置的只是一个代理(DeletegatingFilterProxy)这些过滤器中的每一个都必
须被注入来自 Spring 应用程序上下文的其他 Bean. 但 Servlet 规范并没有使得 Servlet
过滤器上的依赖注入容易进行.DeletegatingFilterProxy 通过充当 Spring 应用程序中被
配置为 Bean 的实际过滤器的“挂名人物” 来解决这个问题.真正起作用的 Filter 是
Spring 上下文中的那些 Filter Bean. web.xml 中的代理依次调用这些Bean, 实现对Web
资源的保护.
二、AuthenticationProcessingFilter
处理 form 登陆的过滤器, 与 form登陆有关的所有操作都是在此进行的.
默认情况下只处理/j_spring_security_check 请求, 这个请求应该是用户使用 form登陆后的提交地址
此过滤器执行的基本操作时, 通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能
是登陆之前访问的受保护页面, 也可能是默认的成功页面), 如果登录失败, 就跳转到失败页面
登录流程:
①Spring Security 使用认证过程过滤器(AuthenticationProcessingFilter) 来处理表单认证, 当接受
到与filterProcessesUrl(默认值为: /j_spring_security_check) 所定义相同的请求时认证过程过滤
器开始工作。
②AuthenticationProcessingFilter 调用AuthenticationManager (认证管理器)以确认用户的身份是否合法.
③org.springframework.security.AuthenticationManager 接口定义了一个 authenticate 方法,
它使用 Authentication 作为入口参数(只包含用户名和密码), 并在验证成功后返回一个完整的
Authentication 对象(包含用户的权 限信息GrantedAuthority数组对象)
④如果认证失败会抛出一个跳转到 authenticationFailureUrl 定义的 URL
⑤Spring Security 使用 org.springframework.security.providers.ProviderManager(提供者管理器)
类作为AuthenticationManager(认证管理器)的一个实现, 该类是继承自实现了
AuthenticationManager 接口的AbstractAuthenticationManager类.
⑥ProviderManager(提供者管理器) 自己并不实现身份验证, 而是把这项工作交给了多个认证提供者(提供者集合)