移动互联网场景下服务端Shiro权限管理研究
2021-02-25赵志学朱方洲
赵志学,朱方洲
(1.安徽省委党校,安徽 合肥 230022;2.安徽经济管理学院,安徽 合肥 230022)
0 引 言
网络信息安全最重要的是保证用户合法地对资源进行访问,防止非法用户访问不属于自己的访问权限,以此来保护信息不受篡改[1]。目前,网络攻击越来越多,利用安全漏洞窃取系统数据、非法入侵系统等安全问题严重影响了各个系统的稳定运行,致使业务无法正常运营,给政府、企业和个人带来很大的损失[2]。为了解决上述问题,访问控制机制和对应的权限管理应运而生。访问控制是从20世纪60年代后期开始研究,其任务主要是根据系统内部提供的安全策略和访问者的身份信息,对请求访问的权限设置限制和规则,旨在防止未经授权的用户访问系统资源[3]。应用比较广泛的主要有自主访问控制(DAC)、强制访问控制(MAC)、基于角色访问控制模型(RBAC)、基于任务访问控制模型(TBAC)和基于属性访问控制模型(ABAC)等[4],其中RBAC近年来研究最为广泛,并以其灵活性与安全性普遍应用于许多系统中。随着互联网+政务服务、企业综合应用系统等移动应用的不断增加,上述授权方式显得繁杂、不灵活、粗糙,在应用上不利于应用系统的扩展和缺乏良好的通用性,为此文章提出了基于Shiro框架的移动互联网场景下服务器认证授权方法。
1 移动互联网服务场景中认证授权
传统的PC应用使用场景客户端往往是Web浏览器,通过浏览器发出访问服务器请求,这种方式需要在服务端保存客户端的session(会话),建立session的本质就是浏览器访问服务器时,从服务器取回一个cookie,该cookie标识了会话,而浏览器下次访问服务器时再次携带该cookie提交给服务器,服务器根据提交的cookie区别不同的客户端浏览器,达到保持不同客户端session的目的,从而维持客户端与服务器的无状态通信。
在移动互联网应用场景中,用户登录App后,可能过很久才有下次操作,又不便要求用户反复登录账号和密码,无session过期要求。移动应用场景要求用户操作便捷,又不降低对安全性的要求,始终要求用户提交账号和密码本身就会带来丢失信息的风险,这就需要使用token的方式来进行标识用户合法身份,客观上减少账号和密码提交服务器的次数。在移动应用场景中大多数都是使用原生App操作方式,而在原生App开发方式中每次使用cookie十分麻烦,技术上采用了放弃使用cookie的方法。
2 Shiro框架的体系结构
现行服务器场景中一般会选择较为成熟的权限管理框架,如Spring Security框架、Apache的Shiro框架。
Spring Security功能强大[5-6],但配置繁琐。Shiro框架相对于Spring Security框架,具有高度的灵活性、开发的易用性、代码的开放性等优势,因此在权限管理和安全认证业务场景中得到了广泛使用。Shiro框架不仅可以应用于Java SE场景中的开发,也可以应用于Java EE场景中的开发。同时Shiro框架与Spring框架也能进行很好的整合,这就给开发者在使用过程中带来极大的便利。
互联网+政务服务系统、企业级应用系统对于权限管理包括两个方面:一是认证,通过认证确认用户账号的合法性,用户提交各类合法的身份信息,服务端对身份信息进行验证,验证通过允许用户登录,验证不通过拒绝用户登录。二是授权,通过授权根据事先划分好的权限资源,用户身份角色,将对应的权限分配给合法登录的用户,这样通过验证的用户就具备访问某某资源的权限。
Shiro框架广泛支持认证和授权等功能模块,且提供足够的API供开发者定制,这就为政务系统、企业级系统的灵活定制提供可能。Shiro框架主要包括核心功能模块、支持功能模板,核心功能模块包含认证、授权、会话管理、加密四个部分;支持功能模板包含“Web集成、缓存、并发、测试、作为、记住我”六个部分[7]。具体功能模板如图1所示。
图1 Shiro框架的基本结构
3 Shiro框架的设计思路
3.1 认证授权过程
Shiro框架是通过一个名称为Subject的主体对象代表用户的,该Subject就是一次发出请求认证的对象,每一次要求认证都是通过Subject对象的Login方法发给SecurityManager。SecurityManager负责所有与安全操作的交互操作,并且实现对Subject的管理,它构成了Subject请求认证和Realm安全数据来源之间嫁接的桥梁。Realm是用户安全数据的来源,但并不维护用户和权限的具体信息表,这也是Shiro框架的强大之处,这就使开发者自己扩展用户权限信息表成为可能。图2为Shiro框架的认证授权时序图。
图2 Shiro框架的认证授权时序
认证授权过程首先是用户提交账号和密码,使用Shiro框架提供的Subject发起Login请求;Login请求发送给SecurityManager对象,SecurityManager根据提前配置的Authenticator对账号信息执行验证;Authenticator对象可以调用自定义的Realm对象执行具体的验证,并且可以通过Realm访问用户安全信息来源;回调Realm对象的doGetAuthenticationInfo()方法,执行具体的安全信息认证;可以在doGetAuthenticationInfo()方法中获取证书匹配器,也就是可以在此实现加密验证;加载一个具体的加密匹配器;当认证通过后,Realm可以加载安全信息数据来实现具体的授权工作,该授权工作在doGetAuthorizationInfo()方法中实现;最后返回认证成功或失败的结果。如果认证成功,将带有成功的消息和带有授权的用户返回。
3.2 鉴权过程
当用户成功登录企业系统后,该用户将拥有相应的角色和权限。在用户访问具体权限资源时,Shiro框架将对该用户的身份权限做进一步验证。Shiro框架提供了Authorizer组件来实现用户的鉴权工作。图3为Shiro框架的鉴权时序图。
图3 Shiro框架的鉴权时序
鉴权过程首先用户访问某具体的权限资源,发起isPermitted()方法的请求,该请求将引起SecurityManager对象方法isPermitted()的调用,Shiro框架会根据具体的配置信息调用对应的Authorizer,并在Authorizer中调用ResolvePermissionRole方法,使用PermissionResolver对象返回该用户的权限集合。继续请求是否具备某权限,根据返回结果true或者false,表示是否具备某权限。最后返回鉴权结果。
4 基于Shiro框架的移动互联网场景下服务器认证授权方法
通过构建基于Shiro框架的移动互联网场景下服务器认证授权方法,移动互联场景中服务器无需保存客户端cookie的信息,只维持客户端与服务器之间的会话状态,有效实现用户身份认证、授权、加密、会话管理等功能,构建了一个通用、便捷的安全认证框架,使用Shiro就可以高效、安全地完成认证、授权等功能,降低系统成本。
图4 基于Shiro框架的移动互联网场景下服务器认证授权方法
4.1 基于HMAC算法的通信方式
密钥相关的哈希运算消息认证码(hash-based message authentication code,HMAC)是基于散列的消息认证码[8-9],该方法身份认证方式简单、安全,且克服了安全证书授权Radius、Kerberos等协议的部署复杂性、开销过大等问题。在用户通过安全认证后,服务端将验证密钥发给用户,当前该密钥将由客户端和服务端共同持有。每当用户发送请求给服务器时,无需再次发送账号和密码,而是发送消息和消息摘要到服务器即可。客户端消息摘要是由共同持有的密钥生成,该消息摘要保证了请求信息的唯一性。服务器端使用共同的密钥对消息进行验证,验证用户身份的合法性。基于HMAC算法的关键代码如下:
public static byte HmacSHAEncrypt(String encryptText,String encryptKey)throws Exception
{ byte data=encryptKey.getBytes(ENCODING);
SecretKey secretKey = new SecretKeySpec(data,MAC_NAME);
Mac mac = Mac.getInstance(MAC_NAME);
mac.init(secretKey);
byte text = encryptText.getBytes(ENCODING);
return mac.doFinal(text);
}
}
4.2 创建无cookie的token
在Shiro框架中token的作用主要是用于传递用户身份信息,在subject的login方法中需要传递token;在认证过程中需要调用token,判断账号和密码的合法性;在授权过程中需要调用token,获取用户的身份信息,据此判断该用户该拥有什么权限。由于用户的请求信息包含了账号和请求信息以及请求信息的摘要。所以该token可以设计为如下方式:
public class MyToken implements AuthenticationToken {
private String username;
private Map
private String msgDigest;
getPrincipal()…//具体省略
getCredentials ()…//具体省略
}
4.3 优化AuthorizingRealm
当在Shiro框架中用户的信息改造成无状态的token时,也需要对AuthorizingRealm进行继承改造,这里实现自定义Realm。在doGetAuthenticationInfo()方法中使用HMAC加密方案对用户发送至服务器的请求信息进行验证,主要验证消息摘要。如果消息摘要验证通过表示该用户使用的密钥为合法密钥,如果验证不通过则表示该密钥失效或者过期,从而保证用户身份的合法性和唯一性。优化AuthorizingRealm关键代码如下:
public AuthorizingRealm(CacheManager cacheManager,CredentialsMatcher credentialsMatcher) {
super();
if (cacheManager != null) {
setCacheManager(cacheManager);
}
if (credentialsMatcher != null) {
setCredentialsMatcher(credentialsMatcher);
}
this.authorizationCachingEnabled = true;
this.permissionResolver = new WildcardPermissionResolver();
int instanceNumber = INSTACE_COUNT.getAndIncrement();
this.authorizationCacheName = getClass().getName() + DEFAULT_AUTHOR_CACHE_SUFFIX;
if (instanceNumber > 0) {
this.authorizationCacheName = this.authorizationCacheName + "." + instanceNumber;
}
}
4.4 引入支持无cookie的Filter
Shiro框架提供了JavaEE中的Filter组件,在Web服务器启动时就能加载Filter,该Filter就是Shiro框架的DelegatingFilterProxy,它相当于一个集中的调度器,所有的请求都将由该Filter来集中调度。Shiro框架也支持开发者自定义Filter来实现对请求的拦截。通常自定义Filter需要继承Shiro框架的AccessControlFilter类,并在Spring配置中加入如下代码:
其中***Filter表示自定义的Filter,通过该配置就加入到过滤器的队列中,当请求到来时将会自动执行该Filter完成对请求的身份验证。另外注意关闭Shiro框架默认的Session。
4.5 测试
以某单位建设智慧政务系统为例,验证和测试基于Shiro框架的移动互联网场景下服务器认证授权方法。该政务系统将基于Shiro框架的移动互联网场景下服务器认证授权方法部署到Tomcat上,然后建立相应的Android或iOS项目,先从服务器端使用账号和密码获取相应的HMAC方案中针对用户的key,然后再从客户端中发送请求信息和消息摘要。测试合法用户的认证结果以及非法用户的认证结果,通过功能对比测试,本文方法比目前常用RBAC在资源实例权限、新增屏蔽权限、分层级ID设定及微架构分库设计方面有明显的优越性,提高了灵活性、简便性、可扩展性及安全性(表1)。
表1 RABC与基于Shiro框架的移动互联网场景下服务器认证授权方法功能对比
5 结 论
使用基于Shiro框架的移动互联网场景下服务器认证授权方法大大降低了权限管理的开发难度,其本身也具备较高的灵活性和开放性,这就为适应移动互联网服务器端场景变化进行框架改造带来可能性。文章主要分析了移动互联网场景中服务端的设计的新要求,客户端场景的变化促使服务器端也要随之变化,这就要求连接服务端时放弃使用cookie。该方法可以有效解决移动互联网这一领域企业级应用系统的权限管理需求,大大降低服务器端持有session资源开销,也充分保障了通信的安全性、简洁性。