博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring boot shiro session cache ecache redis 共存配置
阅读量:2390 次
发布时间:2019-05-10

本文共 7782 字,大约阅读时间需要 25 分钟。

SecurityManager

对应 shiro来说 SecurityManager 非常重要,这里配置了

Realm
CacheManager
RememberMeManager
sessionManager
可以说是shiro的核心

我们今天就是要 配置 sessionManager 和 CacheManager

让 ecache和redis来缓存 session和 AuthorizationInfo的数据信息
使得应用能集群部署,多个机器之间共享session和 认证授权数据信息。

SecurityManager的配置

//配置核心安全事务管理器    @Bean    public SecurityManager securityManager(@Qualifier("authRealm")AuthRealm authRealm,@Qualifier("redisCacheManager")CacheManager            cacheManager) {       logger.info("--------------shiro已经加载----------------");        DefaultWebSecurityManager manager=new DefaultWebSecurityManager();        // 设置realm.        manager.setRealm(authRealm);        //注入缓存管理器;        //注意:开发时请先关闭,如不关闭热启动会报错        manager.setCacheManager(cacheManager);//这个如果执行多次,也是同样的一个对象;        //注入记住我管理器;        manager.setRememberMeManager(rememberMeManager());        return manager;    }

这里配置了

manager.setCacheManager(cacheManager)

CacheConfig 配置 ehCacheManager 和redisCacheManager

@Configuration@EnableCachingpublic class CacheConfig {
private Logger logger = org.slf4j.LoggerFactory.getLogger(getClass()); @Bean(name = "ehCacheManager") public EhCacheManager ehCacheManager() { logger.info("--------------ehCacheManager init---------------"); EhCacheManager cacheManager = new EhCacheManager(); cacheManager.setCacheManagerConfigFile("classpath:cache/ehcache-shiro.xml"); logger.info("--------------ehCacheManager init---------------"+cacheManager); return cacheManager; } @Autowired private RedisTemplate redisTemplate; @Bean(name = "redisCacheManager") @Primary public RedisCacheManager redisCacheManager() { logger.info("--------------redis cache init---------------"); RedisCacheManager cacheManager = new RedisCacheManager(); cacheManager.setRedisTemplate(redisTemplate); logger.info("--------------redis cache ---------------"+cacheManager); return cacheManager; }}

使用 ecache做缓存

1 、那么 加入依赖

org.ehcache
ehcache
${ehcache.version}
provided
org.springframework.boot
spring-boot-starter-cache
net.sf.ehcache
ehcache-core
${ehcache.core.version}
org.apache.shiro
shiro-ehcache
${shiro.version}

2、配置 cacheManager

@Bean(name = "ehCacheManager")    public EhCacheManager ehCacheManager() {        logger.info("--------------ehCacheManager init---------------");        EhCacheManager cacheManager = new EhCacheManager();        cacheManager.setCacheManagerConfigFile("classpath:cache/ehcache-shiro.xml");        logger.info("--------------ehCacheManager init---------------"+cacheManager);        return cacheManager;    }

3、配置 ehcache-shiro.xml

4、SecurityManager 注入 ehCacheManager

@Qualifier(“ehCacheManager”)CacheManager

使用redis做缓存 auth数据

使用redis比较麻烦一些,没有用

org.crazycake
shiro-redis
2.4.6

这样的 jar 只能自己来弄一个 cache 和 cacheManager

当然 也可以使用 shiro-redis 这样就不需要自己实现 cache 和 cacheManager

我们先看自己实现的方式

1、实现Cache

public class RedisCache
implements Cache
{ private Logger logger = LoggerFactory.getLogger(this.getClass()); private static final String REDIS_SHIRO_CACHE = "slife-shiro-cache:"; private String cacheKey; private RedisTemplate
redisTemplate; private long globExpire = 30; @SuppressWarnings("rawtypes") public RedisCache(String name, RedisTemplate client) { this.cacheKey = REDIS_SHIRO_CACHE + name + ":"; this.redisTemplate = client; } @Override public V get(K key) throws CacheException { redisTemplate.boundValueOps(getCacheKey(key)).expire(globExpire, TimeUnit.MINUTES); return redisTemplate.boundValueOps(getCacheKey(key)).get(); } @Override public V put(K key, V value) throws CacheException { V old = get(key); redisTemplate.boundValueOps(getCacheKey(key)).set(value); return old; } @Override public V remove(K key) throws CacheException { V old = get(key); redisTemplate.delete(getCacheKey(key)); return old; } @Override public void clear() throws CacheException { redisTemplate.delete(keys()); } @Override public int size() { return keys().size(); } @Override public Set
keys() { return redisTemplate.keys(getCacheKey("*")); } @Override public Collection
values() { Set
set = keys(); List
list = new ArrayList<>(); for (K s : set) { list.add(get(s)); } return list; } private K getCacheKey(Object k) { return (K) (this.cacheKey + k); }}

