我的成长磨练,每天写博客,年轻人,卷起袖子,来把手弄脏吧! ------ 博客首页

spring集成shiro的配置及其配置的作用

一.依赖的引入

<dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-core</artifactId>
      <version>1.3.2</version>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-web</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-spring</artifactId>
      <version>1.3.2</version>
    </dependency>
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-ehcache</artifactId>
      <version>1.3.2</version>
    </dependency>

二.spring的主配置文件中的配置

1.配置自定义realm,class指的是自定义realm的全限定名;

realm的作用是:接受前端传过来的账号和密码,从数据库或者ini文件中比对并查到相应的权限,是shiro的核心的重要组成部分

   <!--配置自定义realm class 表示realm在·项目中的位置-->
    <bean id="jdbcRealm" class="com.woniu.ssm.realms.ShiroRealm"></bean>

2.配置缓存,需要从shiro缓存包中导入类,property引用resources中的ehcache文件

缓存的作用:realm每次对用户进行认证都会从数据库里将用户及其权限查出来,很浪费性能,引入缓存则如果查询一次会将用户信息存到缓存中,下次查询直接从缓存中拿。

<!-- 配置缓存 -->
    <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <property name="cacheManagerConfigFile" value="classpath:ehcache.xml"/> <!-- 缓存的配置文件 -->
 </bean>

3.配置shiro核心,可以在里面配置各种属性(注意引用的自定义realm要实现父类方法,不然会报错)

shiro核心securityManager的作用:整合realm的认证及授权规则,以及引入其他的功能(缓存等功能)

    <!-- shiro的核心配置 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="cacheManager" ref="cacheManager"/>
        <property name="realm" ref="jdbcRealm"/><!--自定义的realm一定要实现抽象方法,不然一直爆红-->
        <!--<property name="rememberMeManager" ref="rememberMeManager"></property>-->
    </bean>

4.配置shro的生命周期

   <!--生命周期bean  自动调用在spring IOC容器中 shiro bean的生命周期方法 -->
    <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
    <!--操作shiro的注解  必须配置 生命周期bean-->
    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor"/>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/><!-- 引用核心配置-->
    </bean>

5.配置过滤器()

过滤器的作用:拦截页面,通过认证后才能访问。

   <!-- 配置shiroFilterid必须和web.xml文件中 配置的shiro过滤器 名字一致-->
    <bean id="filterChainDefinitionMapBuilder" class="com.woniu.erp.factory.FilterChainDefinitionMapBuilder"></bean><!--1.引入Java中设置权限的类(查询权限的类2)-->
    <bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionMapBuilder" factory-method="filterChainDefinitionMapBuilder"></bean><!--2.引用上一个类和它的方法(封装权限的map集合)-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/><!--引用shiro的核心配置-->
        <property name="loginUrl" value="/jsp/login.jsp"/>
        <property name="successUrl" value="/jsp/mainPage.jsp"/>
        <property name="unauthorizedUrl" value="/jsp/unauthorized.jsp"/>
        <!--需要一个Map集合对象  集合对象需要我们封装数据进来   只能使用工厂bean-->
        <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"></property><!--3.引用设置权限的map集合-->
    </bean>

 

package com.woniu.erp.factory;


import com.woniu.erp.Mapper.ActionMapper;
import com.woniu.erp.VO.AccountRolesVO;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.LinkedHashMap;
import java.util.List;

/**
 * 功能描述:<br>
 * 〈〉
 *
 * @create 2020/7/21
 * @since 1.0.0
 */
public class FilterChainDefinitionMapBuilder {
    @Autowired
    ActionMapper actionMapper;//查询权限的对象


    public LinkedHashMap<String,String> filterChainDefinitionMapBuilder(){
        List<AccountRolesVO> list = actionMapper.findAll();//查询所有的权限
        System.out.println(list);
        LinkedHashMap<String ,String>maps=new LinkedHashMap<>();
        maps.put("/fonts/**","anon");
        maps.put("/css/**","anon");
        maps.put("/js/**","anon");
        maps.put("/jsp/login.jsp","anon");
        maps.put("/account/login","anon");
        maps.put("/errorPage/**","anon");
        for (AccountRolesVO v:list){
//            maps.put(v.getUrl(),"roles["+v.getRole()+"]");
            maps.put(v.getActionParam(),"roles["+v.getRoleName()+"]"); //多个角色加引号
        }
        System.out.println("11111111111111+"+maps);
        maps.put("/jsp/mainPage.jsp","authc");
        maps.put("/account/exit","logout");
//        maps.put("/pagecomponent/**","authc");
        maps.put("/jsp/test.jsp","roles[systemAdmin]");
        return maps;
    }

}

 

 

三.web.xml文件中设置过滤器

 <!--shiro的过滤器-->
  <filter>
    <filter-name>shiroFilter</filter-name><!--通过web.xml找到bean.xml文件中的shiroFilter-->
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
      <param-name>targetFilterLifecycle</param-name>
      <param-value>true</param-value>
    </init-param>
    <!--通过 DelegatingFilterProxy 中targetBeanName的值 到spring容器中,寻找ShiroFilterFactoryBean 的对象 -->
  </filter>

<!--过滤器的映射通过shiroFilter从容器中找到这个类-->
  <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 总结:shiro的配置需要在主配制文件中配置自定义realm,缓存,shiro的核心(需要引入自定义realm0),生命周期,过滤器

web.xml中需要配置 过滤器(名字要与主配置文件过滤器的id相同),过滤器的映射

posted @ 2020-07-21 23:33  Loginout  阅读(480)  评论(0编辑  收藏  举报

web应用开发&研究 - 创建于 2014年8月17日

这是一位web前端开发工程师的个人站,内容主要是网站开发方面的技术文章,大部分来自学习或工作,部分来源于网络,希望对大家有所帮助。

致力于web应用开发&研究工作,专注web前端开发,关注互联网前沿技术与趋势。


Font Awesome | Respond.js | Bootstrap中文网