【发布时间】:2011-09-28 22:29:24
【问题描述】:
假设我想为一个简单的书店应用程序创建一个简单的数据库。我认为我应该至少有两个用户:管理员,具有创建、修改和删除对象的权限和用户,只有选择和插入权限。
我在这里有点困惑。我应该使用普通架构还是使用空架构创建用户帐户?用户应该有权从包含表的管理模式中选择和查询,还是应该包含这些表的用户模式?
【问题讨论】:
标签: database oracle database-design relational-database
假设我想为一个简单的书店应用程序创建一个简单的数据库。我认为我应该至少有两个用户:管理员,具有创建、修改和删除对象的权限和用户,只有选择和插入权限。
我在这里有点困惑。我应该使用普通架构还是使用空架构创建用户帐户?用户应该有权从包含表的管理模式中选择和查询,还是应该包含这些表的用户模式?
【问题讨论】:
标签: database oracle database-design relational-database
有许多不同的方法可以解决这类问题。因此,很大程度上取决于您的应用程序架构。
您通常会创建一个拥有数据库对象(表、包、视图等)的数据库帐户。让我们将此帐户称为BOOKSTORE_OWNER。此帐户通常会被锁定,因此在定期构建期间,任何人都无法以 BOOKSTORE_OWNER other 的身份登录。
然而,除了这个起点之外,还有许多合理的方法来处理身份验证和授权。如果您想让数据库同时处理这两个角色,您将创建两个角色——BOOKSTORE_USER 和BOOKSTORE_ADMIN。这些角色将被赋予对BOOKSTORE_OWNER 拥有的对象的适当特权。然后,您将为每个可以使用该应用程序的人创建一个数据库用户,并为每个新用户授予适当的角色。因此,如果您是管理员而我是用户,则将创建数据库帐户 dygi 并授予 BOOKSTORE_ADMIN 角色,而将创建数据库帐户 Justin 并授予 BOOKSTORE_USER 角色。
当人们构建客户端-服务器应用程序时,这种方法非常有效。另一方面,如果您使用的是三层应用程序,您希望中间层连接池使用相同的凭据连接到数据库,而不是让每个用户都有自己的数据库连接。最简单的方法是创建一个BOOKSTORE_APP 数据库帐户,授予该帐户BOOKSTORE_ADMIN 和BOOKSTORE_USER 角色的所有权限,然后让应用程序执行逻辑以确定哪个前端用户拥有什么特权。这通常需要BOOKSTORE_OWNER 模式中的USER、PRIVILEGE 和USER_PRIVILEGE 表。这种方法可以很好地工作。然而,缺点是每个应用程序都必须构建自己的逻辑来管理权限,这会随着时间的推移变得相当复杂。这也使得报告用户拥有的权限或确保用户离开组织或转移到新角色时用户的权限保持最新变得有些困难。
Oracle 特别通过允许proxy authentication 解决了许多此类挑战。这允许您将客户端-服务器方法的优点与使用共享数据库帐户的连接池优点混合在一起,其中每个用户都有自己的数据库帐户,该帐户利用 Oracle 现有的权限管理基础结构。这非常有效,但仅适用于 Oracle,然后仅适用于某些协议(OCI 和 JDBC),因此它不是很受欢迎。
当然,除了这些基础知识之外,您还可能会遇到相当多的复杂性。您可能希望拥有enterprise users,其中 Oracle 不维护密码,而是允许用户针对外部 LDAP 目录进行身份验证。您可能希望使用 LDAP 角色而不是特定于应用程序的表中的行来管理权限。您可能希望与各种中间层单点登录 (SSO) 解决方案集成。
【讨论】: