任何平台(PaaS)身份验证的安全性的一个重要部分是能够基于用户/应用程序或每身份验证<来限制和/或定义特定应用程序或用户的“权限”或权限/ strong>基础。
现代平台或产品API中的常见权限模型基于“范围”的概念。在我的研究中,GitHub,Facebook,Instagram,Etsy(以及更多)都在其OAuth实施中使用这种权限建模方式。但是,这种“范围”模型似乎只关注外部(即第三方)应用程序如何访问经过身份验证的用户数据。
在内部,权限模型似乎更侧重于基于“角色”的模型(管理员,主持人,用户等)或许多其他自定义实现。
我的问题是:“哪种权限模型最适合现代PaaS,既要限制用户使用某些操作,又要限制第三方应用程序访问用户的数据,以及如何构建一种注重表现的方式?“
我的初步研究使我对内部和外部使用基于范围的权限模型。不幸的是,构建这样一个系统并非易事。我已经看到了创建这种架构的多种方法:
AR友好关系数据库方式:
使用连接表创建多个表,以获取权限列表,用户可用权限,用户令牌和用户令牌的活动权限之间的多对多关系。
用户可以使用令牌进行身份验证,并指定该令牌上可用的权限最多最初为该用户设置的权限
聪明的Bit-masking方式:
使用数据集中的简单整数列来存储整数值
以二进制方式访问整数值,使用按位运算符通过将权限表示为单个位来设置,获取,切换(等)用户或其令牌的权限
他们似乎对每个人都有利有弊。 AR友好的方式似乎是一个非常灵活的解决方案,但似乎它可能是一个严重的性能损失,因为必须运行多个连接/查询,并且必须在每个经过身份验证的情况下创建ORM模型实例调用即可。比特掩码方法看起来非常快速有效,但开发起来不太直观,而且更容易出错。此外,位屏蔽似乎是一个限制性的解决方案,因为它只能轻松地允许一个非常“二进制”的权限模型(可以或不可以),没有中间地板/快乐媒体,并且它会限制权限基于硬件限制的硬64位限制。
是否有其他方法的权限建模或架构我缺少/没有想到?或者我是否在正确的轨道上并且性能考虑并不是那么大的关注(就关系方法而言),因为我正在制定它?
非常感谢你!
哪种权限模型最适合现代PaaS,既要限制用户使用某些操作,又要限制第三方应用程序访问用户的数据,以及如何以性能意识的方式构建?
答案 0 :(得分:1)
我首先来看一下Spring Security ACL。它们使用位掩码,并且可以(相对)轻松地与像ehcache这样的缓存集成。如果您使用JPA进行数据访问,也可以使用JPA的缓存。
http://static.springsource.org/spring-security/site/docs/current/reference/springsecurity.html
架构:
http://static.springsource.org/spring-security/site/docs/3.0.x/reference/appendix-schema.html
的OAuth: