3.用户认证

用户认证时序图

 用户认证执行流程

1.在shiro中,用户认证是从subject.login()为入口,最后会到进入到自定义Realm的doGetAuthenticationInfo()实现具体的操作,下面看一下具体的流程 。

 用户登入认证是将传入的用户名(username)和密码(password)设置到UsernamePasswordToken中生成token,再将token传入SecurityUtils.getSubject().login(token)中。

 2.首先会进入DelegatingSubject.login()方法中。可以发现在DelegatingSubject类中的login()方法中,调用了SecurityManager中的login()方法。

3.进入方法后,来到DefaultSecurityManager中的login(),在方法中将token传入了authenticate()中。DefaultSecurityManager为AuthenticatingSecurityManager的子类,

AuthenticatingSecurityManager为SecurityManager的子类。

 4.进入方法后,来到AuthenticatingSecurityManager中的authenticate()中,在方法中将token传入authenticate()中。

 5.进入方法后,来到AbstractAuthenticator中的authenticate(),在authenticate()中有一个doAuthticate()方法,doAuthenticate()是一个抽象方法,在ModularRealmAuthenticator中对doAuthenticate()进行了重写。ModularRealmAuthenticator为AbstractAuthenticator的子类,AbstractAuthenticator为Authenticator的子类

 6.进入ModularRealmAuthenticator中的doAuthenticate(),可以看出该方法是对Realm个数的判断,这里我们只自定义个一个Realm,执行doSingleRealmAuthentication()方法。

 7.进入ModularRealmAuthenticator中的doSingleRealmAuthentication(),在方法中,调用了realm中的getAuthenticationInfo(token)。

 8.进入AuthenticatingRealm中的getAuthenticationInfo(token)方法,其中有一个doGetAuthenticationInfo(),这是一个抽象方法,并在自定义的Realm中进行了方法重写,(自定义Realm继承了AuthorizingRealm类,AuthorizingRealm类又继承了AuthenticatingRealm类)

 9.以下为自定义realm中的doGetAuthenticationInfo()方法对AuthenticatingRealm中的doGetAuthenticationInfo()进行重写的内容。

 也可以返回,分别表示,principal相当于标识,也是以用户对象,第二个参数为数据库密码,第三个盐值,第四个为当前realm的名字,可以为空。

 10.info为doGetAuthenticationInfo()返回的数据,也就是说SimpleAuthenticationInfo对象,之后会进行密码比对,

 11,token和info传入到assertCredentialsMatch方法中,其中token中含有用户传入的密码,info中含有存入数据库中的密码。

 默认使用SimpleCredentialsMatcher密码比对器。

 12.执行成功后,返回至登入接口,继续执行下面步骤。

posted @ 2022-03-28 13:30  我所理解的代码  阅读(300)  评论(0)    收藏  举报