springboot-shiro-redis缓存实现单点登录 yml

版权声明:本文为博主原创,无版权,未经博主允许可以随意转载,无需注明出处,随意修改或保持可作为原创! https://blog.csdn.net/z1729734271/article/details/78930088

为什么要实现单点登录?
单点登录( Single Sign-On , 简称 SSO )是目前比较流行的服务于企业业务整合的解决方案之一, SSO 使得在多个应用系统中,用户只需要 登录一次 就可以访问所有相互信任的应用系统。

本文从公司开发需求出发,用springboot+shiro+redis完成对会话的管理,实现单点登录。
下面贴出具体实现代码:
pom文件依赖:

<!-- 配置使用redis启动器 -->
        <dependency>
            <groupId>org.crazycake</groupId>
            <artifactId>shiro-redis</artifactId>
            <version>2.4.2.1-RELEASE</version>
        </dependency>

yml文件(配置redis连接)

spring:
  redis:
    host: 127.0.0.1
    port: 6379
    max-idle: 8
    min-idle: 0
    max-active: 8
    maxwait: -1
    timeout: 0
    isRedisCache: 1  #是否使用redis缓存

配置文件(采用springboot java配置):
shiroConfig.java配置(下面贴出的是需要添加修改的代码配置)

@Configuration
public class ShiroConfig {
    private Logger logger = Logger.getLogger(ShiroConfig.class);
    //取redis连接配置
    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.timeout}")
    private int timeout;
    @Value("${spring.redis.isRedisCache}")
    private int isRedisCache;

    @Bean
    public EhCacheManager getEhCacheManager() {
        EhCacheManager em = new EhCacheManager();
        em.setCacheManagerConfigFile("classpath:config/ehcache.xml");
        return em;
    }
    @Bean
    UserRealm userRealm(EhCacheManager cacheManager) {
        UserRealm userRealm = new UserRealm();
        // userRealm.setCacheManager(cacheManager);可以注释,下面重复了。
        return userRealm;
    }

    /**
     * 配置shiro redisManager
     * 
     * @return
     */
    @Bean
    public RedisManager redisManager() {
        RedisManager redisManager = new RedisManager();
        redisManager.setHost(host);
        redisManager.setPort(port);
        redisManager.setExpire(1800);// 配置过期时间
        logger.info("配置redis连接设置##########" + host + ":::" + port);
        return redisManager;
    }

    /**
     * cacheManager 缓存 redis实现
     * 
     * @return
     */
    public RedisCacheManager cacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager();
        redisCacheManager.setRedisManager(redisManager());
        return redisCacheManager;
    }

    @Bean
    SessionDAO sessionDAO() {
        logger.info("是否使用redis缓存");
        if (1 == isRedisCache) {
            RedisSessionDAO redisSessionDAO = new RedisSessionDAO();
            redisSessionDAO.setRedisManager(redisManager());
            logger.info("设置redisSessionDAO");
            return redisSessionDAO;
        } else {
            MemorySessionDAO sessionDAO = new MemorySessionDAO();
            logger.info("设置MemorySessionDAO");
            return sessionDAO;
        }
    }

    @Bean
    public SessionManager sessionManager() {
        DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
        Collection<SessionListener> listeners = new ArrayList<SessionListener>();
        listeners.add(new BDSessionListener());
        sessionManager.setSessionListeners(listeners);
        sessionManager.setSessionDAO(sessionDAO());
        return sessionManager;
    }

    @Bean
    SecurityManager securityManager(UserRealm userRealm) {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(userRealm);
        if (1 != isRedisCache) {
            manager.setCacheManager(getEhCacheManager());
            logger.info("设置getEhCacheManager");
        }
        logger.info("设置sessionManager");
        manager.setSessionManager(sessionManager());
        return manager;
    }
    ......//其他配置默认
}

这样配置就可以了,接下来启动看看,不出所料,报错了,当然不是所有人都是,得看个人配置:
错误:
1、获取不到redis连接配置:
贴出日志

2017-12-29 11:35:17.550  INFO 7196 --- [restartedMain] com.bootdo.system.config.ShiroConfig     : 设置getEhCacheManager
2017-12-29 11:35:17.550  INFO 7196 --- [restartedMain] com.bootdo.system.config.ShiroConfig     : 设置sessionManager
2017-12-29 11:35:17.552  INFO 7196 --- [restartedMain] com.bootdo.system.config.ShiroConfig     : 是否使用redis缓存
2017-12-29 11:35:17.552  INFO 7196 --- [restartedMain] com.bootdo.system.config.ShiroConfig     : 设置MemorySessionDAO
2017-12-29 11:35:19.056  INFO 7196 --- [restartedMain] com.bootdo.system.config.ShiroConfig     : 配置redis连接设置##########null:::0

获取不到redis连接配置!!!
解决方式:
shiroConfig里修改

@Bean("lifecycleBeanPostProcessor")
    public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();
    }

参考:http://blog.csdn.net/z1729734271/article/details/78930292

2、类型转换错误:

2017-12-29 11:36:43.079 ERROR 7956 --- [http-nio-80-exec-8] c.b.common.exception.BDExceptionHandler  : com.bootdo.system.domain.UserDO cannot be cast to com.bootdo.system.domain.UserDO

java.lang.ClassCastException: com.bootdo.system.domain.UserDO cannot be cast to com.bootdo.system.domain.UserDO
    at com.bootdo.common.utils.ShiroUtils.getUser(ShiroUtils.java:13) ~[classes/:na]
    at com.bootdo.common.controller.BaseController.getUser(BaseController.java:10) ~[classes/:na]
    at com.bootdo.common.controller.BaseController.getUserId(BaseController.java:14) ~[classes/:na]
    at com.bootdo.system.controller.LoginController.index(LoginController.java:43) ~[classes/:na]

解决方式:
注释掉pom文件里的热部署依赖,得以解决

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>

参考:http://blog.csdn.net/z1729734271/article/details/78930708

这样我们springboot-shiro-redis缓存实现单点登录就已经完成了,期间遇到的问题也顺利解决,简单记录下,有不对的地方或者有不清楚的地方小伙伴可以留言讨论~

猜你喜欢

转载自blog.csdn.net/z1729734271/article/details/78930088
yml