该文主要对Spring security认证模块的架构进行解析。
整体架构图
流程解释
1.上述出现的组件是认证模块中最为核心的一些组件,了解这些组件之间的关系,有利于掌握Spring Security的使用,在企业中使用Spring Security多是基于这种结构扩展开来的;
2.用户名/密码由后端获取,并且需要组建成Authentication对象,此时Authentication的认证状态应为"未认证";
3.对于Authentication,不要将其想复杂,它是一个主体,代表当前用户,包含用户名/密码/授权范围,还包含一个最重要的东西——认证状态,它贮藏在SecurityContext上下文中,这意味着你可以在过滤器中随时获取它, 一旦获取到它,认证状态也就立刻知晓,你的系统也就知晓,是否该允许这个用户访问API资源,或者是将其阻挡在外;
4.ProviderManager,非常重要的组件,核心方法是authenticate(),顾名思义,它用于执行认证的主逻辑;它内部维护了一个list对象,这个对象是providers,list中可以放入许多个provider,authenticate()方法会迭代providers,将所有provider的认证逻辑都执行一次,如果都通过了,代表当前用户认证通过,并且随之返回一个新的Authentication,该Authentication中包含当前的认证状态——已通过;
5.AuthenticationProvider,即ProviderManager的providers中的对象,提供具体的认证逻辑;举个例子,DaoAuthenticationProvider是具体的实现类,你可以将它添加到providers中,那么在执行认证时,实际上是执行DaoAuthenticationProvider的逻辑,它的逻辑是:将Authentication中的密码和cache(或者是jdbc)中的密码进行比较;
6.上述图示中第二个Authentication对象,仅是更新了认证状态为已认证,除此别无二样;但是它和前一个Authentication非同一个对象,因为它是重新创建的;
7.认证完成后,你必须将其保存在上下文中,以便过滤器可以获取到,判断是否放行,否则你之前所做的一切操作毫无意义;保存的方法是:SecurityContextHolder.getContext().setAuthentication(...);
技术细节
暂无
小结
1.认证架构中的核心是ProviderManager/AuthenticationProvider,即认证逻辑的提供者;后续文章会继续进一步介绍;
2.这是最基础的认证架构,需要理解完整,后续会推出更完整的架构,包括UserDetailService,PasswordEncoder这些组件,它们在何时出现,怎么使用,都会一一叙述。