深入探索Shiro权限框架的体系结构和实际应用
2015-11-14荣艳冬冯建平
荣艳冬 冯建平
摘要:权限管理系统是现代软件项目中必不可少的子系统,用户通常要求权限管理系统是细粒度和松耦合,尽量减少在权限系统开发中花费更多的精力。Java项目中通常会将重复使用的技术封装为框架,然后将框架挂接到实际项目中,从而大幅度提高项目制作效率和代码质量。该文主要讨论Shiro框架在企业中的应用,文章主要从Shiro的体系结构、构建和具体应用三个方面进行了详细的阐述,通过对比阐明了Shiro框架在技术和使用等方面的优势。
关键词:权限;JavaEE;框架;Shiro
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2015)22-0067-02
权限管理是指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。在软件项目中,几乎所有的系统都需要权限管理系统。但是权限管理系统的设计是一件非常复杂的事情,它需要遵从这样几条原则:一是必须保障系统使用的安全,能够覆盖系统所有功能,所以通常要求权限管理系统是细粒度的;二是能够方便快捷的进行系统权限的分配,不受到用户数量和用户使用功能的限制,其中最长采用的是基于角色的访问控制模型(RBAC);三是权限系统和业务相分离,无论从代码层面,还是应用层面,权限系统的开发和使用不受到业务的限制。
1 Java项目权限框架概述
Java项目中除了自己开发权限框架外,经常会使用一些开源的权限框架,或者是在这些开源的框架上进行二次开发,使用权限框架可以大大简化权限系统的开发,能够满足大多数企业项目复杂的需求。常见的框架技术有Spring Security、AcegiSecurity、Kasai、ralasafe和Shiro等,每种框架都具有自己的特点,也存在不能进行细粒度控制、功能简单、无法满足用户的需求和易用性差等缺点。
Shiro是众多框架中表现相对较好的一个,它是由Apache公司的开发的Java权限框架,它是基于RBAC的细粒度框架,从依赖关系来讲,它不依赖任何框架技术,可以独立被使用,也可以和其他框架结合使用;从应用范围来讲,它既可以被应用到Web开发,也可以被应用到客户端开发;从具体应用来讲,它的配置非常简单,易用性很强,本文重点讨论如何使用Shiro构建权限管理系统。
2 使用Shiro构建权限系统
2.1 Shiro框架的体系结构
1)认证(Authentication),它的功能是判断用户身份是否合法,通俗来讲是登录功能,这是权限系统最为基础的功能,Shiro允许用户对认证方法重写,从而根据项目的业务需求实现认证。
2)授权(Authorization),这部分功能是权限系统的核心功能,Shiro是基于RBAC模型进行授权,它最基础的内容是权限点,这也是细粒度控制的体现。通过授权,Shiro框架将预先定义好的权限点和角色分配给用户,用户在认证通过后,Shiro框架会约束用户对于系统访问的权限。
3)会话管理(Session Management),Web项目中通常具备会话管理功能,例如:Java Web中通常使用HttpSession类进行会话管理,Shiro框架构建了专门的会话管理机制,Web项目中的会话可以由它代为管理,即使不具备会话管理功能的客户端项目,Shiro的会话管理功能也可以使用,这使得Shiro用户在会话管理层面无需关心是何种类型的项目,这也是Shiro框架易用性的重要体现。
4)加密(Cryptography),权限系统中数据加密是必不可少的内容,Shiro试图简化加密和解密操作,它引入了CipherService API,让用户只需提供密钥就可以根据需要进行加密和解密。此外,Shiro封装了诸如md5和sha等常用的加密算法,方便用户进行调用。
5)其他功能,除了核心功能外,Shiro还提供了几项非常实用的特征,包括Web支持、缓存功能、多线程并发验证、测试工具等。
2.2 构建权限框架
Shiro框架是RBAC模型,而且是细粒度权限管理,其构建的基础是权限点,角色和用户等权限数据都是基于权限点进行建立。用户可以通过重写AuthorizingRealm类和修改配置文件实现Shiro框架服务于业务系统,以下是具体构建的流程:
1)定义权限数据
权限数据通常与被存储在数据库中,也可以用其他的形式存储。在具体建立时通常需要构建权限点数据、角色数据和用户数据,权限点数据和角色数据是多对多关系,角色数据和用户数据也是多对多关系,权限点数据最为核心的内容是权限字符串,通常形式是“fjqx:zjqx”,冒号前代表父级权限,后面是子集权限,无论是在页面还是在程序代码中,都是通过这个串标识系统功能,这个串对应的权限点被赋予了哪个用户,哪个用户才拥有访问这个系统功能的权限。
2)配置Shiro过滤器
以Web开发为例,Shiro权限框架的基础是过滤器,过滤器根据认证和授权的设定,决定用户访问系统的权限,Shiro提供IniShiroFilter类完成这项工作。由于Shiro提供了对于Spring和Struts等框架的支持,所以针对于不同类型的框架,过滤器配置有一定的差异。
3)继承AuthorizingRealm类
继承AuthroizedingRealm类,重写“doGetAuthorizationInfo”和“doGetAuthenticationInfo”方法是Shiro开发的核心,通过对这两个方法的重写,用户可以根据自己业务的实际情况编写认证和授权功能。例如:用户数据和授权数据如果存储在数据库中,这两个方法中就可以读取数据库,完成认证和授权的编写。
4)URL配置
URL配置可以设定系统URL认证路由情况和访问权限,通过配置“loginURL”、“successURL”、“unauthorizedUrl”等参数决定系统认证入口、认证成功和认证失败的URL流向。通过给系统URL设定”authc”、“anon”、“logout”等值,确定哪些URL需要认证才可以访问,哪些路径可以匿名访问,哪些路径是注销链接。
2.3 Shiro的实际应用
1)用户认证
用户认证和传统的用户登录有一定的差别,首先需要利用Shiro提供的UsernamePasswordToken类和输入的用户名验证信息构建认证令牌,然后使用Subject类的login方法进行令牌的验证,从而判定登录是否成功。
2)授权的应用
授权的应用主要体现在三个方面:一是URL控制;二是页面级元素的控制;三是代码级权限控制。URL通过配置文件决定访问的方式和权限,页面级元素和代码级权限控制主要通过权限字符串,在Web开发,可以通过标签的方式在页面中进行HTML元素的控制,代码级权限可以通过isPermitted(权限字符串)、isRole(角色字符串)等方法进行权限控制。
3 结束语
Shiro权限框架是开源的,它提供了简洁和实用的权限管理功能,它在用户界面、访问路径和代码层面都提供了访问控制,能够做到真正安全的访问控制。Shiro所有的技术都是围绕认证和授权这两个核心,根据系统的需要可以重写认证和授权,这提供给用户更加灵活的权限管理。但是,项目的需求通常会非常复杂,Shiro在具体应用的时候还需要根据项目的实际需求对Shiro源代码进行相应的调整,再结合Shiro的特点完成具体任务。
参考文献:
[1] 黄经赢.基于Shiro框架的细粒度权限控制系统的设计与实现[J].广东技术师范学院学报:自然科学,2013(7):20-23.
[2] 杨运平, 吴智俊.Apache Shiro安全框架在技术转移服务系统中的应用[J].计算机与现代化,2014(3):157-160.
[3] 梁云娟.使用SpringSecurity开发安全的Java程序[J].河南师范大学学报:自然科学版,2012,4(40):148-150.