shiro权限管理框架

Apache Shiro是一个强大易用的Java安全框架。它可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存、单点登录等等

从图上我们可以看出Shiro的四大核心功能:

Authentication(身份验证):简称为“登录”,即证明用户是谁。
Authorization(授权):访问控制的过程,即决定是否有权限去访问受保护的资源。
Session Management(会话管理):管理用户特定的会话,即使在非 Web 或 EJB 应用程序。
Cryptography(加密):通过使用加密算法保持数据安全

同样的虚线框框圈着的是Shiro3大核心组件:

Subject :正与系统进行交互的人,或某一个第三方服务。所有 Subject  实例都被绑定到(且这是必须的)一个SecurityManager 上。
SecurityManager:Shiro 架构的心脏,用来协调内部各安全组件,管理内部组件实例,并通过它来提供安全管理的各种服务。当 Shiro 与一个 Subject  进行交互时,实质上是幕后的 SecurityManager  处理所有繁重的 Subject 安全操作。
Realms :本质上是一个特定安全的 DAO。当配置 Shiro  时,必须指定至少一个 Realm  用来进行身份验证和/或授权。Shiro 提供了多种可用的 Realms 来获取安全相关的数据。如关系数据库(JDBC),INI 及属性文件等。可以定义自己 Realm  实现来代表自定义的数据源。

1.加入jar包

整合demo用的是maven对依赖进行管理。我们需要在pom.xml里加上配置:

    <dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.1.32</version>
	</dependency>
		<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-core</artifactId>
		<version>1.2.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-web</artifactId>
		<version>1.2.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-spring</artifactId>
		<version>1.2.2</version>
	</dependency>
	<dependency>
		<groupId>org.apache.shiro</groupId>
		<artifactId>shiro-ehcache</artifactId>
		<version>1.2.2</version>
	</dependency>

里面我加入了阿里的fastjson。我用fastjson替换了jackson(理由:没有什么理由,就是喜欢用了.....)

2.Spring-mvc.xml的配置

这是替换掉jackson的配置

<mvc:annotation-driven>
		<mvc:message-converters>
			<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" />
			<bean class="org.springframework.http.converter.FormHttpMessageConverter" />
			<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" />
			<!--<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />-->
			<bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" />
		</mvc:message-converters>
</mvc:annotation-driven>
	<mvc:default-servlet-handler /> 
	
 
	<!-- 避免IE执行AJAX时,返回JSON出现下载文件 -->
	<!-- 支持JSON数据格式 -->
	<bean
		class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
		<property name="messageConverters">
			<list>
			    <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/><!-- 解析导出文件byte流 --> 
			    <ref bean="fastJsonHttpMessageConverter" />
	<!-- 
				<ref bean="mappingJacksonHttpMessageConverter" />
	 -->
			</list>
		</property>
	</bean>
	<!--<bean id="mappingJacksonHttpMessageConverter"
		class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
	</bean>-->
	<!-- 使用fastJson来支持JSON数据格式 -->
	<bean id="fastJsonHttpMessageConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
                <property name="supportedMediaTypes">
                    <list>
                        <value>text/html;charset=UTF-8</value>
                        <value>application/json</value>
                    </list>
                </property>
                <property name="features">
                    <list>
                        <value>WriteMapNullValue</value>
                        <value>QuoteFieldNames</value>
                    </list>
                </property>
      </bean>

 3.首先先配置Shiro Filter(web.xml)

<!-- 配置  Shiro 的 Filter -->
      <filter>
      <description>shiro 权限拦截</description>
      <filter-name>shiroFilter</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>shiroFilter</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

4.创建Shiro的配置文件spring-shiro(注:这边统一起名为spring-*.xml,然后可以在配置contextConfigLocation时使用通配符了)

1.配置SecurityManager主要配置3个属性cacheManager缓存管理器,realm授权认证组件,sessionModel

 <!-- 配置 Shiro 的 SecurityManager Bean. -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="cacheManager" ref="cacheManager"/> 
             <property name="realm" ref="myRealm"/> 
             <property name="sessionMode" value="native">
             </property>
       </bean>

2.配置缓存管理器cacheManager

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

3.配置授权认证组件realm

 <!-- 配置进行授权和认证的 Realm -->
        <bean id="myRealm" class="com.gray.base.shiro.ShiroDbRealm">
             <property name="userService" ref="userService" />
         </bean>

 4.配置需要授权认证的对象

  <bean id="userService" class="com.gray.user.service.impl.UserServiceImpl" />

 5.启用shiro授权注解拦截方式

<!-- 启用shrio授权注解拦截方式 -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 装配 securityManager -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 配置登陆页面 -->
        <property name="loginUrl" value="/index.jsp"/>
        <!-- 登陆成功后的页面 -->
        <property name="successUrl" value="/jsp/success.jsp"/>
        <span style="white-space:pre">	</span>
        <property name="unauthorizedUrl" value="/jsp/unauthorized.jsp"/>
        <!-- 具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截.  -->
        <property name="filterChainDefinitions">
        <value>
              /index.jsp=anon
              /jsp/success.jsp=anon
              /jsp/fail.jsp=anon
              /jsp/user.jsp = roles[user]
              /jsp/admin.jsp = roles[admin]
              /logout = logout
        </value>
        </property>
        </bean>
        <?xml version="1.0" encoding="UTF-8"?>
        <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
        <!-- 启用shrio授权注解拦截方式 -->
        <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <!-- 装配 securityManager -->
        <property name="securityManager" ref="securityManager"/>
        <!-- 配置登陆页面 -->
        <property name="loginUrl" value="/index.jsp"/>
        <!-- 登陆成功后的页面 -->
        <property name="successUrl" value="/jsp/success.jsp"/>
        <span style="white-space:pre">	</span>
        <property name="unauthorizedUrl" value="/jsp/unauthorized.jsp"/>
        <!-- 具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截.  -->
        <property name="filterChainDefinitions">
        <value>
              /index.jsp=anon
              /jsp/success.jsp=anon
              /jsp/fail.jsp=anon
              /jsp/user.jsp = roles[user]
              /jsp/admin.jsp = roles[admin]
              /logout = logout
        </value>
        </property>
        </bean>
 
        <!-- 配置缓存管理器 -->
        <bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
        <!-- 指定 ehcache 的配置文件 --> 
             <property name="cacheManagerConfigFile" value="classpath:ehcache-shiro.xml"/> 
        </bean>
        <!-- 配置进行授权和认证的 Realm -->
        <bean id="myRealm" class="com.gray.base.shiro.ShiroDbRealm">
             <property name="userService" ref="userService" />
         </bean>
        <bean id="userService" class="com.gray.user.service.impl.UserServiceImpl" />
        <!-- 配置 Shiro 的 SecurityManager Bean. -->
        <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
            <property name="cacheManager" ref="cacheManager"/> 
             <property name="realm" ref="myRealm"/> 
             <property name="sessionMode" value="native">
             </property>
       </bean>
       <!-- 配置 Bean 后置处理器: 会自动的调用和 Spring 整合后各个组件的生命周期方法. -->
        <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
       </beans>

猜你喜欢

转载自blog.csdn.net/qq_34971162/article/details/81326302