架构
方案
使用 redis 集中存储,实现分布式集群共享用户信息,这里我们采用第三方开源插件crazycake来实现,pom.xml 引入:
org.springframework.boot spring-boot-starter-data-redis org.crazycake shiro-redis 3.2.3
登录后复制
配置 application.properties:
# Redis# 数据库索引(默认为0)redis.database=0# 服务器地址 变更为自己的redis.host=127.0.0.1# 服务器连接端口redis.port=6379# 服务器连接密码,如果不设置密码注释掉即可# redis.password=# 连接超时时间(毫秒)redis.timeout=30000
登录后复制
本来crazycake插件已经实现了RedisManager,但是参数不可配,这里我们需要自己重写一下:
public class RedisManager extends WorkAloneRedisManager implements IRedisManager { private RedisProperties redis; private JedisPool jedisPool; public RedisManager(RedisProperties redis) { this.redis = redis; } private void init() { synchronized(this) { if (this.jedisPool == null) { this.jedisPool = new JedisPool(this.getJedisPoolConfig(), redis.getHost(), redis.getPort(), redis.getTimeout(), redis.getPassword(), redis.getDatabase()); } } } @Override protected Jedis getJedis() { if (this.jedisPool == null) { this.init(); } return this.jedisPool.getResource(); }}
登录后复制
参数配置 RedisProperties:
@Data@ConfigurationProperties(prefix = "redis")public class RedisProperties { private String host; private int port; private int timeout; private String password; private int database;}
登录后复制
配置 ShiroConfig:
/** * Shiro权限配置 * 一定要配置 @Configuration 和 @EnableConfigurationProperties 注解 */@Configuration@EnableConfigurationProperties({RedisProperties.class})public class ShiroConfig { private RedisProperties redis; public ShiroConfig(RedisProperties redis) { this.redis = redis; } @Bean public UserRealm userRealm() { return new UserRealm(); } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean (SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setLoginUrl("/index.html"); shiroFilterFactoryBean.setUnauthorizedUrl("/403"); // 拦截器 Map filterChainDefinitionMap = new LinkedHashMap(); /** * 静态文件 */ filterChainDefinitionMap.put("/file/**","anon"); /** * 登录注册 */ filterChainDefinitionMap.put("/register.shtml","anon"); filterChainDefinitionMap.put("/login.shtml","anon"); /** * 管理后台 */ filterChainDefinitionMap.put("/sys/**", "roles[admin]"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } @Bean public SessionsSecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(userRealm()); securityManager.setCacheManager(cacheManager()); securityManager.setSessionManager(sessionManager()); return securityManager; } @Bean public DefaultWebSessionManager sessionManager() { DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); sessionManager.setSessionIdUrlRewritingEnabled(false); sessionManager.setSessionDAO(redisSessionDAO()); return sessionManager; } @Bean public ShiroDialect shiroDialect(){ return new ShiroDialect(); } /** * cacheManager 缓存 redis实现 * @return */ public RedisCacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(); redisCacheManager.setRedisManager(redisManager()); return redisCacheManager; } /** * 配置shiro redisManager * @return */ public RedisManager redisManager() { RedisManager redisManager = new RedisManager(redis); return redisManager; } /** * RedisSessionDAO shiro sessionDao层的实现 * 原理就是重写 AbstractSessionDAO * 有兴趣的小伙伴自行阅读源码 */ @Bean public RedisSessionDAO redisSessionDAO() { RedisSessionDAO redisSessionDAO = new RedisSessionDAO(); redisSessionDAO.setRedisManager(redisManager()); return redisSessionDAO; }
登录后复制
以上就是SpringBoot整合Redis的方法的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2031351.html