`

Shiro集群实现

 
阅读更多
apache shiro集群实现(一) session共享 http://blog.csdn.net/michaelliuyang/article/details/8819852
apache shiro集群实现(二)— cache共享 http://blog.csdn.net/michaelliuyang/article/details/8820390
Redis整合Spring结合使用缓存实例 http://blog.csdn.net/evankaka/article/details/50396325


原文的修改: 很多人留言希望提供基础代码, 但原文的作者不愿意提供基础代码, 让人很纳闷, 所以自己找了很久, 决定替换和修改原文的代码
针对redis的session共享的配置或者源码
<bean id="jdkSerializationRedisSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
    <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/>

    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"></bean>
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="192.168.0.198"/>
        <property name="port" value="6379"/>
        <property name="password" value="12345"/>
        <property name="timeout" value="1000"/>
        <property name="poolConfig" ref="jedisPoolConfig"/>
        <property name="usePool" value="true"/>
    </bean>
    <!--
    GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化
    Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的
    JacksonJsonRedisSerializer: 序列化object对象为json字符串
    JdkSerializationRedisSerializer: 序列化java对象
    StringRedisSerializer: 简单的字符串序列化
    -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory"/>
        <property name="defaultSerializer" ref="jdkSerializationRedisSerializer" />
        <property name="keySerializer" ref="stringRedisSerializer"/>
        <property name="hashKeySerializer" ref="stringRedisSerializer"/>
        <property name="valueSerializer" ref="jdkSerializationRedisSerializer"/>
        <property name="hashValueSerializer" ref="jdkSerializationRedisSerializer"/>
    </bean>
    <bean id="redisUtil" class="com.pandy.framework.base.redis.utils.RedisUtil">
        <property name="redisTemplate" ref="redisTemplate"/>
    </bean>



package com.pandy.framework.base.shiro.session.dao.impl;

import com.pandy.framework.base.redis.utils.RedisUtil;
import com.pandy.framework.base.shiro.session.dao.ShiroSessionRepository;
import org.apache.shiro.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Created by pandy on 16-5-3.
 */
public class JedisShiroSessionRepository implements ShiroSessionRepository {
    private Logger logger = LoggerFactory.getLogger(JedisShiroSessionRepository.class);
    private RedisUtil redisUtil;

    /**
     * redis session key前缀
     */
    private final String REDIS_SHIRO_SESSION = "PANDY-WP-FRAMEWORK-SESSION";
    private String redisShiroSessionPre;

    public void saveSession(Session session) {
        if (session == null || session.getId() == null) {
            logger.error("session或者session id为空");
            return;
        }
        redisUtil.set(getRedisSessionKey(session.getId()), session);

    }

    public void deleteSession(Serializable id) {
        if (id == null) {
            logger.error("id为空");
            return;
        }
        redisUtil.remove(getRedisSessionKey(id));
    }

    public Session getSession(Serializable id) {
        if (id == null) {
            logger.error("id为空");
            return null;
        }
        Session session = redisUtil.get(getRedisSessionKey(id), Session.class);
        return session;
    }

    public Collection<Session> getAllSessions() {
        Set<Session> sessions = new HashSet<Session>();
        Set<String> set = redisUtil.getPatternKey("*");

        if (set == null || set.size() == 0)
            return sessions;
        Iterator<String> it = set.iterator();
        while (it.hasNext()) {
            try {
                String key = it.next();
                if(key!=null && key.indexOf(REDIS_SHIRO_SESSION)>=0){
                    Session session = redisUtil.get(key, Session.class);
                    sessions.add(session);
                }

            }catch (Exception e){
                e.printStackTrace();
            }
        }

        return sessions;
    }

    /**
     * 获取redis中的session key
     *
     * @param sessionId
     * @return
     */
    private String getRedisSessionKey(Serializable sessionId) {
        return getRedisShiroSessionPre() + sessionId;
    }


    public RedisUtil getRedisUtil() {
        return redisUtil;
    }

    public void setRedisUtil(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    public String getRedisShiroSessionPre() {
        if (redisShiroSessionPre == null || redisShiroSessionPre.trim().length() == 0) {
            return REDIS_SHIRO_SESSION  + ":";
        }
        return REDIS_SHIRO_SESSION + "-" + redisShiroSessionPre + ":";
    }

    public void setRedisShiroSessionPre(String redisShiroSessionPre) {
        this.redisShiroSessionPre = redisShiroSessionPre;
    }
}


<!-- 使用redis处理会话DAO -->
    <bean id="jedisShiroSessionRepository" class="com.pandy.framework.base.shiro.session.dao.impl.JedisShiroSessionRepository">
        <property name="redisUtil" ref="redisUtil"/>
        <property name="redisShiroSessionPre" value="PANDY_WEB_APP_SESSION"/>
    </bean>
    <bean id="sessionDAO" class="com.pandy.framework.base.shiro.session.dao.impl.CustomShiroSessionDAO">
        <property name="shiroSessionRepository" ref="jedisShiroSessionRepository" />
        <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
    </bean>




针对redis的cache的配置或源码
package com.pandy.framework.base.shiro.cache;

import com.pandy.framework.base.redis.utils.RedisUtil;
import org.apache.shiro.cache.Cache;

/**
 * Created by pandy on 16-5-4.
 */
public class JedisShiroCacheManager implements ShiroCacheManager {
    private RedisUtil redisUtil;
    private String redisShiroCachePre;


    public <K, V> Cache<K, V> getCache(String name) {
        return new JedisShiroCache<K, V>(name, redisUtil, getRedisShiroCachePre());
    }

    public void destroy() {
        //jedisCacheManager.getJedis().shutdown();
        throw new RuntimeException("这里要怎么实现啊,还不知道怎么实现");
    }

    public RedisUtil getRedisUtil() {
        return redisUtil;
    }

    public void setRedisUtil(RedisUtil redisUtil) {
        this.redisUtil = redisUtil;
    }

    public String getRedisShiroCachePre() {
        return redisShiroCachePre;
    }

    public void setRedisShiroCachePre(String redisShiroCachePre) {
        this.redisShiroCachePre = redisShiroCachePre;
    }
}




package com.pandy.framework.base.shiro.cache;

import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.util.Destroyable;

/**
 * Created by pandy on 16-5-4.
 */
public class CustomShiroCacheManager implements CacheManager, Destroyable {

    private ShiroCacheManager shiroCacheManager;

    public ShiroCacheManager getShiroCacheManager() {
        return shiroCacheManager;
    }

    public void setShiroCacheManager(ShiroCacheManager shiroCacheManager) {
        this.shiroCacheManager = shiroCacheManager;
    }

    public <K, V> Cache<K, V> getCache(String name) throws CacheException {
        return getShiroCacheManager().getCache(name);
    }

    public void destroy() throws Exception {
        shiroCacheManager.destroy();
    }

}





package com.pandy.framework.base.shiro.cache;

import com.pandy.framework.base.redis.utils.RedisUtil;
import com.pandy.framework.base.utils.SerializeUtil;
import org.apache.shiro.cache.Cache;
import org.apache.shiro.cache.CacheException;

import java.util.*;

/**
 * Created by pandy on 16-5-4.
 */
public class JedisShiroCache<K, V> implements Cache<K, V> {
    private RedisUtil redisUtil;
    private final String REDIS_SHIRO_CACHE = "PANDY-WP-FRAMEWORK-CACHE";
    private String redisShiroCachePre;
    private String name;

    public JedisShiroCache(String name, RedisUtil redisUtil, String redisShiroCachePre) {
        this.name = name;
        this.redisUtil = redisUtil;
        this.redisShiroCachePre = redisShiroCachePre;
    }

    /**
     * 自定义relm中的授权/认证的类名加上授权/认证英文名字
     *
     * @return
     */
    public String getName() {
        if (name == null)
            return "";
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public V get(K key) throws CacheException {
        byte[] byteKey = SerializeUtil.serialize(getCacheKey(key));
        //byte[] byteValue = redisUtil.get(getCacheKey(key));
        Object byteValue = redisUtil.get(getCacheKey(key));
        return (V) byteValue;
    }

    public V put(K key, V value) throws CacheException {
        V previos = get(key);
        redisUtil.set(getCacheKey(key), value);
        return previos;
    }

    public V remove(K key) throws CacheException {
        V previos = get(key);
        redisUtil.remove(getCacheKey(key));
        return previos;
    }

    public void clear() throws CacheException {
        byte[] keysPattern = SerializeUtil.serialize(this.REDIS_SHIRO_CACHE + "*");
        redisUtil.removePattern(getCacheKey(keysPattern));
    }

    public int size() {
        if (keys() == null)
            return 0;
        return keys().size();
    }

    public Set<K> keys() {
        Set<K> set = (Set<K>) redisUtil.getPatternKey("*");
        return set;
    }

    public Collection<V> values() {
        List<V> result = new LinkedList<V>();
        return result;
    }

    private String getCacheKey(Object key) {
        if (redisShiroCachePre == null || redisShiroCachePre.trim().length() == 0)
            return this.REDIS_SHIRO_CACHE + getName() + ":" + key;
        else
            return this.REDIS_SHIRO_CACHE + "-" + redisShiroCachePre + getName() + ":" + key;
    }
}




<!-- 使用redis缓存管理器 -->
    <bean id="jedisShiroCacheManager" class="com.pandy.framework.base.shiro.cache.JedisShiroCacheManager">
        <property name="redisUtil" ref="redisUtil" />
        <property name="redisShiroCachePre" value="PANDY_WEB_APP_CACHE"/>
    </bean>
    <bean id="cacheManagerWrapper" class="com.pandy.framework.base.shiro.cache.CustomShiroCacheManager">
        <property name="shiroCacheManager" ref="jedisShiroCacheManager" />
    </bean>


RedisUtil.java参考: http://panyongzheng.iteye.com/blog/2295435
分享到:
评论

相关推荐

    shiro连接redis集群 根据org.crazycake.shiro包改造源码

    了解这些改造后,你可以根据源码学习如何在自己的项目中集成Shiro与Redis集群,以实现更高效、可靠的分布式安全解决方案。同时,这也提醒我们,开源社区的力量是巨大的,当原生功能不能满足需求时,可以寻找社区的...

    springboot +shiro+redis实现session共享(方案二)1

    "Spring Boot + Shiro + Redis 实现 Session 共享方案二" 1. 概述 本文档旨在介绍如何使用 Spring Boot、Shiro 和 Redis 实现分布式 session 共享,以解决 Web 应用程序的登录 session 统一问题。 2. 相关依赖 ...

    Shiro从入门到集群搭建

    在这个"Shiro从入门到集群搭建"的学习资料中,我们将深入理解Shiro的核心概念,并逐步学习如何在Spring环境下集成Shiro,最终实现集群部署。 首先,让我们从基础开始。Shiro的三个核心组件是Subject、Realms和...

    SpringBoot整合Shiro,实现从数据库加载权限、权限的动态更新、Session共享

    SpringBoot与Shiro的整合是Java开发中常见的一种安全控制技术组合,主要用于实现用户权限管理、会话管理和安全控制。本教程将详细讲解如何在SpringBoot应用中集成Shiro,以实现从数据库加载权限、权限的动态更新以及...

    shiro-redisson基于Redis的ShiroCache和Session实现

    `shiro-redisson` 提供的基于 Redis 的会话管理,可以将会话数据存储在 Redis 中,实现会话在集群中的共享,确保用户在任何节点上都能保持会话状态。 4. **配置与集成** 要使用 `shiro-redisson`,首先需要在 ...

    Shiro结合Redis实现分布式或集群环境下的Session共享

    Shiro结合Redis

    基于shiro前后端分离分布式权限管理(完整后端代码)

    本文将深入探讨基于Apache Shiro实现的前后端分离的分布式权限管理系统,结合Redis集群进行缓存管理的详细知识点。 首先,Apache Shiro是一个强大且易用的Java安全框架,主要用于身份认证、授权(权限控制)和会话...

    springboot+shiro+redis整合

    通过以上步骤,我们成功地将SpringBoot、Shiro和Redis整合在一起,实现了基于Shiro的安全控制和Redis的Session共享。这种架构方案适用于大型分布式系统,能够提供稳定、高效且安全的用户体验。在实际应用中,还可以...

    shrio redis实现集群模式下的session共享

    Shiro与Redis结合,可以通过自定义SessionDAO来实现在集群环境下的Session共享。首先,我们需要引入Shiro和Redis的相关依赖,包括Shiro的core库以及连接Redis的客户端如Jedis或Lettuce。接下来,我们需要创建一个...

    spring boot整合redis实现shiro的分布式session共享的方法

    Spring Boot 整合 Redis 实现 Shiro 的分布式 Session 共享 Shiro 是一个优秀的 Java 安全框架,提供了强大的身份验证、授权和会话管理功能。然而,在分布式架构中,Shiro 的会话管理机制需要进行特殊处理,以便...

    Apache_Shiro_使用手册(一)Shiro架构介绍

    - **服务端应用**:在服务端应用中,Shiro 可以帮助实现细粒度的权限控制和安全审计,保障系统的安全性。 总之,Apache Shiro 作为一款全面而灵活的安全框架,为 Java 开发者提供了强大的工具集,以应对各种安全...

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目.zip

    基于ssm+shiro+redis+nginx tomcat服务器集群管理项目.zip基于ssm+shiro+redis+nginx tomcat服务器集群管理项目.zip基于ssm+shiro+redis+nginx tomcat服务器集群管理项目.zip基于ssm+shiro+redis+nginx tomcat服务器...

    Spring shiro安全框架介绍

    - **完整的Servlet规范实现**:在Web应用中,Shiro完整实现了Servlet规范中的Session部分,从而支持原生会话。 此外,Shiro还支持通过调用`HttpServletRequest`或`HttpSession`的方法来操作会话,而这些调用最终会...

    shiro-redis-cluster

    本文将深入探讨如何在Spring MVC框架下实现Shiro与Redis集群的整合。 一、Shiro核心概念 1. 认证:验证用户身份的过程,确保用户是他们声称的人。 2. 授权:确定用户是否有权限执行特定操作。 3. 会话管理:跟踪...

    shiro-all jar

    6. **org.apache.shiro.session**: 会话管理模块,负责用户的会话状态维护,可以跨应用和服务器集群共享会话信息。 7. **org.apache.shiro.subject**: Shiro的核心概念,代表当前操作的主体(如用户),包括其认证...

    ssm集成redis和shiro

    1. **会话管理**: 通过Shiro的SessionManager,配置为使用Redis作为session的存储,实现分布式会话,解决集群环境下的session共享问题。 2. **权限缓存**: 将Shiro的权限信息缓存在Redis中,提高权限验证效率,同时...

    shiro介绍.pdf

    Shiro在Java领域中的应用广泛,可以在Web应用、非Web应用以及集群分布式应用中使用。 学习Shiro的原因有很多。首先,Shiro将安全认证的功能抽离出来,形成了一个独立的框架,开发者可以通过它快速构建安全功能。...

    跟我学shiro

    7. **Session Management**:Shiro可以接管应用的会话管理,包括会话的创建、读取、更新、删除以及超时处理,支持分布式会话,使得在集群环境下也能有效管理用户会话。 在"shiro-example-master"这个项目中,你可能...

    shiro登陆注销权限控制

    在这个项目中,登录和注销功能已经实现了基于Shiro的权限控制,确保用户只有在正确验证身份后才能访问特定资源。 描述中提到"将focus.sql在Mysql数据库执行",意味着项目依赖于MySQL数据库来存储用户信息和权限数据...

Global site tag (gtag.js) - Google Analytics