问题描述:
shiro 配置文件获取不到数据。
springboot @Configuration配置类里面使用@Value获取不到.yml配置文件属性的值。
spring boot整合shiro配置文件数据为null。
shrio整合redis管理session,问题出现的直接现象:
以下是版本信息:
springboot 2.1.6.RELEASE
1.4.1
1.4.1
3.2.3
shiro配置类:
application-local.yml 配置文件
你会发现,上面都没有问题,放在其他@Configuration类中,也可以获取到数据,唯独Shiro配置类中获取不到。
解决办法:
在shiro配置类中找到:
/**
* 管理shiro bean生命周期
*
* @return
*/
@Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
改成:(加static)
/**
* 管理shiro bean生命周期
*
* @return
*/
@Bean("lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
ok 。。。
package com.tuantuan.config.shiro;
import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.session.mgt.SessionManager;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.apache.shiro.web.servlet.SimpleCookie;
import org.crazycake.shiro.RedisCacheManager;
import org.crazycake.shiro.RedisManager;
import org.crazycake.shiro.RedisSessionDAO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* shiro权限管理的配置
*
* @author wangqinmin
*/
@Configuration
public class ShiroConfig {
private static final Logger logger = LoggerFactory.getLogger(ShiroConfig.class);
@Value("${shiroRedis.hostport}")
public String hostport;
@Value("${shiroRedis.database}")
public Integer database;
/**
* 配置shiro核心过滤器
*
* @return
*/
@Bean
public ShiroFilterFactoryBean shirFilter() {
logger.warn("ShiroConfig: 配置shiro核心过滤器(shiroFilter)");
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
// 安全管理器
shiroFilterFactoryBean.setSecurityManager(securityManager());
// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
shiroFilterFactoryBean.setLoginUrl("/login");
// 登录成功后要跳转的链接
shiroFilterFactoryBean.setSuccessUrl("/index");
// 未授权界面;
shiroFilterFactoryBean.setUnauthorizedUrl("/error/403");
// 配置过滤器属性
Map filterChainDefinitionMap = new LinkedHashMap();
//注意过滤器配置顺序 不能颠倒
//filterChainDefinitionMap.put("/system/logout*", "logout");
//filterChainDefinitionMap.put("/system/login*", "anon");
filterChainDefinitionMap.put("/verificationCode*", "anon");
/**
* 打开swagger权限访问
*/
filterChainDefinitionMap.put("/swagger-ui.html", "anon");
filterChainDefinitionMap.put("/swagger-resources/**", "anon");
filterChainDefinitionMap.put("/v2/api-docs/**", "anon");
filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
// filterChainDefinitionMap.put("/**", "authc");
filterChainDefinitionMap.put("/**", "anon");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return shiroFilterFactoryBean;
}
/**
* 安全管理器
*
* @return
*/
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 自定义Relam
securityManager.setRealm(myShiroRealm());
// 自定义session管理,使用redis
securityManager.setSessionManager(mySessionManager());
// 自定义缓存实现,使用redis
securityManager.setCacheManager(myReidsCacheManager());
// 注入记住我管理器
// securityManager.setRememberMeManager(rememberMeManager());
return securityManager;
}
/**
* 自定义Realm
*
* @return
*/
@Bean
public MyShiroRealm myShiroRealm() {
MyShiroRealm myShiroRealm = new MyShiroRealm();
// myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
return myShiroRealm;
}
/**
* 凭证匹配器(由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了)
*
* @return
*/
@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
//散列算法:这里使用MD5算法;
hashedCredentialsMatcher.setHashAlgorithmName("md5");
//散列的次数,比如散列两次,相当于 md5(md5(""));
hashedCredentialsMatcher.setHashIterations(2);
return hashedCredentialsMatcher;
}
/**
* 自定义MyShiroSessionManager管理器(管理Session)
*
* @return
*/
@Bean
public SessionManager mySessionManager() {
MyShiroSessionManager myShiroSessionManager = new MyShiroSessionManager();
myShiroSessionManager.setSessionDAO(redisSessionDAO());
return myShiroSessionManager;
}
/**
* sessionDao实现
* 使用的是shiro-redis开源插件
*/
@Bean
public RedisSessionDAO redisSessionDAO() {
RedisSessionDAO myRedisSessionDAO = new RedisSessionDAO();
myRedisSessionDAO.setRedisManager(myRedisManager());
return myRedisSessionDAO;
}
/**
* 自定义缓存实现 (使用shiro-redis开源插件)
*
* @return
*/
@Bean
public RedisCacheManager myReidsCacheManager() {
RedisCacheManager myRedisCacheManager = new RedisCacheManager();
myRedisCacheManager.setRedisManager(myRedisManager());
return myRedisCacheManager;
}
/**
* cookie管理对象;记住我功能
*
* @return
*/
// public CookieRememberMeManager rememberMeManager() {
// CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager();
// cookieRememberMeManager.setCookie(rememberMeCookie());
// //rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)
// cookieRememberMeManager.setCipherKey(Base64.decode("1QWLxg+NYmxraMoxAXu/Iw=="));
// return cookieRememberMeManager;
// }
/**
* cookie对象;
*
* @return
*/
@Bean
public SimpleCookie rememberMeCookie() {
// 这个参数是cookie的名称,对应前端的checkbox的name = rememberMe
SimpleCookie simpleCookie = new SimpleCookie("rememberMe");
// 记住我cookie生效时间30天 ,单位秒。 注释掉,默认永久不过期
simpleCookie.setMaxAge(2592000);
return simpleCookie;
}
/**
* 使用shiro-redis开源插件
* TODO 配置redis连接
*/
@Bean
public RedisManager myRedisManager() {
RedisManager redisManager = new RedisManager();
redisManager.setHost(hostport);
redisManager.setDatabase(database);
return redisManager;
}
/**
* 管理shiro bean生命周期
*
* @return
*/
@Bean("lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* 开启shiro注解模式
*
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator proxyCreator = new DefaultAdvisorAutoProxyCreator();
proxyCreator.setProxyTargetClass(true);
return proxyCreator;
}
/**
* 开启shiro aop注解支持.
* 使用代理方式;所以需要开启代码支持;
*
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
}