springmvc+shiro+echache+maven

来源:互联网 发布:温暖的h5小动画源码 编辑:程序博客网 时间:2024/06/11 17:43

关于shiro的具体概念和用处,大家可以网上查阅详细的资料,本文主要讲述的是如何应用和整合进框架,另外把ecache整合shiro可以提高性能,此次就不再赘述了,直接上代码。

1:maven的pom.xml文件(两种形式,前者依次加入,后者包含了前面的所有jar包,推荐后者,另外版本可以选择)

A:<dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.2.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.2.4</version>
    </dependency>
    
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.2.4</version>
    </dependency>

 <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-ehcache</artifactId>
        <version>1.2.4</version>
    </dependency>

<dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.5</version>
        </dependency>

B:<dependency>
              <groupId>org.apache.shiro</groupId>
              <artifactId>shiro-all</artifactId>
              <version>1.2.2</version>
          </dependency>

<dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache-core</artifactId>
            <version>2.6.5</version>
        </dependency>  

2:添加完maven依赖后,打开web.xml文件配置shiro过滤器

<filter>
        <!-- 这里的 filter-name 要和 spring 的 applicationContext.xml 里的 org.apache.shiro.spring.web.ShiroFilterFactoryBean
            的 bean name 相同 -->
        <filter-name>shiroSecurityFilter</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
        <init-param>
            <param-name>targetFilterLifecycle</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>shiroSecurityFilter</filter-name>
        <url-pattern>*.do</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>

3:配置一个ehcache.xml文件,放在resource文件夹下面

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

  
    <diskStore path="java.io.tmpdir"/>
    <!--
    Mandatory Default Cache configuration. These settings will be applied to caches
    created programmtically using CacheManager.add(String cacheName)
    -->
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
</ehcache>

4:打开applicationContext.xml

<!-- shiro 配置信息 yinlixin ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××× begin-->
    <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
        <!--classpath是缓存属性的配置文件  -->  
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />  
    </bean>  
    
    <!-- 自定义Realm -->
    <bean id="monitorRealm" class="com.companyname.publicbase.shiro.MonitorRealm" />
    
    <!-- 安全管理器 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="monitorRealm"></property>
        <!-- <property name="sessionManager" ref="sessionManager"/> -->
                    <!-- 使用下面配置的缓存管理器 -->
        <property name="cacheManager" ref="shiroEhcacheManager" />
    </bean>
    
    <bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- shiro 的核心安全接口 -->
        <property name="securityManager" ref="securityManager" />
        <!-- 要求登录时的链接 -->
        <property name="loginUrl" value="/nologin.jsp" />
        <!-- 登陆成功后要跳转的连接 -->
        <property name="successUrl" value="/deskmain.jsp" />
        <!-- 未授权时要跳转的连接 -->
        <property name="unauthorizedUrl" value="/error.jsp" />


        <!-- shiro 连接约束配置,这一段里面具体的根据自己的项目改 -->
        <property name="filterChainDefinitions">
            <value>
                /login/skipPage.do* = anon <!-- 匿名过滤器 不登陆就可以访问 -->
                /menu/menuInfo.do* = anon <!-- 匿名过滤器 不登陆就可以访问 -->
                <!-- /sysRoleController/findRole.do =anon -->
                /sysUserController/findUser.do = authc,perms[syscode]
                /*.do* = authc <!-- 必须登录才能访问  -->
                /*/*.do* = authc <!-- 必须登录才能访问  -->


            </value>
        </property>
    </bean>
    
    <!-- 后处理Bean 通过代理进行拦截 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />
    <bean
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
    depends-on="lifecycleBeanPostProcessor" >
        <property name="proxyTargetClass" value="true" />
    </bean>
    <bean
        class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>


5:自定义realm域:这里是把前台传入的用户名和密码进行验证,并且读取数据库把该用户的角色和权限添加进去

/**
 * 自定义Realm (提供登陆校验、用户权限)
 *
 * @author seawind
 *
 */
public class MonitorRealm extends AuthorizingRealm {
    @Autowired
    private MapperService mapperService;
    
    /*@Autowired
    private  HttpServletRequest request;*/

    @Override
    // 执行授权 (访问功能判断是否具有权限)
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        System.out.println("执行授权....");
        // 返回对象
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        
        HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
        String username = (String)request.getSession().getAttribute("username");
        
        String stat = "com.companyname.userRoleFunction.bean.SysFunctionMapper.findrolemenu";
        Map<String, String> map = new HashMap<String, String>();
        map.put("username", username);
        List<SysFunction> sysFunctionlist = mapperService.selectAllObject(stat,map);
        for (SysFunction roleOrFunction : sysFunctionlist) {
            authorizationInfo.addRole(roleOrFunction.getRolecode());//添加role的code
            authorizationInfo.addStringPermission(roleOrFunction.getCode());//添加function的code
        }
        return authorizationInfo;
    }

    @Override
    // 执行认证 (登陆)
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        System.out.println("执行认证....");
        // 将用户名传入数据库查询 ,返回密码
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        String stat = "com.companyname.userRoleFunction.bean.SysUserMapper.findPassword";
        Map<String,String> map = new HashMap<String,String>();  
        map.put("username",username);  
        SysUser user = mapperService.selectOneObject(stat, map);
        if (user == null) {
            return null; // 用户名不存在
        } else {
            AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, user.getPassword().toCharArray(), getName());
            return authenticationInfo;
        }
    }
}

自此,一个简单的整合就完成了!!!












1 0
原创粉丝点击