shiro如何整合redis

worktile 其他 31

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    一、准备工作
    在整合Shiro与Redis之前,首先需要进行一些准备工作。具体步骤如下:

    1. 确保项目中已经引入了Shiro和Redis的依赖包;
    2. 搭建好了Redis服务器,并且已经正确配置了Redis的连接信息;
    3. 在Shiro的配置文件中添加Redis的相关配置信息。

    二、整合Shiro与Redis的步骤

    1. 创建RedisManager类
      在项目中创建一个RedisManager类,用于管理与Redis的连接。具体内容如下:
    public class RedisManager {
        private JedisPool jedisPool;
    
        public RedisManager() {
            // 初始化JedisPool,设置连接信息
            JedisPoolConfig config = new JedisPoolConfig();
            config.setMaxTotal(100);
            config.setMaxIdle(10);
    
            jedisPool = new JedisPool(config, "127.0.0.1", 6379);
        }
    
        public Jedis getResource() {
            return jedisPool.getResource();
        }
    
        public void returnResource(Jedis jedis) {
            jedisPool.returnResource(jedis);
        }
    }
    
    1. 创建RedisCache类
      创建一个RedisCache类,用于实现Shiro的Cache接口,将数据存储到Redis中。具体内容如下:
    public class RedisCache<K, V> implements Cache<K, V> {
        private RedisManager redisManager;
    
        public RedisCache(RedisManager redisManager) {
            this.redisManager = redisManager;
        }
    
        @Override
        public V get(K key) throws CacheException {
            Jedis jedis = null;
            try {
                jedis = redisManager.getResource();
                return (V) SerializeUtils.deserialize(jedis.get(SerializeUtils.serialize(key)));
            } catch (Exception e) {
                throw new CacheException(e);
            } finally {
                if (jedis != null) {
                    redisManager.returnResource(jedis);
                }
            }
        }
    
        @Override
        public V put(K key, V value) throws CacheException {
            Jedis jedis = null;
            try {
                jedis = redisManager.getResource();
                return (V) jedis.set(SerializeUtils.serialize(key), SerializeUtils.serialize(value));
            } catch (Exception e) {
                throw new CacheException(e);
            } finally {
                if (jedis != null) {
                    redisManager.returnResource(jedis);
                }
            }
        }
    
        @Override
        public V remove(K key) throws CacheException {
            Jedis jedis = null;
            try {
                jedis = redisManager.getResource();
                return (V) jedis.del(SerializeUtils.serialize(key));
            } catch (Exception e) {
                throw new CacheException(e);
            } finally {
                if (jedis != null) {
                    redisManager.returnResource(jedis);
                }
            }
        }
    
        // 其他方法省略...
    }
    
    1. 修改Shiro的配置文件
      在Shiro的配置文件中,配置RedisCacheManager来管理缓存。具体内容如下:
    <!-- 配置RedisCacheManager -->
    <bean id="redisManager" class="com.example.RedisManager" />
    <bean id="redisCache" class="com.example.RedisCache">
        <constructor-arg ref="redisManager" />
    </bean>
    <bean id="cacheManager" class="org.apache.shiro.cache.CacheManager">
        <property name="cache" ref="redisCache" />
    </bean>
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!-- 其他配置省略... -->
        <property name="cacheManager" ref="cacheManager" />
    </bean>
    

    至此,Shiro与Redis的整合工作就完成了。可以在项目中使用Shiro进行身份认证和授权,并且将缓存数据存储到Redis中,提高系统的性能和扩展性。

    四、总结
    通过整合Shiro与Redis,我们可以充分利用Redis的性能优势,提高系统的访问速度和并发能力。同时,这种整合方式也方便我们实现集群环境下的Session共享和缓存共享。希望本文能够帮助到你,祝你工作顺利!

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Shiro是一个用于身份验证、授权和会话管理的框架,而Redis是一个流行的高性能键值存储数据库。整合Shiro和Redis可以实现将Shiro的会话管理功能存储到Redis中,从而提高性能和可伸缩性。下面是整合Shiro和Redis的步骤:

    1. 添加Redis依赖:
      首先,需要在项目的构建文件中添加Redis的依赖,比如Maven的pom.xml文件或者Gradle的build.gradle文件。可以通过以下方式添加依赖:

      对于Maven:

      <dependency>
          <groupId>org.apache.shiro</groupId>
          <artifactId>shiro-redis</artifactId>
          <version>${shiro.version}</version>
      </dependency>
      

      对于Gradle:

      compile 'org.apache.shiro:shiro-redis:${shiro.version}'
      
    2. 配置Redis缓存管理器:
      在Shiro的配置文件中添加Redis缓存管理器。可以使用RedisCacheManager类来创建一个Redis缓存管理器,并指定Redis的连接信息。配置示例:

      <bean id="redisManager" class="org.crazycake.shiro.RedisManager">
          <!-- 配置 Redis 连接信息 -->
          <property name="host" value="localhost"/>
          <property name="port" value="6379"/>
      </bean>
      
      <bean id="cacheManager" class="org.apache.shiro.cache.CacheManager">
          <property name="cacheManager" ref="redisManager"/>
      </bean>
      
    3. 配置Redis会话DAO:
      在Shiro的配置文件中添加Redis会话DAO来实现将Shiro的会话存储到Redis中。可以使用RedisSessionDAO类来创建一个Redis会话DAO。配置示例:

      <bean id="redisSessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
          <property name="cacheManager" ref="cacheManager"/>
      </bean>
      
    4. 配置会话管理器:
      在Shiro的配置文件中配置会话管理器,并将Redis会话DAO设置给会话管理器。可以使用DefaultWebSessionManager类来创建一个会话管理器。配置示例:

      <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
          <property name="sessionDAO" ref="redisSessionDAO"/>
      </bean>
      
    5. 配置安全管理器:
      在Shiro的配置文件中配置安全管理器,并设置会话管理器。可以使用DefaultWebSecurityManager类来创建一个安全管理器。配置示例:

      <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
          <property name="sessionManager" ref="sessionManager"/>
      </bean>
      

    通过以上步骤,已经完成了Shiro和Redis的整合。现在,Shiro的会话管理功能将使用Redis作为存储。这将提高性能,并允许多个应用程序实例之间共享会话数据。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    一、Shiro简介
    Shiro是一个强大且易于使用的Java安全框架,提供了身份认证、授权、会话管理和密码加密等功能。它可以与其他开发框架(如Spring和SpringBoot)无缝整合,以保护企业应用程序的安全。

    二、Redis简介
    Redis是一个开源的内存数据存储系统,可以用作数据库、缓存、消息中间件等。它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。Redis的快速读写能力使其成为Shiro的理想存储解决方案。

    三、整合Shiro和Redis的步骤

    1. 引入相关依赖
      在项目的pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.7.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-redis</artifactId>
        <version>1.7.1</version>
    </dependency>
    
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.7.0</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.7.1</version>
    </dependency>
    
    1. 配置Redis
      在项目的配置文件中添加Redis的相关配置,包括主机名、端口号、密码等。例如,可以在application.properties文件中添加以下配置:
    # Redis配置
    redis.host=127.0.0.1
    redis.port=6379
    redis.password=
    
    1. 配置Shiro
      在项目的配置文件中添加Shiro的相关配置,包括Realm、Cache、Session等。为了整合Shiro和Redis,我们需要配置Redis作为Shiro的Cache和Session的存储源。
    @Configuration
    public class ShiroConfig {
    
        @Value("${redis.host}")
        private String redisHost;
    
        @Value("${redis.port}")
        private int redisPort;
    
        @Value("${redis.password}")
        private String redisPassword;
    
        @Bean
        public RedisManager redisManager() {
            RedisManager redisManager = new RedisManager();
            redisManager.setHost(redisHost);
            redisManager.setPort(redisPort);
            redisManager.setPassword(redisPassword);
            return redisManager;
        }
    
        @Bean
        public RedisCacheManager cacheManager(RedisManager redisManager) {
            RedisCacheManager cacheManager = new RedisCacheManager();
            cacheManager.setRedisManager(redisManager);
            return cacheManager;
        }
    
        @Bean
        public RedisSessionDAO sessionDAO(RedisManager redisManager) {
            RedisSessionDAO sessionDAO = new RedisSessionDAO();
            sessionDAO.setRedisManager(redisManager);
            return sessionDAO;
        }
    
        @Bean
        public DefaultWebSecurityManager securityManager(MyRealm realm, RedisCacheManager cacheManager,
                RedisSessionDAO sessionDAO) {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(realm);
            securityManager.setCacheManager(cacheManager);
            securityManager.setSessionManager(sessionManager(sessionDAO));
            return securityManager;
        }
    
        @Bean
        public DefaultWebSessionManager sessionManager(RedisSessionDAO sessionDAO) {
            DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
            sessionManager.setSessionDAO(sessionDAO);
            return sessionManager;
        }
    
        @Bean
        public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
            ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
            filterFactoryBean.setSecurityManager(securityManager);
            return filterFactoryBean;
        }
    }
    
    1. 自定义Realm
      自定义一个继承自AuthorizingRealm的Realm,并重写相关方法来实现用户的身份认证和授权操作。
    public class MyRealm extends AuthorizingRealm {
    
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
            // 实现授权逻辑
        }
    
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            // 实现认证逻辑
        }
    }
    
    1. 使用Shiro进行身份认证和授权
      在Controller中使用Shiro进行身份认证和授权操作。
    @RestController
    public class UserController {
    
        @Autowired
        private UserService userService;
    
        @PostMapping("/login")
        public String login(@RequestParam String username, @RequestParam String password) {
            Subject currentUser = SecurityUtils.getSubject();
            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
            currentUser.login(token);
            // 登录成功后的操作
            return "登录成功";
        }
    
        @GetMapping("/user")
        public String user() {
            Subject currentUser = SecurityUtils.getSubject();
            if (currentUser.isAuthenticated()) {
                // 已登录用户的操作
                return "用户信息";
            }
            return "请先登录";
        }
    
        @GetMapping("/logout")
        public String logout() {
            Subject currentUser = SecurityUtils.getSubject();
            currentUser.logout();
            // 退出登录后的操作
            return "退出登录";
        }
    }
    

    以上就是将Shiro和Redis整合的基本步骤,通过配置Redis作为Shiro的Cache和Session的存储源,可以提高系统的性能和可扩展性。同时,Shiro还提供了其他的功能和配置选项,可以根据具体需求进行调整和扩展。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部