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

Java web应用程序身份验证-帐户设计,java,authentication,spring-security,authorization,shiro,Java,Authentication,Spring Security,Authorization,Shiro,我正在从事一个web项目,后端是Java&Mysql,客户端包括web(html5)和app(IOS/Android),我对系统的帐户设计有一些疑问 有3种不同类型的账户: 商店,商店帐户将有自己的网站 客户,客户通过应用程序(IOS/Android)访问商店/商品 管理,管理系统的所有内容 我的身份验证基本理念: 肯定会有帐户/角色/权限表,因为管理员和客户都会有非常复杂的用户权限问题,客户也会因其历史行为而拥有不同的权限 由于ApacheShiro的简单性和分布式会话,我决定使用它 我的

我正在从事一个web项目,后端是
Java
&
Mysql
,客户端包括
web(html5)
app(IOS/Android)
,我对系统的帐户设计有一些疑问

有3种不同类型的账户:

  • 商店,商店帐户将有自己的网站
  • 客户,客户通过应用程序(IOS/Android)访问商店/商品
  • 管理,管理系统的所有内容
我的身份验证基本理念:

肯定会有
帐户
/
角色
/
权限
表,因为管理员和客户都会有非常复杂的用户权限问题,客户也会因其历史行为而拥有不同的权限

由于ApacheShiro的简单性和分布式会话,我决定使用它

我的问题是:

(1)我应该创建一个科目表还是三个单独的科目表

(2)关于3张表的设计有何建议:
<代码>帐户<代码> />代码>角色< /代码> />代码>权限< /代码>

< p>我建议您考虑将您的所有用户管理需求委托给。使用Stormpaht,您无需担心这些低级问题,您的所有数据都得到了安全的管理和存储。Stormpath提供:

  • 具有不同SDK的用户管理API:node.js、express、java、rest、python、flask
  • 现成托管登录:登录、注册和密码重置
  • 现成的ID站点,支持应用程序的单点登录
  • 用户的API密钥,由HTTP Basic Auth或OAuth2保护
  • 社交登录:Facebook、谷歌、LinkedIn、Github
  • 与Shiro和Spring Security的集成
  • 与Active Directory和LDAP的集成
使用Stormpath,您只需创建代表您的
角色的文件。在您的组和帐户中,您还可以使用我们灵活的概念创建更细粒度的概念,如
权限

如上所述,我们还支持Shiro集成,您可以使用Shiro建模所有安全需求,同时使用Stormpath作为身份验证和授权数据提供程序。请看一下我们的和我们的


免责声明,我是一名积极的Stormpath参与者。

如果您在第一个问题中询问如何为三个非常不同的实体(管理员用户、客户用户和店主)设计数据库架构,我建议您不要将它们合并到一个表中,因为它们是不同的概念,可能具有不同的功能。
您回答了自己的问题,因为“编程的易用性”很少胜过业务规则/逻辑

您使用现有安全框架或推出自己的安全框架的决定应该独立于核心业务实体的数据模型

如果您不想使用像Stormpath这样的托管解决方案,并且还没有决定使用Shiro,请查看一个基于Java权限的开源安全框架,它支持分层安全域、超级用户、权限继承和模拟

它可能非常适合您的项目,因为:

  • 您不需要将数据库设计与授权相关的方面混为一谈
  • OACC是为多租户应用程序体系结构(如项目的“商店”)而设计的
  • 它允许模拟,这是一个强大的功能,如果你需要支持客户服务代表,而不给他们“管理员”特权

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

我将根据每个Java对象的具体需求设计每个Java对象。了解您必须创建的内容。账户类型是否存在重叠?商店账户应该能够购买像顾客一样的东西(也就是说,
扩展
),还是管理员
应该同时实现商店和顾客?如果店铺报告该街道被重命名,与店铺所在街道相同的客户的地址是否会改变?电话号码的区号是否取决于城市

如果您的Java对象正常工作,请在第二步考虑O/R映射。也许它甚至会与你现在的想法大不相同(想想看,有多个联系人的商店,…)


一般来说,请确保您的地址字段正确地支持UTF-8,用于区分字母、希腊语、西里尔语或阿拉伯语地址。

简而言之:您不需要角色/权限表。:)

我会首先决定你真的需要安全模型吗?您的应用程序看起来像一个完美的六边形体系结构用例,有3个独立的前端部分:消费者、商店、管理员。然后,我建议为每个前端构建单独的身份验证/授权机制。在这种情况下,您可以灵活地选择最佳工具(OAuth2、OpenID、LDAP等),并遵循安全原则。您的应用程序看起来不像在方法级别需要授权的应用程序,因此您不需要RBAC

(1)我应该创建单个科目表还是创建3个单独的科目表

是的,我认为你应该设计一个单一的,因为一个帐户将有类似的数据为所有3种类型

(2) 对3个表的设计有什么建议:帐户/角色/权限

帐户:主键帐户\u id int,FK角色\u id int

角色:主键角色\u id int,帐户\u权限枚举(管理员[0],客户[1])

您不需要权限表,您可以使用复合设计模式在应用程序代码中处理您的权限级别,在该模式中,您可以拥有多个层次级别的管理员或客户权限。这样做的原因是最好申报您的业务