`

shiro 集成相关说明

阅读更多

 

最近,将一个单一的maven项目拆分为多maven模块的项目时候, 不知道是什么原因,导致集成shiro的时候出现如下异常信息:

 Another unnamed CacheManager already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
|1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with 
same name or create one if necessary
|2. Shutdown the earlier cacheManager before creating new one with same name.
|The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ] 

最后在网络上度娘了下,

1、有的说是shiro的版本问题,但是项目中因为引用了hibernate-ehcache和shiro-ehcache 这2个包,自己就带了shiro-core-2.4.3.jar包,不知道是shiro的,还是hibernate依赖的,所以,直接不用原来的shiro-core包,自己直接在maven中添加依赖shiro-core-2.4.8.jar(必须2.5.0以下的),可以解决这个问题;

2、另外就可以修改配置文件来解决:

        <!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">   

            <property name="realm" ref="shiroDbRealm" />

            <property name="cacheManager" ref="cacheManager"/>

</bean>

 

    <!-- 缓存管理器,使用EhCache实现-->

    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">

        <!--<property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>-->

        <property name="cacheManager" ref="ehCacheManager"></property>

    </bean>  

将上边的的cacheManager 管理自己实现直接交给spring来实现的,并且spirng让ehcache 共享(必须);具体配置cacheManager引用如下配置即可;

        <bean id="ehCacheManager" class ="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  

                  <property name="configLocation" value="classpath:ehcache-shiro.xml" />

              <property name="shared" value="true"></property> (关键)

</bean>

 

这样配置也可以解决相关问题。

 

 =======================shiro相关说明=============================================

 

securityManager是Shiro配置的核心,一般情况下可以做如下配置,其中只有realm是必须配置的

        <!-- 安全管理器 -->

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">   

          <property name="realm" ref="shiroDbRealm" />

          <property name="sessionManager" ref="sessionManager"/>

          <property name="cacheManager" ref="cacheManager"/>

          <!--<property name="cacheManager" ref="memoryCacheManager"/>-->

</bean> 

1.realm

realm中两个方法 AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)登陆认证 和 AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals)权限验证 的实现位置,基本上都需要自己实现

个别情况下,比如当使用Shiro-Cas的时候,doGetAuthenticationInfo方法不需要自己实现

 

2.SessionManager

       SessionManager默认是 ServletContainerSessionManager 

当使用ServletContainerSessionManager时,验证登陆返回值AuthenticationInfo,中的Principal会被保存到HttpSession中,最后构造的shiro.session接口实现类中一个属性为HttpSession

 

      如果使用DefaultWebSessionManager时,会用到SessionDAO,默认的实现是MemorySessionDAO(在其父类DefaultSessionManager中可以看到),如果使用MemorySessionDAO,Principal信息会被保存到MemorySessionDAO维护的一个 ConcurrentMap<Serializable, Session> sessions 中,如果要自己实现中央缓存,就重写该一个AbstractSessionDAO的子类并实现相关方法。

 

       注意

       1、本地缓存通过EhCache实现,失效时间一定要远小于Redis失效时间,这样本地失效后,会访问Redis读取,并重新设置Redis上会话数据的过期时间。

       2、redisSessionDao是继承CachingSessionDAO来实现,可以减少访问redis的频度;

 

       这里有个可能出现bug的地方,可以通过配置sessionIdCookie属性,解决被服务器重写cookie中会话ID,导致会话丢失的问题(默认是“JSESSIONID”,跟tomcat和jetty一样)

 

<!-- sessionManager 引入session保存的Dao和session命名 -->

    <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">

        <!-- 设置全局会话超时时间,默认30分钟(1800000)-->

        <property name="globalSessionTimeout" value="30000"/>

        <!-- 是否在会话过期后会调用SessionDAO的delete方法删除会话 默认true-->  

<property name="deleteInvalidSessions" value="true"/>  

        <property name="sessionDAO" ref="redisSessionDao"/>

        <!-- 是否开启会话验证器任务 默认true -->

        <property name="sessionValidationSchedulerEnabled" value="true"/>

        <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>

        <!-- 会话验证器调度时间 ,因为上边的 sessionValidationScheduler 中已经配置的调度时间,故如此处不在重复-->

        <!--<property name="sessionValidationInterval" value="3600000"/>-->

        <property name="sessionIdCookie" ref="sessionIdCookie"/>

   </bean>

 

     <!-- 配置session名字 避免与tomcat,jetty等session冲突默认JSESSIONID,修改用于防止访问404页面时,容器生成的标识把shiro的覆盖掉 -->

    <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">

        <constructor-arg name="name" value="SHIROSESSIONID"/>

    </bean>

    

    <!-- session 序列化存储 -->

    <bean id="redisSessionDao" class="com.ch.bigdata.common.redis.service.RedisSessionDAO"></bean>

    

       所以memcached-session-manager做负载均衡 和 DefaultWebSessionManager 是冲突的,可以考虑自己实现一个SessionDAO来完成负载均衡中会话管理功能

 

3.CacheManager

cacheManager的作用是保存doGetAuthorizationInfo(权限验证)中的返回结果,如果没有配置cacheManager,每一次权限认证都需要重新调用该方法。

 

 

 

 ======shiro 权限框架在session 失效后,点击某个链接,或刷新页面,重新登录后不跳转到成功页面====

        遇到的场景是,访问项目名,类似http://localhost:8080/xxx/,shiro会通过过滤器,进入你配置的loginUrl,然后登录成功后,它会记住你之前访问的链接,那么就自然进入了http://localhost:8080/xxx/,这个时候如果你的拦截器配置(filterChainDefinitions)没有配置好/的访问权限的话,就导致页面加载不到rc.contextPath,自己配置的successUrl都没有用,除非重写formAuthenticationFilter;

       解决方法见这篇文章:

       http://www.cnblogs.com/sevenlin/p/sevenlin_shiro20150924.html (Shiro登录成功之后跳到指定URL)这篇文章已经说明了原因了!

        

 

 

 

 

 

 

分享到:
评论

相关推荐

    Apache_Shiro中文开发说明文档.docx

    这个中文开发文档详细介绍了如何在项目中集成和使用Shiro,帮助开发者构建安全的系统。 **1. 什么是Shiro?** Apache Shiro 是一个强大且易用的Java安全框架,提供了身份认证、授权、会话管理和加密等功能。它将...

    SpringBoot整合Shiro后实现免密登录

    1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增MyRetryLimitCredentialsMatcher,重写...

    shiro安全框架

    Apache Shiro是一个强大且易用的Java安全框架,它提供了认证、授权、加密以及...同时,`东坡软件下载说明.txt`和`东坡软件下载.url`可能包含关于下载和使用Shiro的额外信息,例如安装步骤、注意事项或者更新日志等。

    shiro相关实现例子以及shiro教程文档

    6. **Filter Chain Configuration Example**:过滤器链配置,说明如何在Web环境中设置Shiro过滤器。 通过阅读PDF教程和研究示例代码,你可以深入理解Shiro的工作原理,并在自己的项目中灵活应用。Shiro的简洁API和...

    shiro.freemarker.ShiroTags已打包

    ShiroTags 是 Shiro 提供的一套用于模板引擎的标签库,如 Freemarker 和 JSP,它们使得在视图层集成权限控制变得更为便捷。 `com.jagregory.shiro.freemarker.ShiroTags` 是 Jagregory 开发的一个扩展,将 Apache ...

    SSM项目集成shiro搭建session共享

    以下是对这些技术及其集成应用的详细说明: 1. **SpringMvc**:SpringMvc是Spring框架的一部分,作为一个轻量级的MVC(Model-View-Controller)框架,它简化了Web应用程序的开发。SpringMvc通过DispatcherServlet...

    Shiro与SSM整合(内含详细文档介绍)

    这个资料包中的"Shiro"文件可能包含了Shiro的核心类库和示例代码,"简单实用说明.txt"可能是关于整合过程的简要指南,而"M-Shiro"和"ShiroSSM"可能是更详细的文档或者示例项目,帮助开发者深入理解Shiro与SSM的整合...

    基于springboot+mybatis+shiro+activity的企业办公Oa系统(源码+数据库),个人学习,本科毕业设计

    说明 功能: 用户模块 日志模块 考勤模块 工作流模块 请假 岗位 会议申请 菜单 。。。 项目经过严格测试,确保可以运行!基于springboot+mybatis+shiro+activity构建的企业办公Oa系统,适合个人学习,本科毕业设计...

    shiro-all-1.2.3.jar

    Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常轻松地开发出足够安全的应用。...遵循这些说明,开发者可以轻松地将Apache Shiro集成到项目中,实现高效的安全管理。

    安全架构shiro手册说明

    Shiro 的认证过程简洁明了,易于集成到现有系统中。 **授权**:Shiro 的授权机制支持细粒度的访问控制,可以基于角色、资源或特定条件进行权限分配。开发者可以通过简单的API来控制用户对资源的访问权限,如允许或...

    Shiro+SpringMVC+Spring集成

    标题 "Shiro+SpringMVC+Spring集成" 涉及的是在Web开发中整合Apache Shiro、Spring MVC和Spring框架的过程。这三个组件都是Java Web开发中的重要工具,Shiro负责安全认证和授权,Spring MVC处理MVC模式的实现,而...

    spring+shiro+ehcache例子

    项目简介:此项目只是简单的集成spring+springmvc+shiro+ehcahce 二: 步骤说明: 1:项目集成spring 在web.xml中配置spring容器的监听器。 2:项目集成springmvc 在web.xml中配置前端控制器 3:项目集成...

    shiro官方教程中文版和spring整合说明文档

    通过阅读提供的"shiro 安全框架--最好的中文配置文档.pdf"和"Apache_Shiro_reference(中文版).pdf",你可以更深入地了解Shiro的原理、配置和使用,同时掌握如何将它无缝集成到Spring环境中,构建安全的Java应用程序...

    跟我学shiro综合实例(springboot新版)

    1. **Spring Boot与Shiro集成** - **起步配置**:在Spring Boot项目中引入Shiro依赖,通常通过在`pom.xml`中添加Shiro的Maven依赖来完成。 - **Shiro配置**:创建一个自定义的`ShiroConfig`类,配置Shiro的Filter ...

    shiro在springmvc里面的集成使用

    以下是对 Shiro 在 Spring MVC 中集成使用的详细说明。 首先,Shiro 的核心组件包括 Realm(领域)、SecurityManager(安全管理器)、Subject(当前用户对象)等。在 Spring MVC 中集成 Shiro,我们需要配置 ...

    一个简单的shiro例子

    "基于IDEA IDE开发"说明这个项目是在IntelliJ IDEA环境下构建的,IDEA是目前Java开发者广泛使用的集成开发环境,具有强大的代码编辑、调试和测试功能。 "可以直接运行"意味着该项目包含完整的配置和依赖,用户下载...

    Shiro教程-孙开涛

    - **环境准备**:在进行身份验证之前,需要设置好开发环境,包括引入Shiro相关的依赖库以及配置必要的Shiro组件。 - **登录/退出**:这是Shiro中最基础的操作之一,通过配置Shiro的`LoginController`等类来实现用户...

    Shiro的一个demo

    在这个"Shiro的一个demo"中,我们可以学习到如何在实际项目中集成和使用Shiro来实现基本的安全控制。 首先,我们从`readme.htm`开始。这个文件通常包含了关于演示项目的简要介绍和步骤说明。它可能解释了如何设置...

    单点登录sso-shiro-cas-maven

    ## cas集成说明 1.首先采用的是查数据库的方式来校验用户身份的,在cas/WEB-INF/deployerConfigContext.xml中第135行构建了这个类型 ``` xml &lt;!-- 设置密码的加密方式,这里使用的是MD5加密 --&gt; class="org.jasig...

    shiro 安全框架 概念性的说明文档

    会话管理:Shiro提供了会话管理的功能,它能够处理与每个用户相关的、时间敏感的状态信息。这意味着Shiro能够维护用户在应用程序中的登录状态,并在需要时进行管理。 此外,Shiro还支持其他辅助特性,例如Web应用...

Global site tag (gtag.js) - Google Analytics