SpringMVC整合Shiro权限框架

来源:互联网 发布:网络摄像头服务器搭建 编辑:程序博客网 时间:2024/05/18 03:24

最近在学习Shiro,首先非常感谢开涛大神的《跟我学Shiro》系列,在我学习的过程中发挥了很大的指导作用。学习一个新的东西首先就是做一个demo,多看不如多敲,只有在实践中才能发现自己的欠缺,下面记录下来我整合shiro的过程。如果有不足之处,还望各位看官多多指出。

一、基本名词解释

Apache Shiro是一个强大易用的Java安全框架。它可以帮助我们完成:认证、授权、加密、会话管理、与Web集成、缓存、单点登录等等,而且它的API也十分简洁易用,所以现在有很多人都在使用它。它的基本能功能点如图所示:

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

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

我们同时也可以看看Shiro的架构长什么样子:


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

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

以上是些基本的名称解释。如需要查看更详细的请参考开涛大神的博客。



1 首先先配置Shiro Filter(web.xml)  :这个filter就好放在越前面越好

<filter>       <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>/*</url-pattern>    </filter-mapping>

2 创建Shiro的配置文件

<?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.2.xsd">   <description>Spring-Shiro</description>   <!-- 启用shrio授权注解拦截方式 -->   <bean id="shiroSecurityFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">      <property name="securityManager" ref="securityManager" /><!-- 装配 securityManager -->      <property name="loginUrl" value="/member/toLogin.html" /><!-- 配置登陆页面 -->      <!-- <property name="successUrl" value="/page/islogin.jsp" /> --><!-- 登陆成功后的一面 -->      <property name="unauthorizedUrl" value="/WEB-INF/page/errorpage/401.jsp" /><!-- 用户访问未对其授权的资源时,所显示的连接 -->      <property name="filters"><!--自定义使用shiroFilter进行拦截-->         <map>            <entry key="users" value-ref="usersFilter" />         </map>      </property>      <property name="filterChainDefinitions"><!-- 具体配置需要拦截哪些 URL, 以及访问对应的 URL 时使用 Shiro 的什么 Filter 进行拦截.  -->         <value>            /** = users         </value>      </property>   </bean>   <!--上面所说的访问对应的URL时使用的Shiro的什么Filter进行拦截-->   <bean id="usersFilter" class="com.cargo.security.UsersFilter"></bean>   <!-- 配置 Shiro 的 SecurityManager Bean. 是Shiro架构的心脏 -->   <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">      <property name="realm" ref="shiroRealm" />   </bean>   <!-- 配置进行授权和认证的 Realm -->   <bean id="shiroRealm" class="com.cargo.security.ShiroRealm" />   <!-- SecurityUtils.setSecurityManager(securityManager) :指定Shiro的架构心脏 初始化配置-->   <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 后置处理器: 会自动的调用和 Spring 整合后各个组件的生命周期方法.-->   <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /></beans>

3 然后就是写 Controller等


.............................


4 实现自定义Realm

shiro从Realm获取安全数据,也就是说SecurityManager要验证身份,它需要从Realm获取相应的用户进行比较以确定用户的身份是否合法;我们可以把Realm看作是DataSource,安全数据源。实现自定义Realm主要是继承AuthrizingRealm这个父类,重写doGetAuthrizationInfo和doGetAuthenticationInfo这两个方法,其中doGetAuthenticationInfo是用来验证用户合法性的,根据输入的用户信息从数据库中查出用户,根据用户情况抛出不同的异常doGetAuthrizationInfo是对当前用的用户进行授权的




总结: 整体流程如下 :


登陆 -----> 自定义的路径拦截器(假设有) ------> Security(Subject.login()) ------> 自定义Realm 认证方法 doGetAuthenticationInfo 

---> 自定义Realm 授权方法 doGetAuthorizationInfo -----> 登陆成功-->加载页面



注意:  

1 : 

  自定义Realm 授权方法 doGetAuthorizationInfo 的执行 是根据 页面设置的 shiro权限标签调动遍历获取的 

   (换句话说就好像是项目主页面上的模块, 用户是否有权限显示,是页面模块名包裹的shiro标签遍历请求后台shiro的realm的 doGetAuthorizationInfo方法来判断用户是否有权限显示)


2: 自定义Realm认证方法doGetAuthenticationInfo 的介绍

1 将前台穿过来的token 传入AuthenticatingRealm的getAuthenticationInfo方法中作为一个参数->token*  2 将前台传过来的token 在这个方法中进行解密 然后再传入 AuthenticatingRealm的getAuthenticationInfo方法中作为一个参数->info*  3 在AuthenticatingRealm的getAuthenticationInfo方法中 进行 前台两个参数 token 和 info 的匹配  匹配成功返回 info  匹配不成功 返回 异常





原创粉丝点击