但行好事
莫论前程❤

Shiro整合Spring的配置说明

本文主要介绍如何将Apache Shiro集成到基于Spring的应用。

Shiro兼容javabean使得它能很好的与Spring XML或其他基于Spring的配置方式集成。在基于Shiro的应用程序中的SecurityManager是单例的。不过,SecurityManager不一定是静态单例,但是不论是否是静态单例,必须保证一个应用程序中只有一个SecurityManager的实例。

下面是在Spring的应用程序中的配置文件:

  • 定义连接后台安全数据源的realm
<!-- 定义连接后台安全数据源的realm -->
<!-- Realm实现 -->
<bean id="myRealm" class="com.feinno.perftrace.web.shiro.realm.PtRealm">
   <!-- <property name="userService" ref="userService" /> -->
        <property name="credentialsMatcher" ref="credentialsMatcher"/>
        <property name="cachingEnabled" value="true"/>
        <property name="authenticationCachingEnabled" value="true"/>
        <property name="authenticationCacheName" value="authenticationCache"/>
        <property name="authorizationCachingEnabled" value="true"/>
        <property name="authorizationCacheName" value="authorizationCache"/>
</bean>
  • 安全管理器
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <!-- 单realm应用。如果有多个realm,使用‘realms’属性代替 -->
        <property name="realm" ref="userRealm"/>
        <property name="sessionManager" ref="sessionManager"/>
        <property name="cacheManager" ref="cacheManager"/>
        <property name="rememberMeManager" ref="rememberMeManager"/>
</bean>
  • shiro生命周期处理器
<!-- Shiro 生命周期处理器 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
  • 缓存处理器使用Ehcache实现
<!-- 缓存管理器使用Ehcache实现 -->
 <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/>
</bean>
  • 凭证匹配器
<!-- 凭证匹配器 -->
<bean id="credentialsMatcher"   class="com.feinno.perftrace.web.shiro.matcher.PtRetryLimitHashedCredentialsMatcher">
        <constructor-arg ref="cacheManager"/>
        <property name="hashAlgorithmName" value="md5"/>
        <property name="hashIterations" value="2"/>
        <property name="storedCredentialsHexEncoded" value="true"/>
</bean>
  • 会话ID生成器
<!-- 会话ID 生成器 -->
<bean id="sessionIdGenerator"
          class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
  • 会话DAO
<!-- 会话DAO -->
<bean id="sessionDAO"
          class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">
        <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>
        <property name="sessionIdGenerator" ref="sessionIdGenerator"/>
</bean>
  • 会话验证调度器sessionValidationInterval: 设置调度时间间隔
<!-- 会话验证调度器 sessionValidationInterval:设置调度时间间隔 -->
<bean id="sessionValidationScheduler"
          class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler">
        <property name="sessionValidationInterval" value="18000000"/>
        <property name="sessionManager" ref="sessionManager"/>
</bean>
  • 会话Cookie模板
<!-- 会话Cookie 模板 -->
<bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="sid"/>
        <property name="httpOnly" value="true"/>
        <property name="maxAge" value="1800"/>
</bean>
  • 记住密码cookie
<!-- 记住密码cookie -->
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
        <constructor-arg value="rememberMe"/>
        <property name="httpOnly" value="true"/>
        <property name="maxAge" value="2592000"/><!-- 30天 30*24*60*60 -->
</bean>
  • rememberMe管理器,cipherKey是加密rememberMe Cookie的密钥;默认AES算
<!-- rememberMe管理器,cipherKey是加密rememberMe Cookie的密钥;默认AES算 -->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
        <property name="cipherKey"
value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/>
        <property name="cookie" ref="rememberMeCookie"/>
</bean>
  • 会话管理器
<!-- 会话管理器 globalSessionTimeout:设置全局会话超时时间,默认30分钟,即如果30分钟内没有访问会话将过期 sessionValidationSchedulerEnabled:是否开启会话验证器,默认是开启的 -->
 <bean id="sessionManager"
          class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager">
        <property name="globalSessionTimeout" value="18000000"/>
        <property name="deleteInvalidSessions" value="true"/>
        <property name="sessionValidationSchedulerEnabled" value="true"/>
        <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>
        <property name="sessionDAO" ref="sessionDAO"/>
        <property name="sessionIdCookieEnabled" value="true"/>
        <property name="sessionIdCookie" ref="sessionIdCookie"/>
        <!--<property name="sessionListeners" ref="sessionListener1" />-->
