Java Web 应用程序身份验证 - 帐户设计
Java web application authentication - account design
我在做一个web项目,后端是Java
& Mysql
,客户端包括web(html5)
和app(IOS/Android)
,我对设计帐户有一些疑问系统的。
有 3 种不同类型的帐户:
- 网店,网店账号会有自己的网站,
- 客户,客户通过应用访问 shop/commodity(IOS/Android),
- Admin,管理系统的一切。
我的认证基本思路:
肯定会有account
/ role
/ permission
table,因为管理员和客户都会有相当复杂的用户权限问题,客户也有不同的由于他们的历史行为而获得许可。
我决定使用 Apache Shiro
,因为它的简单性和分布式会话。
我的问题是:
(1) 我应该创建一个帐户 table 还是 3 个个人帐户 tables.
(2) 任何关于 3 table 设计的建议:
account
/ role
/ permission
?
我建议您考虑将所有用户管理需求委派给 Stormpath。使用 Stormpaht,您无需担心此类低级问题,您的所有数据都得到安全管理和存储。 Stormpath 提供:
- 使用不同 SDK 的用户管理 API:node.js、express、java、rest、python、flask。
- 现成的托管登录:登录、注册和密码重置。
- 现成的 ID 站点支持跨应用程序的单点登录
- API 为您的用户提供的密钥,使用 HTTP Basic Auth 或 OAuth2
保护
- 社交登录:Facebook,Google,LinkedIn,Github
- 与 Shiro 和 Spring 安全集成
- 与 Active Directory 和 LDAP 集成
使用 Stormpath,您只需创建 Groups which will represent your roles
. Inside your groups and accounts, you can also create finer-grained concepts like permissions
using our flexible Custom Data 个概念。
如上所述,我们还支持 Shiro 集成,您可以在其中使用 Shiro 模拟所有安全需求,同时使用 Stormpath 作为身份验证和授权数据提供程序。请看看我们的Stormpath Shiro plugin and at our Sample Shiro Web App。
免责声明,我是活跃的 Stormpath 贡献者。
如果您在第一个问题中询问如何为三个截然不同的实体(管理员用户、客户用户和店主)设计数据库模式,我建议您不要' 将它们合并为一个 table,因为它们是不同的概念并且可能具有不同的功能。
你有点回答了你自己的问题,因为“易于编程”很少胜过商业rules/logic。
您决定是使用现有的安全框架,还是推出自己的安全框架,应该独立于您的核心业务实体的数据模型。
如果您不想使用像 Stormpath 这样的托管解决方案,并且还没有选择 Shiro,请查看 OACC,一个基于许可的开源安全框架 Java 支持分层安全域、超级用户、权限继承和模拟。
它可能很适合您的项目,因为:
- 您不需要将与授权相关的方面弄乱您的数据库设计
- OACC 专为多租户应用程序架构而设计(例如您项目的 "shops")
- 它允许模仿,如果您需要支持客户服务代表而不给他们 "admin" 特权
,这是一个强大的功能
[免责声明:我是 OACC]
的维护者和共同开发者
我会 根据每个 Java 对象的不同需求来设计它。 弄清楚你必须创建什么。帐户类型是否存在重叠? Shop 帐户是否能够购买(即 extend
)Customer 之类的东西,或者 Admin implement
同时是 Shop 和 Customer? 客户的地址是否与商店住在同一条街,如果商店[=31]需要更改=] 报道街道改名了吗? phone号码的区号是否取决于城市?
如果您的 Java 对象正常工作,考虑第二步中的 O/R 映射 。也许它甚至 非常 与您现在的想法不同(想想 carrier codes in telephone numbers that require inline replacement, Packstation boths, Shops with multiple persons of contact, different address layouts in different countries …)。
一般来说,请确保您的地址字段正确支持 UTF-8 变音符号、希腊语、西里尔语或阿拉伯语地址。
简而言之:您不需要角色/权限表 :)
我会先决定你是否真的需要 RBAC security model? Your application looks like a perfect use case for hexagonal architecture with 3 separate isolated front-end parts: Consumer, Shop, Admin. Then I would advise to build separate authentication/authorization mechanism for each of these front-ends. In this case you are flexible to choose the best tool for the purpose (OAuth2, OpenID, LDAP whatever) and follow least common mechanism 安全原则。您的应用程序看起来不像需要方法级别授权的应用程序,因此您不需要 RBAC。
(1) 我应该创建一个帐户 table 还是 3 个个人帐户 tables.
是的,我认为您应该设计一个,因为一个帐户将具有所有 3 种类型的相似数据。
(2) 对 3 table 的设计有何建议:帐户/角色/权限?
账户:PK account_id int, FK role_id int
角色:PK role_id int, account_permission enum(admin [0], customer [1])
您不需要权限 table,您可以在应用程序代码中处理您的权限级别,使用复合设计模式,您可以在其中拥有多个层次级别的管理员或客户权限。这样做的原因是最好在模型代码中声明业务逻辑而不是在数据库设计中,数据库用于以尽可能优化和规范化的状态保存数据。我想您可以根据客户行为对您的复合权限层次结构使用依赖注入,这需要保存在 table 下的数据库中,即命名为 customer_behaviour,某些列为 "ticked"因为他们有特定的行为方式。
希望对您有所帮助。
我在做一个web项目,后端是Java
& Mysql
,客户端包括web(html5)
和app(IOS/Android)
,我对设计帐户有一些疑问系统的。
有 3 种不同类型的帐户:
- 网店,网店账号会有自己的网站,
- 客户,客户通过应用访问 shop/commodity(IOS/Android),
- Admin,管理系统的一切。
我的认证基本思路:
肯定会有account
/ role
/ permission
table,因为管理员和客户都会有相当复杂的用户权限问题,客户也有不同的由于他们的历史行为而获得许可。
我决定使用 Apache Shiro
,因为它的简单性和分布式会话。
我的问题是:
(1) 我应该创建一个帐户 table 还是 3 个个人帐户 tables.
(2) 任何关于 3 table 设计的建议:
account
/ role
/ permission
?
我建议您考虑将所有用户管理需求委派给 Stormpath。使用 Stormpaht,您无需担心此类低级问题,您的所有数据都得到安全管理和存储。 Stormpath 提供:
- 使用不同 SDK 的用户管理 API:node.js、express、java、rest、python、flask。
- 现成的托管登录:登录、注册和密码重置。
- 现成的 ID 站点支持跨应用程序的单点登录
- API 为您的用户提供的密钥,使用 HTTP Basic Auth 或 OAuth2 保护
- 社交登录:Facebook,Google,LinkedIn,Github
- 与 Shiro 和 Spring 安全集成
- 与 Active Directory 和 LDAP 集成
使用 Stormpath,您只需创建 Groups which will represent your roles
. Inside your groups and accounts, you can also create finer-grained concepts like permissions
using our flexible Custom Data 个概念。
如上所述,我们还支持 Shiro 集成,您可以在其中使用 Shiro 模拟所有安全需求,同时使用 Stormpath 作为身份验证和授权数据提供程序。请看看我们的Stormpath Shiro plugin and at our Sample Shiro Web App。
免责声明,我是活跃的 Stormpath 贡献者。
如果您在第一个问题中询问如何为三个截然不同的实体(管理员用户、客户用户和店主)设计数据库模式,我建议您不要' 将它们合并为一个 table,因为它们是不同的概念并且可能具有不同的功能。
你有点回答了你自己的问题,因为“易于编程”很少胜过商业rules/logic。
您决定是使用现有的安全框架,还是推出自己的安全框架,应该独立于您的核心业务实体的数据模型。
如果您不想使用像 Stormpath 这样的托管解决方案,并且还没有选择 Shiro,请查看 OACC,一个基于许可的开源安全框架 Java 支持分层安全域、超级用户、权限继承和模拟。
它可能很适合您的项目,因为:
- 您不需要将与授权相关的方面弄乱您的数据库设计
- OACC 专为多租户应用程序架构而设计(例如您项目的 "shops")
- 它允许模仿,如果您需要支持客户服务代表而不给他们 "admin" 特权 ,这是一个强大的功能
[免责声明:我是 OACC]
的维护者和共同开发者我会 根据每个 Java 对象的不同需求来设计它。 弄清楚你必须创建什么。帐户类型是否存在重叠? Shop 帐户是否能够购买(即 extend
)Customer 之类的东西,或者 Admin implement
同时是 Shop 和 Customer? 客户的地址是否与商店住在同一条街,如果商店[=31]需要更改=] 报道街道改名了吗? phone号码的区号是否取决于城市?
如果您的 Java 对象正常工作,考虑第二步中的 O/R 映射 。也许它甚至 非常 与您现在的想法不同(想想 carrier codes in telephone numbers that require inline replacement, Packstation boths, Shops with multiple persons of contact, different address layouts in different countries …)。
一般来说,请确保您的地址字段正确支持 UTF-8 变音符号、希腊语、西里尔语或阿拉伯语地址。
简而言之:您不需要角色/权限表 :)
我会先决定你是否真的需要 RBAC security model? Your application looks like a perfect use case for hexagonal architecture with 3 separate isolated front-end parts: Consumer, Shop, Admin. Then I would advise to build separate authentication/authorization mechanism for each of these front-ends. In this case you are flexible to choose the best tool for the purpose (OAuth2, OpenID, LDAP whatever) and follow least common mechanism 安全原则。您的应用程序看起来不像需要方法级别授权的应用程序,因此您不需要 RBAC。
(1) 我应该创建一个帐户 table 还是 3 个个人帐户 tables.
是的,我认为您应该设计一个,因为一个帐户将具有所有 3 种类型的相似数据。
(2) 对 3 table 的设计有何建议:帐户/角色/权限?
账户:PK account_id int, FK role_id int
角色:PK role_id int, account_permission enum(admin [0], customer [1])
您不需要权限 table,您可以在应用程序代码中处理您的权限级别,使用复合设计模式,您可以在其中拥有多个层次级别的管理员或客户权限。这样做的原因是最好在模型代码中声明业务逻辑而不是在数据库设计中,数据库用于以尽可能优化和规范化的状态保存数据。我想您可以根据客户行为对您的复合权限层次结构使用依赖注入,这需要保存在 table 下的数据库中,即命名为 customer_behaviour,某些列为 "ticked"因为他们有特定的行为方式。
希望对您有所帮助。