shiro介绍
Shiro是一个Java平台的开源权限框架,用于认证和访问授权
shiro用户验证流程
流程1:主要初始化一些关于shiro需要用到的相关对象;例如:初始化SecurityManager工厂
流程2:suject.login(token)验证用户名密码;token中带有用户名和密码信息
流程3:调用SecurityManager.login(token)
流程4:AuthenticatingRealm.getAuthenticationInfo(AuthenticationToken token)为主要的验证用户方法;AuthenticatingRealm属于抽象类,通过getAuthenticationInfo(AuthenticationToken token)方法已经封装好了验证用户信息的流程,但是暴露出一个抽象方法,即:AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token);让自定义的reamls根据自己的逻辑去获取AuthenticationInfo对象
流程5:就是流程4里面验证的具体主要信息
subject.login(token)里面的具体细节
从源码可以得知Subject是接口,实现该接口的类有:
1.Subject(接口):
DelegatingSubject(实现类):从源码可以得知是subject默认实现,因为有login(token)方法
WebDelegatingSubject(实现类):
2.DelegatingSubject.login():方法会调用securityManager.login(this, token)方法;
调用此方法中最重要的一个过程是调用new ModularRealmAuthenticator()对象的doAuthenticate(AuthenticationToken authenticationToken)方法
protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException { assertRealmsConfigured(); Collection realms = getRealms();
if (realms.size() == 1) {
return doSingleRealmAuthentication(realms.iterator().next(), authenticationToken);
} else {
return doMultiRealmAuthentication(realms, authenticationToken);
}
}
从以上方法可以看出 getRealms()获取我们自定义配置的realms,然后依次调用
shiro里面一些主要的接口以及实现
接口:
securityManager:
主要方法:
Subject login(Subject subject, AuthenticationToken authenticationToken) throws AuthenticationException;
void logout(Subject subject);
Subject createSubject(SubjectContext context);
Realm:
主要方法:
String getName();
boolean supports(AuthenticationToken token);
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;
CredentialsMatcher:
主要方法:
boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info);
接口实现:
实现securityManager接口实现关系:
securityManager:
CachingSecurityManager(抽象实现类):
RealmSecurityManager(抽象实现类):
AuthenticatingSecurityManager:(抽象实现类)
AuthorizingSecurityManager(抽象实现类):
SessionsSecurityManager(抽象实现类):
DefaultSecurityManager(实现类):
实现Realm接口实现关系:
Realm(接口)
CachingReaml(抽象类):只是添加了cacheManager属性并没有实现Realm接口方法
AuthenticatingRealm(抽象类):实现了Realm接口getAuthenticationInfo(AuthenticationToken token)方法并定义为final类型,也就是说从该层开始以下的类不能在重写该方法只能重写新引入doGetAuthenticationInfo(token)抽象方法获取AuthenticationInfo对象;引入CredentialsMatcher接口对象,通过调用该对象的doCredentialsMatch(token, info)方法实现验证;(回调函数) 注意:/**getAuthenticationInfo方法定义为final,不能被重写**/ 啰嗦这么多总结一句话:就是AuthenticatingRealm类已经对getAuthenticationInfo(AuthenticationToken token)方法定制好了业务逻辑,只需要实现里面的细节
AuthorizingRealm(抽象类):doGetAuthenticationInfo(token)实现该方法,实现自己的业务逻辑
实现CredentialsMatcher接口实现关系:
CredentialsMatcher:
AllowAllCredentialsMatcher(实现类):doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) return true; 所有都通过验证
PasswordMatcher(实现类):该类有passwordService对象,通过passwordService.passwordsMatch(submittedPassword, formatted)实现加密密码的验证;
SimpleCredentialsMatcher(实现类):简单的身份验证
关联的一些重要接口:
PasswordService(接口):
主要方法:
//顾名思义对密码加密
String encryptPassword(Object plaintextPassword) throws IllegalArgumentException;
//加密密码的验证
boolean passwordsMatch(Object submittedPlaintext, String encrypted);
实现关系:
HashingPasswordService(接口):实现PasswordService
DefaultPasswordService(实现类):默认:DEFAULT_HASH_ALGORITHM = "SHA-256"
shiro权限验证流程
流程2:获取一些拦截器;其中包括:
1)RoleAnnotationMethodInterceptor;
2)PermissionAnnotationMethodInterceptor;
3)AuthenticatedAnnotationMethodInterceptor;
4)UserAnnotationMethodInterceptor;
5)GuestAnnotationMethodInterceptor;
以上就是shiro大体的用户验证与授权流程;具体细节还得看源码~
网友评论