接触不同的系统,不同的使用shiro姿势时,new SimpleAuthenticationInfo时,有的是传字符串,有的是传对象。
那到底是传对象还是字符串呢,今天我就大概测试了一下。
先说结论:两者都可。
首先,我们来看它的源码。
public SimpleAuthenticationInfo(Object principal, Object credentials, String realmName) {
this.principals = new SimplePrincipalCollection(principal, realmName);
this.credentials = credentials;
}
public SimpleAuthenticationInfo(Object principal, Object hashedCredentials, ByteSource credentialsSalt, String realmName) {
this.principals = new SimplePrincipalCollection(principal, realmName);
this.credentials = hashedCredentials;
this.credentialsSalt = credentialsSalt;
}
看了源码,它是一个Object对象,所以传什么都可,那我是不是可以随意传对象或字符呢?
不是的,如果你这里传的是对象,那么在方法doGetAuthorizationInfo principalCollection.getPrimaryPrincipal()接收时,也应该是用对象,如果是字符串,则在方法,接收时,则是字符串。
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
System.out.println("每次都自动调这里-节点权限");
String principal = (String) principalCollection.getPrimaryPrincipal();
// 这里是你的逻辑
return null;
}
接下来,我们代码试下。我现在new 时传的是对象
if (!ObjectUtils.isEmpty(user)) {
return new SimpleAuthenticationInfo(user, user.getPassword(), ByteSource.Util.bytes(user.getSalt()), this.getName());
}
则在doGetAuthorizationInfo 方法 接收时,它是一个User对象 ,如下图。
强转,则报错。
所以明白没?
new SimpleAuthenticationInfo 时,第一个参数传什么类型,就接收什么类型,要对应,而不是随意。