这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
spring security简介
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。
spring security内部流程解析
Servlet Filter Chain
提到 Servlet Filter Chain 应该都熟悉的吧,它们是一系列由 javax.servlet.Filter 实现类组成的一个链,大致图如下所示:
Servlet Filter Chain
上图中Client发送Http请求,然后请求经过FilterChain,每个匹配的Filter都有机会处理request和response对象,最终请求会到达servlet(如何filter中没有特殊处理的情况下)。
Spring Security 的实现简单来说,就是往Servlet Filter Chain加了一个特殊的过滤器来处理认证或授权请求 。
DelegatingFilterProxy
Spring 提供一个javax.servlet.Filter的实现类 DelegatingFilterProxy ,它的主要功能跟它的名称一样,通过代理模式委托给一个Spring管理的Bean来完成相应的功能。
DelegatingFilterProxy
在上图中,DelegatingFilterProxy 会在 ApplicationContext 中查找 Filter0 并执行Filter0的doFilter方法:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// Lazily get Filter that was registered as a Spring Bean
// For the example in DelegatingFilterProxy delegate is an instance of Bean Filter0
Filter delegate = getFilterBean(someBeanName);
// delegate work to the Spring Bean
delegate.doFilter(request, response);
}
FilterChainProxy
前面说过DelegatingFilterProxy只是一个代理 Filter,并没有真正的功能。
在 Spring Security 中还有一个 FilterChainProxy 类,它是 Spring Security 中非常重要的入口(断点打在这准没错) ,它负责匹配请求、执行 Filter 等功能。
认证
Spring Security提供了很多过滤器,它们拦截Servlet请求,并将这些请求转交给认证处理过滤器和访问决策过滤器进行处理,并强制安全性认证用户身份和用户权限以达到保护WEB资源的目的,Spring Security安全机制包括两个主要的操作,认证和验证,验证也可以称为权限控制,这是Spring Security两个主要的方向,认证是为用户建立一个他所声明的主体的过程,这个主体一般是指用户设备或可以在系统中执行行动的其他系统,验证指用户能否在应用中执行某个操作,在到达授权判断之前身份的主体已经由身份认证过程建立了。下面列出几种常用认证模式。
- Basic:HTTP1.0提出,一种基于challenge/response的认证模式,针对特定的realm需要提供用户名和密码认证后才可访问,其中密码使用明文传输。缺点:①无状态导致每次通信都要带上认证信息,即使是已经认证过的资源;②传输安全性不足,认证信息用Base64编码,基本就是明文传输,很容易对报文截取并盗用认证信息。
- Digest:HTTP1.1提出,它主要是为了解决Basic模式安全问题,用于替代原来的Basic认证模式,Digest认证也是采用challenge/response认证模式,基本的认证流程比较类似。Digest模式避免了密码在网络上明文传输,提高了安全性,但它仍然存在缺点,例如认证报文被攻击者拦截到攻击者可以获取到资源。
- X.509:证书认证,X.509是一种非常通用的证书格式,证书包含版本号、序列号(唯一)、签名、颁发者、有效期、主体、主体公钥。
- LDAP:轻量级目录访问协议(Lightweight Directory Access Protocol)。
- Form:基于表单的认证模式。
spring security过滤链流程图
框架的核心组件
SecurityContextHolder:提供对SecurityContext的访问
-
SecurityContext:持有Authentication对象和其他可能需要的信息
-
AuthenticationManager:其中可以包含多个AuthenticationProvider
-
ProviderManager对象:为AuthenticationManager接口的实现类
-
AuthenticationProvider:主要用来进行认证操作的类 调用其中的authenticate()方法去进行认证操作
-
Authentication:Spring Security方式的认证主体
-
GrantedAuthority:对认证主题的应用层面的授权,含当前用户的权限信息,通常使用角色表示
-
UserDetails:构建Authentication对象必须的信息,可以自定义,可能需要访问DB得到
-
UserDetailsService:通过username构建UserDetails对象,通过loadUserByUsername根据userName获取UserDetail对象
spring security应用之登录
Spring Security整个过程分为认证授权,权限校验两个部分
认证授权:验证username + password是否合法
权限校验:判断当前用户是否有相关访问权限
Security拦截流程
1:每次请求过来尝试获取security 上下文,(session,redis)
2:FilterSecurityInterceptor检验当前用户是否有权限访问该请求,
case1:有权限:放行
case2:无权限,return 403
case3:未登陆,引导登陆