</bean>
  • 监听会话
<!-- 监听会话 -->
<bean id="sessionListener1" class="com.loan.util.MySessionListener1"></bean>
  • 控制并发登录人数
<!-- kickoutSessionControlFilter 用于控制并发登录人数的 -->
 <bean id="kickoutSessionControlFilter"
    class="com.loan.util.KickoutSessionControlFilter">
    <property name="cacheManager" ref="cacheManager" />
    <property name="sessionManager" ref="sessionManager" />
    <property name="kickoutAfter" value="false" />
    <property name="maxSession" value="2" />
    <property name="kickoutUrl" value="/login?kickout=1" />
 </bean>
  • 配置认证相关filter
 <!--配置认证相关filter-->
 <bean id="jwtFilter" class="com.feinno.perftrace.web.filter.authority.PtJwtFilter">
        <!--暂时空闲,尚不确定配置什么属性给自定义的filter-->
 </bean>
  • 相当于调用SecurityUtils.setSecurityManager(securityManager)
<!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) -->
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod"
                  value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
        <property name="arguments" ref="securityManager"/>
</bean>
  • 提交表单认证
<!-- 提交表单认证 -->
<bean id="formAuthenticationFilter" 
          class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">
        <property name="usernameParam" value="username"/>
        <property name="passwordParam" value="password"/>
        <property name="rememberMeParam" value="rememberMe"/>
        <property name="loginUrl" value="/login.pinpoint"/>
</bean>
  • shiro的web过滤器
<!-- Shiro 的Web过滤器 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
        <property name="loginUrl" value="/index.html"/>
        <!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑在LoginController里硬编码为main.jsp了) -->
        <property name="successUrl" value="/index.html"/>
        <!--访问未授权内容时的url-->
        <property name="unauthorizedUrl" value="/index.html"/>
        <property name="filters">
            <util:map>
                <entry key="authc" value-ref="jwtFilter"/>
                <!--<entry key="authc" value-ref="formAuthenticationFilter" />-->
                <!--<entry key="kickout" value-ref="kickoutSessionControlFilter"/>-->
            </util:map>
        </property>
        <property name="filterChainDefinitions">
            <value>
                <!--/static/** = anon-->
                <!--/index = anon-->
                <!--/unauthorized = anon-->
                <!--/login =authc-->
                <!--/logout = logout-->
                <!--/admin/**=user,kickout-->
                /amcharts/**=anon
                /common/**=anon
                /components/**=anon
                /features/**=anon
                /fonts/**=anon
                /images/**=anon
                /lib/**=anon
                /pages/**=anon
                /scripts/**=anon
                /styles/**=anon
                /favicon.ico=anon
                /*.png=anon
                /*.html=anon
                /login.perftrace=anon
                <!--待商榷的两个放行的方法,原因是先于login加载-->
                /configuration.perftrace=anon
                /applications.perftrace=anon
                <!--放行注册-->
                /register.perftrace=anon
                <!--开发用户管理时需注释掉-->
                /**=authc
                <!--开发用户管理时需放开-->
                <!--/*.perftrace=anon-->
            </value>
        </property>
    </bean>
  • 异常解析器
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="org.apache.shiro.authz.UnauthorizedException">
                    /unauthorized
                </prop>
                <prop key="org.apache.shiro.authz.UnauthenticatedException">
                    /login
                </prop>
            </props>
        </property>
    </bean>
  • 配置用于开启Shiro Spring AOP 权限注解的支持
 <!-- 配置用于开启Shiro Spring AOP 权限注解的支持 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor">
</bean>
<aop:config proxy-target-class="true"/>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
</bean>
<!--<mvc:resources mapping="/static/**" location="/static/" cache-period="2592000"/>-->
赞(1) 打赏
未经允许不得转载:刘鹏博客 » Shiro整合Spring的配置说明
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