首先,我们先看Realm是怎么被执行的
Realm是被一个名叫ModularRealmAuthenticator的类执行的
具体细节如下
protected AuthenticationInfo doAuthenticate(AuthenticationToken authenticationToken) throws AuthenticationException {
//检验是否有Realm
this.assertRealmsConfigured();
//获取所有的Realm
Collection realms = this.getRealms();
//如果Realm只有1个,就只执行那一个,如果Realm有多个,全部都要执行
return realms.size() == 1 ? this.doSingleRealmAuthentication((Realm)realms.iterator().next(), authenticationToken) : this.doMultiRealmAuthentication(realms, authenticationToken);
}
Shiro自带的UserNamePasswordToken感觉不太够用,因为下面我们要根据Token自带的属性进行区分,所以下面需要扩展UserNamePasswordToken。
/**
-
@Author: Ember
-
@Date: 2021/4/26 17:30
-
@Description:
*/
public class Token extends UsernamePasswordToken {
/**
- 用来判断执行哪个Realm
**/
private String loginType;
public Token(String username, String password, String loginType) {
super(username, password);
this.loginType = loginType;
}
public String getLoginType() {
return loginType;
}
public void setLoginType(String loginType) {
this.loginType = loginType;
}
}
我们从上面可以看到,Realm的执行是跟ModularRealmAuthenticator密切相关的,所以我们要想改变Realm的执行,就必须扩展ModularRealmAuthenticator,然后重写doAuthenticate方法,最后装配上我们自定义的ModularRealmAuthenticator即可。
我们可以通过参考上面的源代码进行对应重写,本质上只是改变realms集合即可,即将想要执行的realm放到新的realms集合里面,执行该realms集合即可
具体扩展如下