Shiro简介

Apache Shiro是Java的一个安全框架,官网为shiro.apache.org,主要场景为控制登陆,判断用户是否有访问某个功能的权限等等。

Shiro的核心功能(入门知识,只介绍前两个)

  • 认证

  • 授权

  • 会话管理

  • 加密

引入jar包和配置web.xml

  • 引入Shiro对应的jar包,下面给出Maven

    <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-all</artifactId>
    <version>1.2.2</version>
    </dependency>
  • 在web.xml中配置spring框架提供的用于整合shiro框架的过滤器

    	<!-- 配置shiro过滤器 -->
    <filter>
    <filter-name>shiroFilter</filter-name> // 需要在spring的配置文件中创建一个bean(shiroFilter)
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

下面我们将要进行Shiro的认证功能和授权功能的实现,代码比较多。

登录方法的实现

Shiro认证的流程

  • Application Code:应用程序代码, 即登录方法(登录方法不是直接查询数据库,而是调用Shiro框架提供的接口来实现)

  • Subject:框架提供的接口,代表当前用户对象

  • SecurityManager:框架提供的接口,代表安全管理器对象

  • Realm:可以开发人员编写(即认证和授权方法)

  1. 我们首先将登录方法按照Shiro指定的方式进行改进

     public String login() {
    // 获取验证码
    String validateCode = (String) ServletActionContext.getRequest().getSession().getAttribute("key");
    // 判断验证码
    if (StringUtils.isNotBlank(checkcode) && checkcode.equals(validateCode)) {
    // 获取getSubject对象,Shiro中代表当前用户对象
    Subject subject = SecurityUtils.getSubject(); // 令牌 传递进去前台接受的账号和密码
    AuthenticationToken token = new UsernamePasswordToken(model.getUsername(),
    MD5Utils.md5(model.getPassword()));// 创建用户名密码令牌对象
    try {
    subject.login(token); // 调用内置的登录方法来实现检验 如果登陆错误就会抛出异常,返回登录页面
    } catch (Exception e) {
    e.printStackTrace();
    return LOGIN;
    }
    User user = (User) subject.getPrincipal(); // 登录成功后可以从subject取得登录对象
    ServletActionContext.getRequest().getSession().setAttribute("loginUser", user);
    return HOME; } else {
    this.addActionError("输入验证码错误");
    return LOGIN;
    } }
  2. 然后编写Realm继承AuthorizingRealm ,即编写具体的认证和授权方法

        public class BOSRealm extends AuthorizingRealm {
    @Autowired
    private IUserDao userDao // 授权方法
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) {
    // 可以在这里将用户所属的权限查询出来,然后遍历赋值给info对象,这样就可以实现了授权
    // 判断访问路径或者方法有没有权限的时候就是根据info中的数据来判断
    info.addStringPermission("staff-list");
    return info;
    }
    // 认证方法(登陆方法)
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {
    System.out.println("认证...");
    UsernamePasswordToken passwordToken = (UsernamePasswordToken) arg0; // 对象转换
    String username = passwordToken.getUsername(); // 获得username
    User user = userDao.findByUsername(username); // 通过username从数据库中获取到User对象
    if (user == null) {
    return null;
    }
    // 内置验证方法 (数据库中获取的对象,对象的密码, this.getName())
    AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), this.getName());
    return authenticationInfo;
    } }
  3. 到上面以后编码工作就完成了,剩下的就是进行配置了,首先将编写的Realm注入到安全管理器,整合的是Spring,所以下面的配置都是在Spring配置文件中。

    <!-- 注册realm -->
    <bean id="bosRealm" class="lyh.bos.realm.BOSRealm"></bean> <!-- 注册安全管理器对象 -->
    <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realm" ref="bosRealm"/>
    </bean>
  4. 配置ShiroFilterFactoryBean,同时还可以配置一下URL拦截规则,注意这里的id要和web.xml<filter-name>shiroFilter</filter-name>相同

    <!-- shiro 配置 -->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- 此处为web.xml配置的拦截器 -->
    <!-- 注入安全管理器对象 -->
    <property name="securityManager" ref="securityManager"/>
    <!-- 注入相关页面访问URL -->
    <property name="loginUrl" value="/login.jsp"/> <!-- 登录页面 -->
    <property name="successUrl" value="/index.jsp"/> <!-- 登录成功的主页 -->
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/> <!-- 权限不足转向的错误页面 -->
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
    <!--注入URL拦截规则, -->
    <!-- anon 都可以访问
    perms["staff-list"] 是否有staff-list权限
    authc 登录才可以访问 -->
    <property name="filterChainDefinitions">
    <value>
    /css/** = anon
    /admin/logout = logout <!-- 注销,访问这个路径,自动注销不需要自己编写方法 -->
    /images/** = anon
    /validatecode.jsp* = anon
    /login.jsp = anon
    /userAction_login.action = anon
    /page_base_staff.action = perms["staff-list"] <!-- 表示page_base_staff.action路径需要有staff-list权限才可访问 -->
    /* = authc
    </value>
    </property>
    </bean>
  5. Shiro还提供了使用注解控制权限的方法,开启方式如下,同时,使用的注解权限还需要配置全局异常,用来捕获当权限不足抛出异常时转向的页面,这里使用的是SpringMVC,开启方式@RequiresPermissions("staff-list")

    	<!-- 开启注解配置权限 -->
    <bean id="defaultAdvisorAutoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
    <!-- 必须使用cglib方式为 Action对象创建代理对象 -->
    <property name="proxyTargetClass" value="true"/>
    </bean> <!-- 配置shiro框架提供的切面类,用于创建代理对象 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>
    // 配置全局异常处理器
    <!-- 需要进行权限控制的页面访问 -->
    <global-results>
    <result name="login">/login.jsp</result>
    <result name="unauthorized">/unauthorized.jsp</result>
    </global-results> <!-- 全局异常处理 -->
    <global-exception-mappings>
    <exception-mapping result="unauthorized" exception="org.apache.shiro.authz.UnauthorizedException"></exception-mapping>
    </global-exception-mappings>

Shiro提供的控制权限的方式

  • URL权限拦截控制

  • 方法注解权限控制

  • 页面标签权限控制(当有对应的权限就显示对应的页面元素,没有权限则不显示), 需要在对应的页面引入Shiro的标签库

    <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>,可以用在HTMl也可以用在JS中。

  • 代码级别权限控制(在方法内添加代码)

Shiro整合ehcache缓存权限数据

如果访问一个页面就执行一次授权,就会访问数据库,浪费资源,所以我们可以使用ehcache来进行缓存权限,只要登录时进行一次授权,后面无需再次授权,直接使用缓存。

shiro自动整合ehcache,只需要简单配置就能使用。

  • 在根目录下建立ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="600"
timeToLiveSeconds="600"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/> <!--
内存中最多可以存储多少个数据
是否永久有效
空闲时间
存活时间
内存空间不够是否存储到磁盘
磁盘最大存储个数
服务器重启,磁盘数据是否需要
线程
淘汰策略(最近最少使用)
-->
</ehcache>
  • 在spring配置文件中配置缓存管理器对象,并注入给安全管理器对象
        <!-- 注册ehcache -->
<bean id="cacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">
<property name="cacheManagerConfigFile" value="classpath:ehcache.xml" />
</bean>
  • 将ehcache注入到shiro的配置管理器,shiro会自动使用缓存管理,在原来的管理器中添加<property name="cacheManager" ref="cacheManager"/> 一条语句即可。
        <!-- 注册安全管理器对象 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="bosRealm"/>
<!-- 将ehcache注入shiro -->
<property name="cacheManager" ref="cacheManager"/>
</bean>

安全框架Shiro入门的更多相关文章

  1. 权限控制框架---shiro入门

    1.shiro控制权限的两种思想:粗粒度url级别,细粒度方法级别 2.shiro执行流程简介 3.案例 3.1shiro控制用户登录实现,登录其实就是shiro中的认证. (1)配置web.xml( ...

  2. 用户认证授权和Shiro入门

    1.权限管理基础(认证和授权): 前言 本文主要讲解的知识点有以下: 权限管理的基础知识 模型 粗粒度和细粒度的概念 回顾URL拦截的实现 Shiro的介绍与简单入门 一.Shiro基础知识 在学习S ...

  3. 转:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

    原文地址:JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法.shiro认证与shiro授权 以下是部分内容,具体见原文. shiro介绍 什么是shiro shiro是Apache ...

  4. Shiro入门学习与实战(一)

    一.概述 1.Shiro是什么? Apache Shiro是java 的一个安全框架,主要提供:认证.授权.加密.会话管理.与Web集成.缓存等功能,其不依赖于Spring即可使用: Spring S ...

  5. Springmvc整合tiles框架简单入门示例(maven)

    Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...

  6. 安全框架Shiro

    原文地址:https://www.cnblogs.com/learnhow/p/5694876.html 一.架构 要学习如何使用Shiro必须先从它的架构谈起,作为一款安全框架Shiro的设计相当精 ...

  7. Apache shiro集群实现 (一) shiro入门介绍

    近期在ITOO项目中研究使用Apache shiro集群中要解决的两个问题,一个是Session的共享问题,一个是授权信息的cache共享问题,官网上给的例子是Ehcache的实现,在配置说明上不算很 ...

  8. OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据

    OkHttp框架从入门到放弃,解析图片使用Picasso裁剪,二次封装OkHttpUtils,Post提交表单数据 我们这片博文就来聊聊这个反响很不错的OkHttp了,标题是我恶搞的,本篇将着重详细的 ...

  9. Java安全(权限)框架 - Shiro 功能讲解 架构分析

    Java安全(权限)框架 - Shiro 功能讲解 架构分析 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 简述Shiro Shiro出自公司Apache(阿帕奇),是java的一 ...

随机推荐

  1. uva12519

    The Farnsworth Parabox Professor Farnsworth, a renowned scientist that lives in year 3000 working at ...

  2. Uva 3708 Graveyard

    题意:在周长为10000的圆上等距分布着n个雕塑.现在又有m个新雕塑加入(位置可以随意放),希望所有n+m个雕塑在圆周上均匀分布. 这就需要移动其中一些原有的雕塑.要求n个雕塑移动的距离最小. (2& ...

  3. 写一个ORM框架的第一步

    新一次的内部提升开始了,如果您想写一个框架从Apache Commons DbUtils开始学习是一种不错的选择,我们先学习应用这个小“框架”再把源代码理解,然后写一个属于自己的ORM框架不是梦. 一 ...

  4. Echarts数据可视化全解注释

    全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...

  5. Java 对象复制

    Java 对象的一共有 3 种复制对象的方式. 1.直接赋值 (引用复制 ),此种复制方式比较常用. 诸如 A  a = b ;  a 是直接复制了b的引用 ,也就是说它俩指向的是同一个对象. 此时 ...

  6. dig 命令使用

    1.简单查询 # dig www.guoxh.cn 2.按记录类型查询,默认为A记录 # dig www.guoxh.cn cname # dig www.guoxh.cn mx # dig www. ...

  7. 使用Gradle构建Android项目

    阅读目录 Gradle是什么? 环境需求 Gradle基本结构 任务task的执行 基本的构建定制 目录配置 签名配置 代码混淆设置 依赖配置 输出不同配置的应用 生成多个渠道包(以Umeng为例) ...

  8. 前端工程化grunt

    1.grunt是什么? grunt是基于nodejs的前端构建工具.grunt用于解决前端开发的工程问题. 2.安装nodejs Grunt和所有grunt插件都是基于nodejs来运行的. 安装了n ...

  9. HTML5之appcache语法理解/HTML5应用程序缓存/manifest缓存文件官方用法翻译

    习惯性的贴几个参考链接: W3School-HTML 5 应用程序缓存 官方 MDN window.applicationCache 接口文档 官方 MDN 用法示例 看所有的教程不如直接看最原始的官 ...

  10. UVa127,"Accordian" Patience

    注意1堆的时候,pile后面没有s!!!!因为这个WA了一次,否则就1A了 犯了一个很幼稚很幼稚的错误,申请ans[]后玩了吧ans置0,结果调了好长好长时间,本来是敲完就能过的T T啊啊啊啊啊啊,一 ...