2、实现 CacheManager

public class RedisCacheManager implements CacheManager {
private static final Logger logger = LoggerFactory.getLogger(RedisCacheManager.class); private RedisTemplate redisTemplate; @Override public
Cache
getCache(String name) throws CacheException { return new RedisCache
(name, redisTemplate); } public RedisTemplate
getRedisTemplate() { return redisTemplate; } public void setRedisTemplate(RedisTemplate
redisTemplate) { this.redisTemplate = redisTemplate; }}

3、注入RedisCacheManager 到容器

@Autowired    private RedisTemplate redisTemplate;    @Bean(name = "redisCacheManager")    @Primary    public RedisCacheManager redisCacheManager() {        logger.info("--------------redis cache init---------------");        RedisCacheManager cacheManager = new RedisCacheManager();        cacheManager.setRedisTemplate(redisTemplate);        logger.info("--------------redis cache ---------------"+cacheManager);        return cacheManager;    }

4、SecurityManager 注入 redisCacheManager

@Qualifier(“redisCacheManager”)CacheManager

ok 这样 就搞定了 redis和ecache 缓存shrio的认证授权数据。

接下来看看 怎么用使用redis进行基于shiro的session集群共享

redis进行基于shiro的session集群共享

1、加入依赖

org.springframework.boot
spring-boot-starter-data-redis
org.springframework.session
spring-session-data-redis

2、 配置session

@Configuration@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400*30) //maxInactiveIntervalInSeconds: 设置Session失效时间,使用Redis Session之后,原Boot的server.session.timeout属性不再生效public class SessionConfig {
}

这样 就可以了

shiro-redis jar 缓存 shiro数据

1、加入依赖

org.crazycake
shiro-redis
2.4.6

2、 配置 redisCacheManager1

@Bean(name = "redisCacheManager1")    @Primary    public RedisCacheManager redisCacheManager1() {        logger.info("--------------redis cache init---------------");        RedisCacheManager redisCacheManager=  new RedisCacheManager();        redisCacheManager.setRedisManager(redisManager());        logger.info("--------------redis cache ---------------"+redisCacheManager);        return redisCacheManager;    }    public RedisManager redisManager() {        RedisManager redisManager= new RedisManager();        redisManager.setHost("119.29.53.182");        redisManager.setPassword("123456");        redisManager.setPort(6379);        return redisManager;    }

3、SecurityManager 注入 redisCacheManager1

@Qualifier(“redisCacheManager1”)CacheManager
ok 这样就搞定了

自己实现一些 操作 ecahe和redis的工具类

我的官网

我的博客

我的官网

我的CSDN地址
我的简书地址
我的github
我的码云地址
阿里云优惠券

1.png

1.jpg

qq群 421351927 大家可以相互学习。

转载地址:http://fqoab.baihongyu.com/

你可能感兴趣的文章
[WAF]apache和modsecurity的安装
查看>>
写给换工作和找工作的同学
查看>>
Island Hopping the SpiderLabs Way
查看>>
Top Ten Web Protection Techniques of 2011
查看>>
Faster Blind MySQL Injection Using Bit Shifting
查看>>
Safely Dumping Hashes from Live Domain Controllers
查看>>
sgx模拟器
查看>>
SGX相关资源
查看>>
nessus 购买地址
查看>>
Google Security Architecture
查看>>
web server信息收集(附带plesk xday)
查看>>
JBoss AS Administrative Console Password Disclosure
查看>>
Securely Developing on Mobile
查看>>
ModSecurity Updates: Nginx Stable Release and Google Summer of Code Participation
查看>>
Java Web 三层架构详解
查看>>
iphone for PPT遥控器 MyPoint PowerPoint Remote
查看>>
ZPanel 10.0.0.2 Remote Command Execution
查看>>
Using Mimikatz Alpha or Getting Clear Text Passwords with a Microsoft Tool
查看>>
宁皓网bootstrap
查看>>
Hive作业优化总结(来自一号店)
查看>>