SpringSecurity介绍


Spring Security 简介

  Spring 是一个非常流行和成功的java应用开发框架。 

  Spring Security 基于Spring 框架,提供了一套web应用安全性的完整解决方案。

  一般来说,Web 应用的安全性包括两部分:

    1. 用户认证(Authentication)

      用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。

    2. 用户授权(Authorization)

      用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。

      一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限

  对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。

  在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。

  在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

Security 原理分析

SpringSecurity 过滤器链

  SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤器链的各个进行说明:

  1. WebAsyncManagerIntegrationFilter: 将Security上下文与Spring Web 中用于处理异步请求映射的WebAsyncManager进行集成。
  2. SecurityContextPersistenceFilter在每次请求处理之前将该请求相关的安全上下文信息加载到 SecurityContextHolder 中,然后在该次请求处理完成之后,将 SecurityContextHolder 中关于这次请求的信息存储到一个“仓储”中,然后将 SecurityContextHolder 中的信息清除,例如在Session中维护一个用户的安全信息就是这个过滤器处理的。
  3. HeaderWriterFilter用于将头信息加入响应中。
  4. CsrfFilter用于处理跨站请求伪造。
  5. LogoutFilter用于处理退出登录。
  6. UsernamePasswordAuthenticationFilter用于处理基于表单的登录请求,从表单中获取用户名和密码。默认情况下处理来自 /login 的请求。从表单中获取用户名和密码时,默认使用的表单 name 值为 username 和 password,这两个值可以通过设置这个过滤器的usernameParameter 和 passwordParameter 两个参数的值进行修改。

  7. DefaultLoginPageGeneratingFilter如果没有配置登录页面,那系统初始化时就会配置这个过滤器,并且用于在需要进行登录时生成一个登录表单页面。
  8. BasicAuthenticationFilter检测和处理 http basic 认证。
  9. RequestCacheAwareFilter用来处理请求的缓存。
  10. SecurityContextHolderAwareRequestFilter主要是包装请求对象request。
  11. AnonymousAuthenticationFilter检测 SecurityContextHolder 中是否存在 Authentication 对象,如果不存在为其提供一个匿名 Authentication。
  12. SessionManagementFilter管理 session 的过滤器
  13. ExceptionTranslationFilter处理 AccessDeniedException 和 AuthenticationException 异常
  14. FilterSecurityInterceptor可以看做过滤器链的出口。
  15. RememberMeAuthenticationFilter当用户没有登录而直接访问资源时, 从 cookie 里找出用户的信息, 如果 Spring Security 能够识别出用户提供的remember me cookie, 用户将不必填写用户名和密码, 而是直接登录进入系统,该过滤器默认不开启。

流程说明

  1. 客户端发起一个请求,进入 Security 过滤器链。
  2. 当到 LogoutFilter 的时候判断是否是登出路径,如果是登出路径则到 logoutHandler ,如果登出成功则到 logoutSuccessHandler 登出成功处理,如果登出失败则由 ExceptionTranslationFilter ;如果不是登出路径则直接进入下一个过滤器。
  3. 当到 UsernamePasswordAuthenticationFilter 的时候判断是否为登录路径,如果是,则进入该过滤器进行登录操作,如果登录失败则到 AuthenticationFailureHandler 登录失败处理器处理,如果登录成功则到 AuthenticationSuccessHandler 登录成功处理器处理,如果不是登录请求则不进入该过滤器。
  4. 当到 FilterSecurityInterceptor 的时候会拿到 uri ,根据 uri 去找对应的鉴权管理器,鉴权管理器做鉴权工作,鉴权成功则到 Controller 层否则到 AccessDeniedHandler 鉴权失败处理器处理。

SpringSecurity 核心组件

  1. SecurityContextHolder提供对SecurityContext的访问
  2. SecurityContext,:持有Authentication对象和其他可能需要的信息
  3. AuthenticationManager其中可以包含多个AuthenticationProvider
  4. ProviderManager:对象为AuthenticationManager接口的实现类
  5. AuthenticationProvider :主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作
  6. Authentication:Spring Security方式的认证主体
  7. GrantedAuthority对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示
  8. UserDetails构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到
  9. UserDetailsService通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象 (可以在这里基于自身业务进行自定义的实现  如通过数据库,xml,缓存获取等) 

 


UserDetails和UserDetailsService介绍

  大多数的身份验证程序都利用UserDetails和UserDetailsService接口,身份认证最常用的方法是加载相应的UserDetails并检查加载的密码和用户输入的密码。

//UserDetails 
public interface UserDetails extends Serializable {
  // 获取用户权限信息 Collection
<? extends GrantedAuthority> getAuthorities();   // 获取用户密码 String getPassword();   //获取用户名称 String getUsername();   // 用户是否没有过期 true:没有过期 boolean isAccountNonExpired();   //用户是否锁定 boolean isAccountNonLocked();   // 用户密码是否过期 boolean isCredentialsNonExpired();   // 用户是否可用 boolean isEnabled(); } //UserDetailsService public interface UserDetailsService { UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException; }

UserDetails接口:Spring Security的基础接口,包含了用户的账号、密码、状态(是否锁定)、权限等信息。

UserDetailsService接口:提供了给用户获取信息的方法,所以它就定义了一个接口,然后由你去实现它,在Spring Security快加里提供的UserDetailsService接口默认实现了:

  • 内存身份验证(InMemoryDaoImpl):存储于内存空间
  • JdbcDaoImpl:存储于数据库(磁盘上)

总结:简单来说,UserDetailService只单纯地负责存取用户信息,除了给框架内的其他组件提供数据外没有其他功能。而认证过程是由AuthenticationManager来完成的。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM