ApacheShiro的会话管理提供了一个非常令人兴奋的功能,你可通过Shiro本身实现会话集群而不需要担心容器的环境。你使用Shiro本身的会话和会话集群可以部署到Tomcat,Jetty,JBOSS,Geronimo等任何的环境下,而不用担心容器或环境对集群设置所需要的特定配置。Shiro的会话集群只需配置一次就可运行在任何环境下。
这是怎么做到的呢?
一切是基于Shiro的POJO体系结构,使得创建会话集群非常简单,只要在会话持久层实现集群机制。也就是说,如果你配置了一个具有集群功能的SessionDAO,这个DAO就可以与集群机制交互而SessionManager并不需要知道集群的细节。
分布式缓存
现在很多分布式缓存解决方案都已经解决了分布式数据保存在持久层的问题,像Ehcache+TerraCotta,GigaSpacesOracleCoherence和Memcached等等。因此在Shiro中创建会话缓存非常简单,只需配置好某个分布式缓存机制。
在实现一个分布式或企业级高速缓存时,对于集群会话存贮需要注意两点:
1、有足够的内存保留所有的当前会话
2、如果没有足够的内存来保留所有活动的会话,它必须支持磁盘溢出,确保会话不会丢失。
EnterpriseCacheSessionDAO
Shiro本身已经提供了一个SessionDAO的实现能保存企业级/分布式的缓存数据。这个实现就是EnterpriseCacheSessionDAO,可以在CacheManager中配置它来实现缓存机制。配置如下:
#Thisimplementationwoulduseyourpreferreddistributedcachingproduct'sAPIs:
activeSessionCache=my.org.apache.shiro.cache.CacheImplementation
sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
sessionDAO.activeSessionCache=$activeSessionCache
securityManager.sessionManager.sessionDAO=$sessionDAO
|
虽然象上面介绍的方法你可要直接往SessionDAO里注入一个Cache实例,但还可以用一种更常见的方式可以为Shiro中所有需要用到缓存的地方配置一个通用的CacheManager。在这种方式中你可以告诉EnterpriseCacheSessionDAO一个Cache的名字,而这个Cache是用来存储活动的会话。
例如:
#Thisimplementationwoulduseyourcachingproduct'sAPIs:
cacheManager=my.org.apache.shiro.cache.CacheManagerImplementation
#NowconfiguretheEnterpriseCacheSessionDAOandtellitwhat
#cacheintheCacheManagershouldbeusedtostoreactivesessions:
sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
#Thisisthedefaultvalue.ChangeitifyourCacheManagerconfiguredadifferentname:
sessionDAO.activeSessionsCacheName=shiro-activeSessionsCache
#NowhavethenativeSessionManagerusethatDAO:
securityManager.sessionManager.sessionDAO=$sessionDAO
#ConfiguretheaboveCacheManageronShiro'sSecurityManager
#touseitforallofShiro'scachingneeds:
securityManager.cacheManager=$cacheManager
|
这种配置方法的特点是不论配置在什么地方,实际上是告诉SessionDAO实例都要使用Cache或CacheManager。那么SessionDAO是怎么使用分布式缓存呢?
当Shiro初始化SecurityManager时,它会检查SessionDAO是否实现了CacheManagerAware的接口。如果是的话,它会自动支持任何可用的全局配置的CacheManager。
当Shiro读到securityManager.cacheManager=$cacheManager这一行时,它会发现EnterpriseCacheSessionDAO实现了CacheManagerAware的接口并且调用setCacheManager方法,将你配置的CacheManager作为方法参数。
然后在运行时,当EnterpriseCacheSessionDAO需要activeSessionsCache的时候将要求CacheManager实例化并返回它,使用activeSessionsCacheName做为查询的关键字来得到缓存实例。该高速缓存实例将被用于存储和检索会话所有的SessionDAOCRUD操作。
使用Ehcache+Terracotta
在Shiro中使用Enchache+Terracotta提供分布式缓存解决方案已相当成熟。在这个解决方案中象上面描述的Enchache会话缓存配置将不能正常工作,需要做一些Terracotta配置。配置信息要保存到一个enchance.xml文件,例如:
<ehcache>
<terracottaConfigurl="localhost:9510"/>
<diskStorepath="java.io.tmpdir/shiro-ehcache"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="false"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120">
<terracotta/>
</defaultCache>
<cachename="shiro-activeSessionCache"
maxElementsInMemory="10000"
eternal="true"
timeToLiveSeconds="0"
timeToIdleSeconds="0"
diskPersistent="false"
overflowToDisk="false"
diskExpiryThreadIntervalSeconds="600">
<terracotta/>
</cache>
<!--Addmorecacheentriesasdesired,forexample,
Realmauthc/authzcaching:-->
</ehcache>
|
你需要修改<terracottaConfigurl="localhost:9510"/>的内容,写入相应的Terracotta服务器阵列的主机/端口。另请注意,activeSessionCache元素的diskPersistent或overflowToDisk属性都应该是false的,在群集配置中不支持true。
除此之外还需要在Shiro中进行配置:
sessionDAO=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO
#Thisnamematchesacachenameinehcache.xml:
sessionDAO.activeSessionsCacheName=shiro-activeSessionsCache
securityManager.sessionManager.sessionDAO=$sessionDAO
#ConfigureTheEhCacheManager:
cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager
cacheManager.cacheManagerConfigFile=classpath:ehcache.xml
#ConfiguretheaboveCacheManageronShiro'sSecurityManager
#touseitforallofShiro'scachingneeds:
securityManager.cacheManager=$cacheManager
|
请记住,顺序很重要。通过在SecurityManager最后配置CacheManager,我们能确保CacheManager可以传播到所有先前配置的CacheManagerAware组件(如EnterpriseCachingSessionDAO)中。
分享到:
相关推荐
- **定义**:Apache Shiro 是一款强大且灵活的开源安全框架,它致力于简化应用程序的安全性问题,包括身份验证(Authentication)、授权(Authorization)、会话管理(Session Management)以及加密(Cryptography)...
Apache Shiro 是一款功能强大且易于使用的 Java 安全框架,它提供了多种安全相关的功能和服务,包括但不限于认证、授权、加密和会话管理。相较于其他安全框架,Shiro 在设计上更为简洁明了,便于开发者的理解和使用...
Apache Shiro是一个强大且易用的安全管理框架,用于身份验证、授权、会话管理和加密。在仓库管理系统中,Shiro可以实现用户登录验证、角色权限分配、访问控制等功能,确保只有经过认证和授权的用户才能访问特定的...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。Shiro 1.10.0 版本是该框架的一个稳定版本,包含了自上个版本以来的一些改进和新特性。...
Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证、授权、加密和会话管理等功能。Shiro 的架构主要包括三个核心组件:Subject、SecurityManager 和 Realm。 1. 认证(Authentication):用户身份识别,常...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用程序。它不仅适用于传统的Web应用,也适用于现代的Java应用,如JavaFX、GWT、Spring Boot...
6. **org.apache.shiro.session**: 会话管理模块,负责用户的会话状态维护,可以跨应用和服务器集群共享会话信息。 7. **org.apache.shiro.subject**: Shiro的核心概念,代表当前操作的主体(如用户),包括其认证...
Apache Shiro是一个强大的Java安全框架,它为开发者提供了一种简单易用的方式来处理认证、授权、密码加密以及会话管理等关键的安全需求。这个框架旨在简化应用的安全实现,让开发者可以专注于业务逻辑,而不是复杂的...
此外,Shiro 还支持会话的分布式管理,使得在集群环境中能够共享会话状态。 4. 加密(Cryptography) Shiro 提供了一系列的加密工具,如密码哈希、消息摘要和对称/非对称加密算法,以增强数据的安全性。这有助于...
Shiro 提供了会话管理功能,可以跨服务器集群共享会话数据。它还支持会话超时、监听器和事件通知,以实现定制的会话行为。 9. **Cryptography** (密码) Shiro 包含了加密工具,用于密码的存储和验证,支持散列、...
Apache Shiro是一个强大的Java安全框架,它提供了身份验证、授权、会话管理和加密等功能。在分布式系统中,尤其是在使用Redis作为缓存或session存储时,Shiro的原生支持可能无法直接与Redis集群配合工作。这里提到的...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用——无论它们是部署在单一用户开发环境还是多服务器集群环境中。Shiro 的设计目标是...
4. **分布式会话**:在集群环境中,Shiro支持跨服务器的会话共享。 **四、加密(Cryptography)** Shiro提供了多种加密工具,用于安全地存储凭证或保护敏感数据: 1. **密码散列(Hashing)**:将密码转化为不...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。在这个"Shiro从入门到集群搭建"的学习资料中,我们将深入理解Shiro的核心概念,并逐步...
3. **会话管理**:Shiro可以帮助开发者管理用户的会话,包括会话创建、更新、查询、销毁等操作,同时还可以实现分布式会话,解决集群环境下会话同步的问题。 4. **加密**:Shiro 提供了丰富的加密工具,如散列函数...
Apache Shiro是一个开源的安全框架,它提供了在Java应用程序中实现身份验证、授权、会话管理和加密的功能。Shiro的主要目标是提供易于使用和理解的安全性,其设计理念是将复杂的操作简化,使得开发者在构建安全的...
Apache Shiro 是一个强大且易用的 Java 安全框架,它提供了身份验证、授权、密码管理和会话管理等功能,简化了在 Java 应用程序中处理安全性的问题。Shiro 的设计目标是使开发者能够专注于应用程序的安全逻辑,而...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用程序。它不仅适用于传统的Web应用,还能很好地适应现代的分布式系统环境。 《Apache ...
`shiro-redisson` 提供的基于 Redis 的会话管理,可以将会话数据存储在 Redis 中,实现会话在集群中的共享,确保用户在任何节点上都能保持会话状态。 4. **配置与集成** 要使用 `shiro-redisson`,首先需要在 ...
3. **会话管理(Session Management)**:Shiro 可以跨应用服务器管理会话,支持分布式会话,这使得在集群环境中也能保持会话状态的一致性。此外,它还提供了会话监听器,以便在会话创建、更新、过期等事件发生时...