shiro new SimpleAuthenticationInfo第一个参数是传对象还是字符串?

Shiro的SimpleAuthenticationInfo构造函数接受Object参数,允许传入对象或字符串。但传入的类型需与doGetAuthorizationInfo方法中principalCollection.getPrimaryPrincipal()接收的类型一致,否则会导致类型转换错误。传入的对象类型必须在授权信息获取时能正确匹配和处理。
摘要由CSDN通过智能技术生成

接触不同的系统,不同的使用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 时,第一个参数传什么类型,就接收什么类型,要对应,而不是随意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值