spring security进阶

631 阅读4分钟

这是我参与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 并执行Filter0doFilter方法:

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(requestresponse);
}

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过滤链流程图

图片.png

框架的核心组件

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:未登陆,引导登陆