Spring Security 介绍
Spring Security介绍
- 开源
- 提供企业级的安全认证和授权
Spring安全拦截器
认证管理器
认证模式
Basic
HTTP 1.0中使用的认证方法,使用用户名和密码Base64编码的方式
浏览器弹出对话框,用户输入用户名和密码,加入头部
无状态
安全性不足
Digest
解决安全性问题
浏览器对用户名和密码请求方法,URL等进行MD5运算,发送到服务器
服务器获取到用户名密码,请求方法,URL等MD5运算,查看是否相等
安全性问题依然存在
X.509
访问决策管理器
运行身份管理器
常用权限拦截器
Spring-Security拦截器链流程图
介绍几个常用的Filter
SecurityContextPersistenceFilter
基于ThreadLocal
LogoutFilter
发送注销请求时,清空用户的session,cookie,重定向
AbstractAuthenticationProcessingFilter
用户登录的请求
DefaultLoginPageGeneratingFilter
生成登录页面
BasicAuthencationFilter
SecurityContextHolderAwareRequestFilter
包装,提供额外的数据
RememberMeAuthemticationFilter
提供RememberMe功能,当cookie中存在rememberme时,登录成功后生成唯一cookie
ExceptionTranlationFilter
请求到对应的页面,响应异常
ExceptionTranslationFilter异常处理过滤器,该过滤器用来处理在系统认证授权过程中抛出的异常(也就是下一个过滤器
FilterSecurityInterceptor
),主要是 处理AuthenticationException
和AccessDeniedException
SessionManagerFilter
FilterSecurityInterceptor(授权)
用户没有登录,抛出未登录异常
用户登录,但是没有权限访问该资源,抛出拒绝访问的异常
用户登录,有权限,则放行
此过滤器为认证授权过滤器链中最后一个过滤器,该过滤器之后就是请求真正的 服务
Filter如何执行
FilterChainProxy会按照顺序调用一组Filter,完成授权验证
请求首先经过Servlet Filter链,这里面包含6个Filter
可以看到如下的一个Filter
ApplicationFilterConfig[name=springSecurityFilterChain, filterClass=org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean$1]
这个就是Spring Security Filter的入口,它的类型是DelegationFilterProxy
那么,这个DelegationFilterProxy到底执行了什么样的操作呢?可以简单看一下源码
重点看一下部分的源码:
public class DelegatingFilterProxy extends GenericFilterBean {
// 类中的属性
@Nullable
private String contextAttribute;
@Nullable
private WebApplicationContext webApplicationContext;
@Nullable
private String targetBeanName;
private boolean targetFilterLifecycle = false;
/**
* 重点在于这个属性
*/
@Nullable
private volatile Filter delegate;
private final Object delegateMonitor = new Object();
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// Lazily initialize the delegate if necessary.
Filter delegateToUse = this.delegate;
if (delegateToUse == null) {
synchronized (this.delegateMonitor) {
delegateToUse = this.delegate;
if (delegateToUse == null) {
WebApplicationContext wac = findWebApplicationContext();
if (wac == null) {
throw new IllegalStateException("No WebApplicationContext found: " +
"no ContextLoaderListener or DispatcherServlet registered?");
}
delegateToUse = initDelegate(wac);
}
this.delegate = delegateToUse;
}
}
// Let the delegate perform the actual doFilter operation.
invokeDelegate(delegateToUse, request, response, filterChain);
}
// .......
/**
* Initialize the Filter delegate, defined as bean the given Spring
* application context.
* <p>The default implementation fetches the bean from the application context
* and calls the standard {@code Filter.init} method on it, passing
* in the FilterConfig of this Filter proxy.
* @param wac the root application context
* @return the initialized delegate Filter
* @throws ServletException if thrown by the Filter
*/
protected Filter initDelegate(WebApplicationContext wac) throws ServletException {
String targetBeanName = getTargetBeanName();
Assert.state(targetBeanName != null, "No target bean name set");
Filter delegate = wac.getBean(targetBeanName, Filter.class);
if (isTargetFilterLifecycle()) {
delegate.init(getFilterConfig());
}
return delegate;
}
// 调用delegate的doFilter方法
protected void invokeDelegate(
Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
delegate.doFilter(request, response, filterChain);
}
}
根据以上代码的注释我们可以看出大概的执行流程
那类中的Filter delegate是什么呢?断点调式运行可以找到以下东西
这是Spring Security 提供的一个FilterChainProxy,关注其中的关键源码
public class FilterChainProxy extends GenericFilterBean {
// 包含一组SecurityFilterChain
private List<SecurityFilterChain> filterChains;
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
boolean clearContext = request.getAttribute(FILTER_APPLIED) == null;
if (clearContext) {
try {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
doFilterInternal(request, response, chain);
}
finally {
SecurityContextHolder.clearContext();
request.removeAttribute(FILTER_APPLIED);
}
}
else {
doFilterInternal(request, response, chain);
}
}
private void doFilterInternal(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
FirewalledRequest fwRequest = firewall
.getFirewalledRequest((HttpServletRequest) request);
HttpServletResponse fwResponse = firewall
.getFirewalledResponse((HttpServletResponse) response);
// 根据请求获取匹配的一组Filter
// 这里返回的Filter就是上述的那些AuthenticationFilter,比如UsernamePasswordAuthenticationFilter
List<Filter> filters = getFilters(fwRequest);
if (filters == null || filters.size() == 0) {
if (logger.isDebugEnabled()) {
logger.debug(UrlUtils.buildRequestUrl(fwRequest)
+ (filters == null ? " has no matching filters"
: " has an empty filter list"));
}
fwRequest.reset();
chain.doFilter(fwRequest, fwResponse);
return;
}
VirtualFilterChain vfc = new VirtualFilterChain(fwRequest, chain, filters);
vfc.doFilter(fwRequest, fwResponse);
}
/**
* Returns the first filter chain matching the supplied URL.
*
* @param request the request to match
* @return an ordered array of Filters defining the filter chain
*/
private List<Filter> getFilters(HttpServletRequest request) {
for (SecurityFilterChain chain : filterChains) {
if (chain.matches(request)) {
return chain.getFilters();
}
}
return null;
}
}
到此,我们可以总结出如下的流程图:
Spring Security 介绍的更多相关文章
- Spring Security 介绍与Demo
一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...
- Spring Security安全框架入门篇
一.Spring Security相关概念 1.1..Spring Security介绍: Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安 ...
- Spring Security +Oauth2 +Spring boot 动态定义权限
Oauth2介绍:Oauth2是为用户资源的授权定义了一个安全.开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息,并且这是安全的. 简单的来说,当用户登陆网站的时候,需要账号 ...
- 「快学springboot」集成Spring Security实现鉴权功能
Spring Security介绍 Spring Security是Spring全家桶中的处理身份和权限问题的一员.Spring Security可以根据使用者的需要定制相关的角色身份和身份所具有的权 ...
- SpringBoot集成Spring Security
1.Spring Security介绍 Spring security,是一个强大的和高度可定制的身份验证和访问控制框架.它是确保基于Spring的应用程序的标准 --来自官方参考手册 Spring ...
- Java安全框架(一)Spring Security
Java安全框架(一)Spring Security 文章主要分三部分 1.Spring Security的架构及核心组件:(1)认证:(2)权限拦截:(3)数据库管理:(4)权限缓存:(5)自定 ...
- 权限管理3-整合Spring Security
一.Spring Security介绍 1.框架介绍 Spring 是一个非常流行和成功的 Java 应用开发框架.Spring Security 基于 Spring 框架,提供了一套 Web 应用安 ...
- Spring Security探究之路之开始
前言 在Spring Security介绍中,我们分析到了根据请求获取匹配的SecurityFilterChain,这个类中包含了一组Filter 接下来我们从这些Filter开始探究之旅 Sprin ...
- Spring Security 与 OAuth2 介绍
个人 OAuth2 全部文章 Spring Security 与 OAuth2(介绍):https://www.jianshu.com/p/68f22f9a00ee Spring Security 与 ...
随机推荐
- Ant 调用 Shell/CMD 命令
Ant中调用Makefile,使用shell中的make命令 <?xml version="1.0" encoding="utf-8" ?> < ...
- RabbitMQ --- 直连交换机 【 有回调方法,获取消费结果 】
1.前言 上一随笔详细记录了直连交换机的方法,发送的消息是异步的,如果消息未被消费者消费,那么可以一直存在消息队列中. 那么有没有办法做一个回调,当消息被消费后,被通知消息成功被消费者消费啦? 答案是 ...
- linux 设置root 密码
指令意思: sudo -i 是 切换到root权限 ,如果没有密码,则直接可以操作,有密码则会要求输入密码 sudo passwd root 是修改密码指令 ,回车后 提示输入新密码 新密码需要输 ...
- spring cloud --- config 从git 获取文件【 可能是yml或 properties】遇到有相同字段的取值规则
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 昨天做了 spring cloud config 配置中心 获取存在gi ...
- vue中使用window.resize并去抖动优化
this.clientWidth = document.documentElement.clientWidth window.onresize = () => { this.clientWidt ...
- JAVA SOCKET 详解
概述 本人在开发学习NETTY的过程中,需要了解很多的网络开发知识,在此我总结一些关于socket的基础知识,大部分是网络总结,在此篇的随笔中记录socket的知识,以便于记录,如有问题欢迎大家斧正. ...
- YC-Framework版本更新:V1.0.5
分布式微服务框架:YC-Framework版本更新V1.0.5!!! 本次版本V1.0.5更新 所有模块依赖调整: 部分问题修复: Nacos模块化: Eureka模块化: 支持SOA(即WebSer ...
- echart 横轴倾斜
xAxis: [ { type: 'category', data:[], axisLabel: { interval:0, rotate:40 }, grid: { left: '10%', bot ...
- golang中通过bufio和os包读取终端中输入的一行带空格的数据
1. 如果读取不带空格的数据可以使用fmt.Scan或fmt.Scanln读取一个或多个值,但是不能读取带空格的数据,可以使用bufio和os两个包结合 package main import ( & ...
- python-pip使用出现的问题
总结在pip过程中出现的问题 1.pip 安装指定数据源 默认情况下 pip 使用的是国外的镜像,在下载的时候速度非常慢 可以直接在 pip 命令中使用 -i 参数来指定镜像地址 例如:pip ins ...