spring security

场景:张三是一个老师,他应邀去参加教师节活动(认证)去领取教师节礼物(授权、鉴权);李四不是老师,不能参加活动(认证失败)。
--Principal接口--->被认证/授权者。对应现实中的用户,对现实中的用户的抽象,该用户可能是一个用户名,也可能是一个token(Token可以理解为由原始的基于账号密码的Principal转换的基于一串加密的字符串的Pricipal,本质上都是一个唯一用户标识),反正就是一个标识。提供一个获取用户名称/个人标识的方法(getName())。(普通自然人张三)
--UserDetails--->用户的详细信息,代表的是自己业务系统(用户系统)的账号,对应用户表。用来比对密码,账号等可以实现Principal接口,用来当做Principal的扩展;
--UserDetailService--->用来查询用户详细信息的Service。
--Authentication接口--->认证/授权后的主体。是对现实中的用户加上一些认证/授权信息后形成的对象的抽象。继承自Principal,除此之外,还定义了方法:获取被认证者的详细信息(getDetail());判断是否已经通过认证(isAuthenticated());设置认证结果(是否通过授权setAuthenticated());获取身份“凭证”,如密码等——根据实际情况来判断(getCredentials())。认证的目的就是生成这个实体.(通过身份验证后的张三。此时,它已经从一个普通自然变成了该活动的'嘉宾'了,具有领礼物的权利,没通过认证的李四就没能成为嘉宾。)
--AbstractAuthenticationToken抽象类--->Authentication的最重要抽象实现类。除了实现Authentication接口的方法外,还持有一个GrantedAuthority列表,用来记录该用户具有哪些权限。
--GrantedAuthority接口--->权限的抽象。每一个实现类就是一个权限,提供一个获取权限标识的方法(getAuthority())。一个通过认证后的用户就具有若干权限,即若干该接口的实现类。这些权限集合保存在授权后的主体AbstractAuthenticationToken中,通过getAuthority()方法获取。(比如教师节活动上,可以吃水果,可以领礼物的权限等)注意:SpringSecurity里权限和角色都用GrantedAuthority封装,通过ROLE_前缀来区分角色。

以上为“数据对象”,也就是用来承载数据的(类似java里的VO)。还有一些类用来执行操作,主要为认证鉴权操作(XXXManager,XXXProvider),如下:

--AuthenticationManager接口--->认证管理器,用来执行具体认证逻辑的接口。该接口提供了一个authenticate(Authentication var1)方法,用来执行具体的认证逻辑。入参是一个Authentication对象,出参也是一个Authentication对应,入参对象是原始用户基本信息(Principal),出参对象是一个根据用户基本信息认证后的对象,包含认证结果等信息。(它就像一个保安,用户输入他的基本信息,经过保安的认证成功后(也可能失败),给他一个通行证。人还是这个人,多了个通行证信息)
--RunAsManager--->另外一种Manager,用另外一个身份去认证。
--AuthenticationProvider`接口--->上面提到AuthenticationManager负责认证。但他相当于一次性认证,而在实际运用场景中,整个认证流程可能分为很多环节,形成一个链条。所以每个环节封装成用一个AuthenticationProvider实例。AuthenticationProvider提供了两个方法,一个authenticate(Authentication var1),作用同AuthenticationManager的该方法,还有一个supports(Class var1)方法,用来确定该环节对哪些类有效。
--ProviderManager接口--->继承AuthenticationManager,处理多个认证环节的AuthenticationManager。书接上文,多个AuthenticationProvider需要交给一个Manager统一处理,ProviderManager持有一个AuthenticationProvider集合,通过遍历执行各个AuthenticationProvider,AuthenticationManager将认证逻辑(authentication(Authentication var1))委托给各个Provider去执行。只要一个Provider不成功,就返回认证失败。
--AuthenticationManagerBuilder--->用来构建AuthenticationManager,指定认证元数据,包含账号密码等,该数据可以从内存读取,也可以从数据库读取。(告诉保安,具备哪些信息和特征的人才能进入,然后保安就根据这些信息去认证(调用AuthenticationManager.authenticate(Authentication var1)))
--SpringSecurityContext--->安全上下文容器,用来保存获取权限认证的一些主体信息,可以再当前安全范围内通过调用静态方法的方式随时随地传递Principal信息。类比保安部门,所有安保相关的信息都保存在这里,包括Authentication信息等。SpringSecurityContext可以通过SpringSecurityContextHolder获取,同时它也被保存杂HttpSession中(该保存动作由SecurityContextPersistenceFilter执行,该过滤器包含在整个过滤链中,它除了保存上下文信息外,也负责当请求完成后清除上下文信息)。但是我们一般不从HttpSesstion中获取,而是从SpringSecurityContext中获取。
--SpringSecurityContextHolder--->获取安全上下文容器的"把手"类比进入保安部办公室钥匙,可以通过这个holder获得(进入)保安部。
--ExceptionTranslationFilter--->该过滤器用来检测Spring Security异常,统一处理各种异常(认证异常或者权限不足)。这些异常通常由各个拦截器AbstractSecurityInterceptor抛出。
--AuthenticationEntryPoint--->没有认证直接访问接口的处理逻辑类。用来处理没有认证时的情况,一般是跳转到登录页面去登录。
--AccessDecisionManager--->权限管理器,负责检验是否具有权限访问受保护的资源。通过decide(Authentication var1, Object var2, Collection var3)方法校验是否具有权限。该方法的三个属性分别是待鉴权主体(用户),安全对象(一个方法调用或者一个web请求),配置属性(配置中指定的需要哪些权限,当然你也可以在decide方法中实现成不需要这些权限)。
--AbstractSecurityInterceptor--->拦截器接口,每个安全对象类型(一个方法调用或者一个web请求)都有特定的AbstractSecurityInterceptor 实现类,用来拦截对应的安全对象并调用相关的Manager去实现认证鉴权。
--SecurityMetadataSource-->用来获取安全对象(一个方法调用或者一个web请求)需要的权限,再结合Principal中保存的用户权限信息调用对应的投票器来决定是否通过鉴权。

image.png

你可能感兴趣的:(spring security)