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相同),过滤器的映射