xinrong2019 / xinrong2019.github.io

My Blog
https://xinrong2019.github.io
1 stars 1 forks source link

20180522 Spring Security之入口分析续及运行流程分析 #28

Open xinrong2019 opened 5 years ago

xinrong2019 commented 5 years ago

上周对Sping Security做了一些分析,知道了如何配置资源不走权限认证、认证入口干了哪些事、ProviderManager中的执行逻辑、用户请求的用户密码和数据库中保存的用户密码是如何匹配的逻辑。

还有一些问题没有分析完成,比如后续的几个标签没有分析完:access-denied-handler、intercept-url、logout、anonymous、request-cache,比如完整执行流程是什么,之前说的很分散,逐个去分析的。下面一个个来。

xinrong2019 commented 5 years ago

宏观,权限认证运行流程

切入点是基于filter

涉及的知识点:filter的生命周期、责任链模式

xinrong2019 commented 5 years ago

2019年6月10日

时隔近20天了,中间看了网络、算法、Zookeeper,还有其他各种刷抖音、打游戏、打篮球、看电影。

涨工资,越来越难了,因为意识到自己执行力变得差了,非常的慌


Spring Security应用是怎么启动的?启动流程

之前分析了Spring Security的入口是从entry-point配置开始的,核心应该是通过Filter拦截每次请求,然后将请求分发到Spring Security的逻辑上来。下面看看具体是怎么做的?

从AuthenticationEntryPoint开始

它有几种实现:LoginUrlAuthenticationEntryPoint、BasicAuthenticationEntryPoint、DigestAuthenticationEntryPoint、HttpBasicConfigurer.HttpStatusEntryPoint、Http403ForbiddenEntryPoint、DelegatingAuthenticationEntryPoint

登录入口用的是LoginUrlAuthenticationEntryPoint实现。

AuthenticationEntryPoint的执行时机,ExceptionTranslationFilter

AuthenticationEntryPoint接口是什么时候执行的呢?

是在org.springframework.security.web.access.ExceptionTranslationFilter中执行的

这个类实现了javax.servlet.Filter接口

Filter接口是Java Web过滤器规范,有三个方法:

public void init(FilterConfig filterConfig) throws ServletException;

public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain ) throws IOException, ServletException;

public void destroy();
xinrong2019 commented 5 years ago

自己写Spring Security源码的分析的文章后小结:

1、水平有限,看东西深深浅浅,很长时间才能抓住重点

看源码先看总体运行逻辑,特别是接口和抽象类中定义了规范和主线流程,还有这些接口和抽象类的Javadoc一般也会将接口干什么的、涉及到的相关类写的很具体。

2、太关注细节,很长时间才能知道主线流程

其实和1一样,不要一开始钻进细节太深,总结起来,应该是先理论(接口和Javadoc),再实践(具体实现和usage),再回到理论去理解理解

3、相关基础薄弱,主线流程涉及的基础没有搞懂,必须得搞懂基础的接口

因为基础的阻塞,需要花时间看,基础的知识点使用频率是高频重复,理解后看其他的都容易理解,收益其实挺高的。

4、写文章,是基于边看源码边写的。通过对关键源码和Javadoc一字一字的读和理解,深深的体会到,看别人的源码分析的时候,真的要耐心一字一字看完,否则一有细节遗漏,是完全不知道的,还自以为是自己看懂了。

Spring Security源码解析推荐文章,自己在看