SpringSecurity

Zuul 请求处理流程

  1. 请求到达ZuulServlet(继承 HttpServlet),初始化ZuulRunner,RequestContext 填充request和response。
  2. 调用 ZuulRunner分别pre,route,post类型的filter
  3. 通过FilterLoader 获取对应filter type的 filter集合
    • FilterRegistry返回 ConcurrentHashMap类型的 filters 集合
      • 通过spring IOC 把注入的所有 filter,通过 ZuulFilterConfiguration配置 初始化到 ZuulFilterInitializer 中
      • ZuulFilterInitializer 对ConcurrentHashMap类型的类型的 filterRegistry对象进行数据put
      • 把filterRegistry对象 按照 filterType分类,赋值为 ConcurrentHashMap<String, List> 类型的 hashFiltersByType对象
  4. 通过 FilterProcessor对象 处理对应filter类型的 filter集合
    • 得到ZuulFilter对象,调用对象本身runFilter方法

oauth/token接口请求流程

  1. 调用 TokenEndpoint.postAccessToken方法进行认证,授权
    • 前端传入 grant_type&client_id&client_secret&scope等参数
    • 通过ClientDetailsService接口根据clientId获取 ClientDetails对象
    • 通过DefaultOAuth2RequestFactory根据 scope,grant_type,ClientDetails等参数 创建TokenRequest对象
  2. 通过继承AbstractTokenGranter自定义类,调用getAccessToken方法获取token
    • 根据重写getOAuth2Authentication方法进行认证
    • 根据 DefaultTokenServices 创建返回 OAuth2AccessToken对象
      • 通过 TokenStore接口实现持久化方式类获得token
        • (JWT方式)生成一个过期时间为30天, 的refresh token对象
        • 生成一个过期时间为12小时的 Basic access token对象
        • 通过TokenEnhancer接口实现类对Basic access token对象进行增强(token加密)
      • 通过TokenStore接口实现类 存储accessToken和refreshToken
  3. 返回tokenEntity类

通过在应用接口层 实现AuthenticationEntryPoint接口

通过配置的security.oauth2.resource.user-info-uri 参数每次调用一次后台接口都会去passport-server请求一次 **oauth/user接口获取用户session信息

org.springframework.security.access.AccessDeniedException: Access is denied

Spring IOC 源码分析

当我们运行以下代码时:

ClassPathXmlApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

Spring会去加载配置文件,创建环境,创建bean。也就是IOC机制

附上一张依赖图

流程

调用构造方法

	public ClassPathXmlApplicationContext(
			String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
			throws BeansException {

		super(parent); // 合并父容器环境environment
		setConfigLocations(configLocations); // 封装配置文件地址路由为List集合
		if (refresh) { // refresh 加载
			refresh();
		}
	}

refresh过程

prepareRefresh 预处理

Spring AOP 源码分析

利用Java反射机制,面向切面编程,对代理对象进行增强编程

AOP配置文件解析流程分析

AOP配置文件首先通过 DefaultBeanDefinitionDocumentReader.parseBeanDefinitions 方法进行解析XML元素

AbstractAutoProxyCreator#postProcessAfterInitialization入口

代理对象执行流程分析