alexxiyang / shiro-redis

shiro only provide the support of ehcache and concurrentHashMap. Here is an implement of redis cache can be used by shiro. Hope it will help you!
MIT License
1.17k stars 446 forks source link

关于实现AuthCachePrincipal 这个类后,获取subject.getPrincipal();后出现类型转换异常 #52

Closed IMetaNFT closed 6 years ago

IMetaNFT commented 6 years ago

使用的SpringBoot 1.5.8 shiro-spring 1.4.0

alexxiyang commented 6 years ago

经测试未发现该问题:

UserInfo类:

public class UserInfo implements Serializable, AuthCachePrincipal{

    private String username;

    private Integer age;

// 省略setter和 getter

    @Override
    public String getAuthCacheKey() {
        return getUsername();
    }
}

以下是登陆代码

@Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken)token;
        UserInfo userInfo = new UserInfo();

        return new SimpleAuthenticationInfo(userInfo, "123456", getName());
    }

以下是授权代码

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {

        Subject subject = SecurityUtils.getSubject();

                //取出UserInfo
        UserInfo dbUser = (UserInfo) subject.getPrincipal();

代码可以在 https://github.com/alexxiyang/shiro-redis-tutorial 找到。 该示例项目运行条件: Redis: 192.168.56.101:6379

你可以修改 shiro.ini 中的地址

leonliu06 commented 6 years ago

@Chenyobing 我也遇到了和你一样的问题,你解决了吗?怎么解决的?

alexxiyang commented 6 years ago

这个周末我会发布3.1.0在该版本中,使用反射获取authCacheKey,不需要实现 AuthCachePrincipal 。希望可以解决你们的问题

leonliu06 commented 6 years ago

shiro原理还不太熟悉,能简单说下SimpleAuthenticationInfo这个类构造器的第一个参数principal和doGetAuthorizationInfo这个方法的参数的意义吗?转型错误的原因是什么?

alexxiyang commented 6 years ago

请升级至 3.1.0,该版本舍弃了 AuthCachePrincipal,使用反射机制获取id字段。请设定 cacheManager.principalIdFieldName