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.执行成功后,返回至登入接口,继续执行下面步骤。