玖零定制问题修复的gravatar头像
玖零定制问题修复 2016-02-02 11:48:51
跟着和尚一步一步搭建spring mvc+springdata jpa+mybatis+shiro+bootstrap项目(四)

最近忙的要死都说年前轻松,我这是忙成狗的节奏,忙着工作交接,忙着新功能的开发,很多事情,项目基础已经跑通并且运行通过,为了满足小伙伴的需求,愧对这些日子大家的等待,和尚在此说声抱歉撒,现在让我们继续跟着项目走起吧

上次说shiro的权限需要在开发完用户功能后在次发布出来,现在给大家发布出来吧

SpringContext-shiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd"
       default-lazy-init="true">

    <!-- Shiro主过滤器本身功能十分强大,其强大之处就在于它支持任何基于URL路径表达式的、自定义的过滤器的执行 -->
    <!-- Web应用中,Shiro可控制的Web请求必须经过Shiro主过滤器的拦截,Shiro对基于Spring的Web应用提供了完美的支持 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- Shiro的核心安全接口,这个属性是必须的 -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 要求登录时的链接(可根据项目的URL进行替换),非必须的属性,默认会自动寻找Web工程根目录下的"//index.jsp"页面 -->
        <!-- 要求登录时的链接,非必须的属性,默认会自动寻找Web工程根目录下的"/login.jsp"页面 -->
        <property name="loginUrl" value="/user/userLogin"/>
        <!-- 登录成功后要跳转的连接(本例中此属性用不到,因为登录成功后的处理逻辑在LoginController里硬编码为success了) -->  
        <property name="successUrl" value="/login/sucess"/>
        <!-- 用户访问未对其授权的资源时,所显示的连接 -->  
        <property name="unauthorizedUrl" value="/login/unauthorized"/>

        <!-- Shiro连接约束配置,即过滤链的定义 -->
        <!-- 下面value值的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的 -->
        <!-- anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种 -->
        <!-- authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter -->
        <property name="filterChainDefinitions">
            <value>
                <!-- 访问资源不需要尽情权限验证 -->
                /static/** = anon
                /assets/** = anon
                /upload/** = anon
                /favicon.ico = anon
                /logout = logout
                /user/userRegist = anon
                /user/userForget = anon
                <!-- 登录验证后才能访问 -->
                /user/userLogin =  authc
                <!-- 所有用户登录后才可以访问 -->
                /** = user
            </value>
        </property>
        <property name="filters">
            <map>
                <!-- 用户登录验证 -->
                <entry key="authc" value-ref="peakFormAuthenticationFilter"/>
            </map>
        </property>
    </bean>

    
    <!-- Shiro默认会使用Servlet容器的Session,可通过sessionMode属性来指定使用Shiro原生Session -->
    <!-- 即<property name="sessionMode" value="native"/>,详细说明见官方文档 -->
    <!-- 这里主要是设置自定义的单Realm应用,若有多个Realm,可使用'realms'属性代替 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="peakAuthorizingRealm"/>
        <property name="cacheManager" ref="shiroCacheManager"/>
    </bean>


    <!-- 继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的AuthenticationRealm -->
    <bean id="peakAuthorizingRealm" class="com.peak.base.shiro.PeakAuthorizingRealm" depends-on="sysUserDao,sysRoleDao">
        <property name="authorizationCacheName" value="peakAuthorization"/>
    </bean>

    <bean id="shiroCacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManager" ref="ehCacheManager"/>
    </bean>
    
    <bean id="peakFormAuthenticationFilter" class="com.peak.shiro.PeakFormAuthenticationFilter"/>

    <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
        <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/>
        <property name="arguments" ref="securityManager"/>
    </bean>

    <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</beans>

SpringContext-shiro-cache.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
       xmlns:util="http://www.springframework.org/schema/util" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:cache="http://www.springframework.org/schema/cache"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.1.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd
        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.1.xsd">
    <cache:annotation-driven cache-manager="ehCacheCacheManager" />

    <!-- cacheManager工厂类,指定ehcache.xml的位置 -->
    <bean id="ehCacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:spring/ehcache.xml" />
        <property name="shared" value="true" />
    </bean>

    <!-- 声明ehCacheCacheManager -->
    <bean id="ehCacheCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehCacheManager" />
    </bean>
</beans>

ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    <!--
    name:Cache的唯一标识
    maxElementsInMemory:内存中最大缓存对象数
    maxElementsOnDisk:磁盘中最大缓存对象数,若是0表示无穷大
    eternal:Element是否永久有效,一但设置了,timeout将不起作用
    overflowToDisk:配置此属性,当内存中Element数量达到maxElementsInMemory时,Ehcache将会Element写到磁盘中
    timeToIdleSeconds:设置Element在失效前的允许闲置时间。仅当element不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大
    timeToLiveSeconds:设置Element在失效前允许存活时间。最大时间介于创建时间和失效时间之间。仅当element不是永久有效时使用,默认是0.,也就是element存活时间无穷大
    diskPersistent:是否缓存虚拟机重启期数据
    diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒
    diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区
    memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)
    -->
    <diskStore path="java.io.tmpdir/cache"/>
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120"
                  overflowToDisk="true" diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" diskPersistent="false"
                  diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/>
    <cache name="peakAuthorization" maxElementsInMemory="100" timeToLiveSeconds="3600" eternal="false" overflowToDisk="false"/>
</ehcache>

通过配置这些参数,然后配置下自己的realm

继承自AuthorizingRealm的自定义Realm,即指定Shiro验证用户登录的类为自定义的AuthenticationRealm
public class PeakAuthorizingRealm extends AuthorizingRealm{
	
	private static final Logger logger = LoggerFactory.getLogger(PeakAuthorizingRealm.class);
	
	@Resource(name="sysUserService")
	private SysUserService sysUserService;
	
	 /**
         * 为当前登录角色授权
         */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) throws AuthenticationException {
		//配置角色登录授权功能方法,我想大家应该都明白用户,角色,权限3者之间的关联关系吧,这里就不过多的解释代码信息了,自行脑补
	}
	
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(org.apache.shiro.authc.AuthenticationToken token) throws AuthenticationException {
		 获取认证信息,也就是验证当前用户是否有权限登录的一个方法,小伙伴自行脑补, 
		
	}
}

因为是介绍大体的配置文件,所以涉及到功能性的就没有给小伙伴门脑补出来,大家多多担待有问题可以找和尚沟通,群462067739 只为大家一起共同进步 


打赏
最近浏览
jiezzzz  LV3 2020年4月16日
mjzxcyypp  LV13 2020年4月10日
jameszui 2019年6月18日
暂无贡献等级
1173089058  LV2 2019年5月6日
friendy  LV1 2019年2月19日
yaonce 2018年11月26日
暂无贡献等级
胡天宝  LV6 2018年11月12日
jinaaaddd 2018年5月24日
暂无贡献等级
justin8023  LV3 2018年3月12日
原配撑小伞  LV1 2017年10月12日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友