Shiro在集团统一账号权限管理系统中的应用20160121_第1页
Shiro在集团统一账号权限管理系统中的应用20160121_第2页
Shiro在集团统一账号权限管理系统中的应用20160121_第3页
Shiro在集团统一账号权限管理系统中的应用20160121_第4页
Shiro在集团统一账号权限管理系统中的应用20160121_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

集团统一账号权限管理系统Shiro的应用中科软科技股份有限公司2016年1月目录TOC\o"1-4"\h\z\u第1章 SHIRO简介 31.1 SHIRO是什么 31.2 SHIRO框架结构 51.2.1 外部使用结构 51.2.2 内部调用结构 6第2章 单点登录 72.1 概述 72.2 REALM的配置 72.2.1 定义实体与关系 72.2.2 定义REALM 82.3 单点登录机制 8第3章 身份验证 93.1 概述 93.2 身份验证机制 9第4章 授权 104.1 概述 104.2 授权机制 10第5章 加密 115.1 概述 115.2 加密与密码验证机制 11第6章 会话管理 126.1 概述 126.2 会话管理机制 126.3 会话监听机制 136.4 会话存储机制 13第7章 缓存管理 13第8章 授予身份及切换身份 13第9章 总结 14摘要在当今经济形势的驱动下,保险行业有着快速、深度、长远的发展,因保险公司内部寿险、财险、车险等部门急速壮大,分别成立子公司,保险公司集团化随之而产生。鉴于保险行业的变化,保险软件系统大而全的应用部署,按照模块、层次、序列等方式划分为独立的专项应用系统。对于繁多的应用系统,集团统一的账号权限管理系统孕育而生。本文主要就太天平洋保险公司,从业务的实际现状、系统核心设计、系统核心功能以及功能优缺点等方面阐述Shiro在集团统一账号权限系统中的应用。账号权限系统主要应用Shiro的特性,使账号权限统一管理,带来的优质体验;:对各个系统的权限监管;方便客户权限的申请,以及各个权限系统的切换;高效的管理账号权限,以避免多次重复的账户权限维护;良好的保险系统群扩展结构等。关键字:Shiro,低耦合SHIRO简介SHIRO是什么ApacheShiro是Java的一个强大而灵活的开源安全框架,能够非常清晰、简单的处理身份验证、授权、管理会话、密码加密等常见的Subject(主体)所面临的问题。Shiro不依赖与环境,JavaSE可以,JavaEE也可以,非常容易的开发出足够好的应用。ApacheShiro是的致力于易于使用和理解。安全对于一般开发者而言,是很复杂的,甚至是痛苦的。但在使用Shiro过程中,没必要这样。Shiro框架会将复杂的地方掩盖,给开发者一个干净而直观的API,来简化开发人员对安全问题的解决办法。ApacheShiro基本功能点如下图所示:Authentication:身份验证/登录,验证用户他是谁;Authorization:授权,即权限验证,验证已认证的用户是否拥有某个权限;SessionManager:会话管理,即Session,用户登录后就是一次会话,在没有退出之前或限定时间内,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的;Cryptography:加密,数据的安全性的管理;WebSupport:Web支持,可以非常容易的集成到Web环境;Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限等信息进行缓存管理,不必每次访问数据库去查,这样以实现提高效率的目的;Concurrency:Shiro支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;Testing:提供测试支持;RunAs:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;RememberMe:记住我,非常常见使用的功能。Shiro视图在所有应用程序环境下实现以下目标:从最简单的命令应用程序到最大的企业应用,不强制依赖其他第三方框架、,容器,或应用服务器。项目的最终目标是整合到这些环境中,尽可能地将其自身的功能更加强大、便捷!SHIRO框架结构外部使用结构从Shiro框架外部来看,其结构如下图所示:应用代码直接交互的对象是Subject,也就是说Shiro的对外的API核心就是Subject,其每个API的含义:Subject:主体,代表当前“用户”,这个用户不一定是具体的人,与当前应用交互的任何东西都是Subject。所有Subject都绑定到SecurityManager,与Subject的所有交互都会委托给SecurityManager;可以把Subject认为是一个门面;SecurityManager才是实际的执行者;SecurityManager:安全管理器,即所有由安全有关的操作都会与SecurityManager交互,且它管理着所有的Subject。它是Shiro的核心,它负责与后边介绍的其他组件进行交互。Realm:Shiro从Realm获取安全数据(如用户、角色、权限)。可以把Realm看成DataSource,即安全数据源。也就是说,最简单的一个Shiro应用:1.应用代码通过Subject来进行认证和授权,而Subject又委托给SecurityManager;2.需要给SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断。内部调用结构从Shiro框架内部接口、对象跳转来看,其结构如下图所示:Subject:主体,可以看到主体可以是任何可以与应用交互的“用户”;SecurityManager:Shiro的核心,所有具体的交互都通过SecurityManager进行控制;它管理着所有Subject、且负责进行认证和授权、及会话、缓存等任务的管理;Authenticator:认证器,负责主体认证的,这是一个扩展点,用户可进行自定义用户验证的实现方式。其需要认证策略(AuthenticationStrategy),即什么情况下算用户认证通过;Authrizer:授权器,或者访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的那些功能。这也是一个扩展点;Realm:可以有1个或多个Realm,可以认为是安全实体数据源,即用于获取安全实体的。可以是JDBC实现,也可以是LDAP实现等等。由用户提供。因数据格式的不同,所有在应用中都需要实现自己的Realm;SessionManager:Shiro抽象了一个自己的Session来管理主体与应用之间交互的数据,因此Shiro可以不依赖环境进行Session的管理;SessionDAO:数据访问对象,用于会话的CRUD,比如想把Session保存到数据库,那么可以实现自己的SessionDAO,通过JDBC写入到数据库;另外SessionDAO中可以使用Cache进行缓存,以提高性能;CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;这些数据基本很少改变,放到缓存中后可以提高访问的性能;Cryprography:密码模块,Shiro提供了一些常见的加密组件,用于密码加密/解密。单点登录概述太平洋保险公司(以下简称“太保”)在对系统集成管理过程中,由统一账号权限管理系统来实现单点登录,很好的解决了如下方面的问题:账号权限管理集中统一化;账号开通、注销、权限变更信息化,提高工作效率;账号情况日常监控与定期审阅,流程、权限合规;避免账号或权限不当导致的风险。REALM的配置定义实体与关系用户、角色、权限是目前多数系统共有的元素,用户-角色之间是多对多关系,角色-权限之间是多对多关系;且用户和权限之间通过角色建立关系。在太保账户权限系统中,创建用户,以及用户与角色之间的关系(授权);接入系统创建角色、权限、以及角色与权限之间的关系。此设计的优点如下:权限的多样性得以实现。接入系统可以按照自身系统的设计模式,将权限应该对应到资源(如菜单、URL、页面按钮、Java方法等)中,具体的资源形式只与自身系统相关,与账号权限系统无关,进行最大化的解耦;角色即为权限的集合,当权限对应的资源验收完成后上线时,权限所属的角色已经确定,相应的权限与相应的角色建立关系(属于业务需求开发内容)。权限与角色的关系有着业务性较强、规则较为复杂等特点,放入接入系统实现,得以术业有专攻;用户管理、授权管理得以统一有效的管理。所有的接入系统都有着无差别的用户群体,账号权限系统的用户、授权管理,一方面体现其统一性:使每个系统账号统一,利于监管;另一方面体现其高效性:此前的多个系统账号维护,只需在当前一个系统维护,例如入职、离职等。定义REALMRealm,Shiro从Realm获取安全数据源(如用户、角色、权限),就是说SecurityManager的验证用户身份、用户授权、SessionManager等均需要通过Realm来实现数据持久化。对于当前的太保账号权限管理系统,只有一个数据源,一个Realm就可以支持,但考虑系统的扩展型,还是按照多Realm结构进行定义。根据功能不同,Realm的接口实现与继承关系如下图:其实现类含义内容:AuthorizingRealm:授权AuthenticatingRealm:身份验证CachingRealm:带有缓存实现单点登录机制账号权限系统基于单点登录,设计模式如下:公司员工均使用员工工号作为账号。用户信息(表LDUser)还包含证件、联系方式、部门、职位等信息,将接入系统需要用户的所有信息纳入用户信息中;用户的创建、修改、删除等权限,只分配给账号权限系统的账户维护员,账号权限系统在对用户创建、修改、删除时,通过Webservices接口将动作指令分发给接入系统,使用户状态保持一致;接入系统创建角色时,通过Webservices接口将角色写入账号权限系统;账号权限系统在对用户授权后,将用户与角色关系一并分发给接入系统;账号权限系统作为接入系统的唯一入口,系统对用户每次登陆、退出、登陆差错等轨迹进行记录,作为日常监控、日常审阅、合规核查的备案;用户通过账号权限系统验证后,可以访问已分配角色的所有接入系统,无需再次进行身份验证;用户进入接入系统后,在其中实现该用户角色权限集合,即角色到权限的实现由各个系统完成,以方便实现每个系统的灵活性。身份验证概述身份验证,即在应用中他是谁,系统中是否分配唯一ID。一般提供如身份ID和标示信息来表明名他的身份。如提供用户名、密码等信息。在Shiro中,用户需要提供principals(身份)和credentials(证明)给Shiro,从而应用能验证用户身份。Principals:身份,即主体的标识属性,可以是任何东西(具有唯一性),如员工工号、邮箱等。一个主体可以有多个Principals,但只有一个PrimaryPrincipals,一般是用户名/员工工号/邮箱/手机号。Credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。最常见的principals和credentials组合就是用户名/密码了。太保以员工工号作为用户名。身份验证机制账号权限系统的身份验证机制如下:前台页面对录入的账号、密码有效性进行初步判断,例如非空、非法字符、过长等,以及对验证码的校验;获取前台信息,创建UsernamePasswordToken对象,由Subject调用login(token),其会自动委托给SecurityManager。在此之前必须通过SecurityUtils设置SecurityManager;SecurityManager负责真正的身份验证逻辑,他委托给认证器Authenticator进行身份验证;Authenticator使用ModularRealmAuthenticator调用AuthenticavtionStrategy进行多Realm身份验证。详情请参照2.2Realm配置;Realm身份验证时,对于验证不通过的用户,按照用户分类返回异常信息:内网用户(公司员工),精确地返回用户名错误,或密码错误外网用户(代理机构、被保险人等),为防止外网用户恶意访问,返回异常信息均为用户名或密码错误。验证通过则返回一个Authenticator实例。授权概述授权,也叫访问机制,即在应用中控制谁能访问那些资源(如访问菜单/数据操作等)。在授权中的几个关键对象:主体,即访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源。资源,在应用中用户可以访问的任何东西,比如JSP页面、数据操作、某个业务夜晚方法等。用户只有授权后才能访问。权限,安全策略中的原子授权单位,通过权限我们可以表示在应用中,用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源。如:核保权限对应的新单核保。角色,代表了权限集合,一般情况下会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便。例如:契约权限组、理赔权限组等。授权机制账号权限系统的授权机制如下:只针对已身份验证通过的主体,才进行授权;当点击接入系统连接时,系统首先调用Subject.hasRole*接口,其会委托给SecurityManager,而SecurityManager接着会委托给Authorizer;Authorizer是真正的授权者,其先会调用Realm的实现类,获取Subject相应的接入系统角色,Authorizer判断是否包含此系统,如果匹配到,进入该系统应用,否则提示授权失败。加密概述在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。系统中对用户添加加密算法属性,密码加密算法有多种,就太保账号权限系统而言,大体分为两类:可逆:针对公司内部应用系统,因密码安全性要求不是很高,可能会选择可逆算法,使用中科软框架中的LisIDEA算法,不在赘累述。不可逆:密码加密后不可逆,当存在外部用户时使用。加密步骤如下:创建一个DefaultHashService,指定使用MD5算法;通过privateSalt将证件号设置为私盐,生成一个随机数,作为公盐,将两张合并产生一个新盐;构建一个HashRequest,传入算法、密码明文、私盐+公盐、迭代次数(2次)。即可产生出密文。加密与密码验证机制加密与密码验证核心算法一致,现将密码验证机制进行阐述,如下:获取用户的加密属性、私盐、公盐、密码密文、以及2个小时内密码重试次数和当天密码重试次数;如果2个小时内密码重试超过5次,则抛出ExcessiveAttemptsException异常,提示2个小时后再次重试。如果当天密码重试次数超过10次,锁定用户,则抛出LockedAccountException异常。根据加密属性,判断使用的加密算法,将token.getCredentials()进行加密;将密码密文与加密后的credential进行对比匹配,如果不匹配,则抛出IncorrectCredentialsException异常。如果匹配,则更新重试次数为0。会话管理概述所谓会话,即用户访问应用时,保持的连接关系,在多次交互中,应用能够识别出当前访问的用户是谁,且可以在多次交互中保持一些数据。如访问一些网站时登录成功后,网站可以记住用户,且在退出之前都可以识别当前用户是谁。会话管理器管理着应用中所有Subject的会话的创建、维护、删除、失效、验证等工作。是Shiro的核心组件,顶层组件SecurityManager直接继承了SessionManager,且提供了SessionsSecurityManager实现直接把会话管理委托给相应的SessionManager,DefaultSecurityManager及DefaultWebSecurityManager默认SecurityManager都继承了SessionsSecurityManager。会话管理机制太保的账户权限管理系统,作为一个单点登录的框架,其会话管理生命周期会跨越应用系统。通过以下几点阐述会话管理:用户身份验证成功后,查询是否存在有有效Session存在,如果不存在,通过SessionFactory创建Session;如果存在,则抛出KickOutException异常;当接入系统通过WebServices接口返回至账号权限系统时,获取Session,同时更新Session;当接入系统退出或关闭时,通过WebServices接口将Session删除;账号权限系统退出或关闭时,将Session删除。会话监听机制会话监听器用于监听会话创建、过期及停止事件:登录、退出或关闭、系统跳转时,监听器进行相应的处理和判断;监听器每次先去缓存中获取Session,如果没有,再到持久层中获取;会话存储机制考虑到系统灵活性及稳定性,对会话进行CRUD,实现模式如下:AbstractSessionDAO提供了SessionDAO的基础实现,如生成会话ID等;MemorySessionDAO直接在内存中进行会话维护,包括创建、更新、删除、获取等。缓存管理缓存机制,是为了系统更高效的工作。账号权限系统提供了CacheManagerAware接口的实现,提供了缓存的一些基础实现;另外AuthenticatingRealm及A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论