Java Web应用程序身份验证 - 帐户设计

4
我正在开发一个Web项目,后端是Java和Mysql,客户端包括Web(HTML5)和应用程序(IOS / Android)。我在设计系统账户时有一些疑问。
有3种不同类型的账户:
1. 商家,商家账户将拥有自己的网站。 2. 客户,客户通过应用程序(IOS / Android)访问商店/商品。 3. 管理员,管理系统的所有内容。
我的基本认证想法:
肯定会有帐户/角色/权限表,因为管理员和客户都会有相当复杂的用户权限问题,由于历史行为,客户也具有不同的权限。
我已经决定使用Apache Shiro,因为它简单易懂且具有分布式会话。
我的问题是:
1. 我应该创建单个帐户表还是3个单独的帐户表? 2. 对于3个表的设计,有什么建议:帐户/角色/权限?

请提供关于您已经决定使用的后端技术/框架堆栈的更多细节。 - Grygoriy Gonchar
5个回答

4
我建议您考虑将所有用户管理需求委托给 Stormpath。使用Stormpaht,您无需担心这些低级问题,所有数据都得到安全管理和存储。Stormpath提供:
  • 具有不同SDK的用户管理API:node.js、express、java、rest、python、flask。
  • 现成的托管登录:登录、注册和密码重置。
  • 现成的ID站点,用于跨应用程序实现单一登录
  • 为您的用户提供API密钥,使用HTTP基本身份验证或OAuth2进行保护
  • 社交登录:Facebook、Google、LinkedIn、Github
  • 与Shiro和Spring Security集成
  • 与Active Directory和LDAP集成

使用Stormpath,您只需要创建Groups,它们将表示您的roles。在您的组和帐户中,您还可以使用我们灵活的Custom Data概念创建更细粒度的概念,例如permissions

如上所述,我们也支持与Shiro集成,您可以使用Shiro对所有安全需求进行建模,同时使用Stormpath作为身份验证和授权数据提供者。请查看我们的Stormpath Shiro插件和我们的Sample Shiro Web App
免责声明,我是一名活跃的Stormpath贡献者。

4
如果你的第一个问题是如何为三个非常不同的实体设计数据库模式(管理用户、客户用户和店主),我建议你不要将它们合并到单个表中,因为它们是不同的概念,很可能具有不同的特点。你已经回答了自己的问题,因为“编程的便利性”很少能胜过业务规则/逻辑。
选择使用现有的安全框架,还是自己开发一个框架,应该独立于核心业务实体的数据模型。
如果你不想使用像Stormpath这样的托管解决方案,并且还没有确定是否使用Shiro,请查看OACC,这是一个支持Java的开源基于权限的安全框架,支持分层安全域、超级用户、权限继承和身份伪装。
它可能非常适合你的项目,因为:
- 你不需要在数据库设计中添加授权相关方面; - OACC是为多租户应用程序架构(如你项目中的“商店”)而设计的; - 它允许伪装,如果你需要支持客户服务代表而不给他们“管理员”权限,则这是一个强大的功能。

[免责声明:我是OACC的维护者和共同开发者]


我更喜欢使用shiro,主要是因为它具有分布式会话的功能。你关于使用3个表的建议对我很有帮助。 - Eric

3
简而言之:你不需要角色/权限表 :)
首先,我会决定你是否真的需要RBAC安全模型?你的应用看起来非常适合采用分离的六边形架构,拥有3个独立的前端部分:消费者、商店、管理员。然后,我建议为每个前端构建单独的身份验证/授权机制。在这种情况下,你可以灵活选择最适合目的的工具(OAuth2、OpenID、LDAP等),并遵循最小公共机制安全原则。你的应用程序看起来不需要对方法进行授权,因此你不需要RBAC。

我决定先开发逻辑部分,稍后再开发权限部分。 - Eric

2
我会根据每个Java对象的个体需求进行设计。明确你需要创建什么。账户类型之间是否有重叠?一个“商店”账户是否能够像(即扩展)“顾客”一样购买某些东西,或者“管理员”是否应该同时实现“商店”和“顾客”?如果一个住在与“商店”位于同一条街上的“顾客”的地址被更改,那么这个“商店”是否应该报告该街道已更名?电话号码的区号是否取决于城市?
如果您的Java对象能够正常工作,请考虑在第二步中考虑O/R映射。可能会与您现在想象的非常不同(仅需考虑电话号码中需要内联替换的运营商代码, Packstation自动售货亭, 具有多个联系人的商店不同国家的不同地址布局……)。
总的来说,请确保您的地址字段适当支持UTF-8以支持重音、希腊语、西里尔字母或阿拉伯语地址。

1

(1) 我应该创建一个单一的账户表还是三个独立的账户表。

是的,我认为你应该设计一个单一的账户表,因为所有三种类型的账户都会有相似的数据。

(2) 对于三个表的设计有什么建议:账户/角色/权限?

账户:PK账户ID int、FK角色ID int

角色:PK角色ID int、账户权限enum(admin [0],customer [1])

你不需要一个权限表,在你的应用程序代码中可以使用组合设计模式来处理权限级别,其中可以具有多个分层的管理员或客户权限。这样做的原因是最好在模型代码中声明业务逻辑,而不是在数据库设计中声明,数据库的作用是以尽可能优化和规范化的状态保存数据。我想你可以根据客户行为将依赖注入到复合权限层次结构中,这些行为需要在数据库中的一个名为customer_behaviour的表下进行保留,并且某些列被“勾选”,因为它们表现出某些方式。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接