一、认证和授权的概念必须牢记,是学好springSecurity的关键。
1、认证(authentication) 认证是鉴别我们应用中的用户是他们所声明的那个人。认证有3种场景:凭据为基础的认证(用户名、密码)、两要素认证(密码和物理设备)、硬件认证。
2、授权(authorization) 授权涉及两个方面,他们共同描述对安全系统的可访问性:已经认证的安全实体与一个或者多个权限的匹配关系、分配权限给系统需要保护的资源
用户请求简单的说分为两个环节:首先被认证管理器(AuthenticationManager)拦截进行认证此环节是认证的过程;认证后的请求又被访问决策管理器(AccessDecisionManager)拦截验证权限,此环节是授权的过程。
二、用户请求是如何处理的
SpringSecurity 在实现上依赖代理和Servlet过滤器,来实现绕在web应用请求前后的功能层。其在XML配置文件中的自动配置属性,建立了10个过滤器,他们通过JavaEE的过滤器链按照顺序组合起来。servlet请求按照一定的顺序从一个过滤器到下一个过滤器,最终达到Servlet。与之相对的是,Servlet处理完请求并返回一个Response后,过滤器链按照相反的顺序再次穿过所有的过滤器。
自动配置的选项创建了10个过滤器,理解这些过滤器的默认行为以及他们在哪里是如何配置的,对使用SpringSecurity的高级功能至关重要。
1、org.spring.security.web.context.SecurityContextPersistenceFilter
负责从SecurityContextRepository获取或存储SecurityContext。SecurityContext代表了用户安全和认证过的session。
2、org.spring.security.web.authentication.logout.LogoutFilter
监控一个实际为退出功能的URL(默认为/j_spring_security_logout),并且在URL匹配时完成用户的退出功能。
3、org.spring.security.web.authentication.UsernamePasswordAuthenticationFilter
监控一个使用用户名和密码基于form认证的URL(默认为/spring_security_check),并在URL匹配的情况下验证该用户。
4、org.spring.security.web.authentication.ui.DefaultLoginPageGeneratingFilter
监控一个要进行基于form或OpenID认证的URL(默认为/spring_security_login),并生成展现登录form的HTML。
5、org.spring.security.web.authentication.www.BasicAuthenticationFilter
监控HTTP基础认证的头信息并进行处理
6、org.spring.security.web.savedrequest.RequestCacheAwareFilter
用户用户登录成功后,重新恢复因为登录被打断的请求
7、org.spring.security.web.servletapi.SecurityContextHolderAwareRequestFilter
用一个扩展了HttpServletRequestWrapper的子类(org.spring.security.web.servletapi.SecurityContextHolderAwareRequestWrapper)包装HttpServletRequest。它为请求处理器提供了额外的上下文信息。
8、org.spring.security.web.authentication.AnonymousAuthenticationFilter
如果用户到这一步还没有经过认证,将会为这个请求关联一个认证的token,标识此用户是匿名的。
9、org.spring.security.web.session.SessionManagementFilter
根据认证的安全实体信息跟踪session,保证所有关联一个安全实体的session都能被跟踪到。
10、org.spring.security.web.access.ExceptionTranslationFilter
解决在处理一个请求时产生的指定异常。
11、org.spring.security.web.access.intercept.FilterSecurityInterceptor
简化授权和访问控制决定,委托一个AccessDecisionManager完成授权的判断。