项目场景:
springboot2.x+shiro+redis实现简单认证和授权demo
问题描述:
在ShiroConfig配置文件中新增配置:
//数据来自配置文件application.yml
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Bean
public RedisManager redisManager() {
RedisManager redisManager = new RedisManager();
redisManager.setHost(host);
redisManager.setPort(port);
redisManager.setPassword(password);
redisManager.setTimeout(300000);
return redisManager;
}
@Bean
public RedisCacheManager redisCacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager();
redisCacheManager.setRedisManager(redisManager());
// 必须要设置主键名称,shiro-redis 插件用过这个缓存用户信息
redisCacheManager.setPrincipalIdFieldName("userId");
redisCacheManager.setExpire(200000);
return redisCacheManager;
}
/**
* 控制中心
* @return
*/
@Bean(value = "securityManager")
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//使用自定义认证器
//securityManager.setAuthenticator(authenticator());
//使用自定义授权器
//securityManager.setAuthorizer(authorizer());
securityManager.setRealm(shiroRealm());
// 自定义session管理 使用redis
//securityManager.setSessionManager(sessionManager());
// 自定义缓存实现 使用redis
securityManager.setCacheManager(redisCacheManager());
return securityManager;
}
application.yml文件
spring:
datasource:
******
#redis 配置
redis:
database: 0
host: localhost
jedis:
pool:
## 连接池最大连接数(使用负值表示没有限制)
max-active: 8
## 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
## 连接池中的最大空闲连接
max-idle: 8
## 连接池中的最小空闲连接
min-idle: 0
password:
port: 6379
原因分析:
在未整合redis缓存时,是可以授权的。整合之后就无法授权,说明是整合时的配置出现问题。可是检查许久也没有发现到底哪里出现问题。我就看啊看,测呀测,突然灵光一闪,
发现有个奇怪的点。

我有种预感,有可能是密码的问题。

索性就把密码去掉。

测试,竟然通过了。我擦嘞!!!
没想到还真是这个问题,我可真是个天才!
拓展
当然作为一名成熟的IT人员(自我感觉良好),我肯定要追根究底。分别测试如下情况:
启动时打断点:

发现得到password是个空串,既然空串不行,那null呢?测试结果如下:
redisManager.setPassword("");//有错
redisManager.setPassword(null);//无错
总结
现在有了结论,使用RedisManager管理redis时设置redisManager.setPassword
,如果Redis服务未设置密码,要使用null而不是"“空串。
具体原因,肯定是RedisManger内部管理的问题了。
就比如,你使用RedisStandaloneConfiguration管理redis时,使用”"空串也是没问题的。如下
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
config.setHostName(host);
config.setPort(port);
config.setPassword(password);//password = ""
JedisConnectionFactory factory = new JedisConnectionFactory(config);
return factory;
}
本文介绍了一个关于SpringBoot应用中Shiro整合Redis作为缓存时出现的授权失败问题,并详细分析了问题原因及解决方案,特别是RedisManager配置中的密码设置细节。

1万+

被折叠的 条评论
为什么被折叠?



