gpt4 book ai didi

security - 授权系统设计题

转载 作者:行者123 更新时间:2023-12-05 09:00:20 26 4
gpt4 key购买 nike

我正在尝试想出一种进行身份验证和授权的好方法。这是我所拥有的。欢迎评论和我所希望的。

我在 mac 服务器上安装了 php。我有用于用户帐户的 Microsoft AD。

当用户登录到 Intranet 时,我正在使用 LDAP 查询 AD。

我的设计问题涉及如何处理该 AD 信息。一位同事建议在 AD 中使用命名约定以避免使用中间数据库。例如,我有一个网页,personnel_payroll.php。我得到了 url 和 URL,AD 用户在 AD 中查询 personal_payroll 组。如果登录用户在该组中,则他们有权查看该页面。我必须为每个页面或至少为通用身份验证的用户域用户创建一个组。

页面上的控件变得更加棘手。例如,假设页面或网格上有一个按钮,只有经理才能看到。我需要 personal_payroll_myButton 作为我的 AD 中的一个组。如果用户在该组中,他们将获得按钮。如果一个页面有多个不同级别的授权,我可以有很多组。

是的,我的 AD 会很大,但如果我不这样做,其他东西也会,无论是 MySQL(或其他数据库)、文本文件、httpd.conf 等。

对于传递 url 或控件名称和经过身份验证的用户的各种项目,我会有一个通用的 php 函数 IsAuthorized。

使用这样的安全命名约定并将 AD 用作该存储库是否存在固有的错误?我必须保持在某个地方。为什么不是广告?

感谢您的评论。

编辑:您是否认为这种方案会因为 LDAP 调用而导致页面超慢?

编辑:我不是第一个想到这个的人。对此有任何想法表示赞赏。

编辑:谢谢大家。很抱歉,我无法给您更多的回答分数。我必须选择一个。

最佳答案

我想知道是否有一种不同的方式来表达和存储可以更干净、更高效地工作的权限。

大多数应用程序都分为功能区域或角色,并且权限是根据这些 [广泛] 区域分配的,而不是按页面分配权限。因此,例如,您可能拥有如下权限:

  • 使用应用
  • 创建用户
  • 重置其他用户密码
  • 查看工资数据
  • 修改工资数据

或者对于角色,您可以:

  • 应用程序用户
  • 应用管理员
  • 薪资管理员

很可能角色(以及可能的功能权限)可能已经映射到存储在 Active Directory 中的数据,例如现有的 AD 组/角色。如果没有,它仍然比每页权限更容易维护。权限可以作为用户组来维护(一个用户要么在一个组中,要么有权限,要么没有),或者作为自定义属性来维护:

dn: cn=John Doe,dc=example,dc=com
objectClass: top
objectClass: person
objectClass: webAppUser
cn: John Doe
givenName: John
...
myApplicationPermission: UseApplication
myApplicationPermission: ViewPayrollData

这样做的好处是架构更改最少。如果您使用组,AD(以及地球上所有其他 LDAP 服务器)已经具有该功能,并且如果您使用这样的自定义属性,则只有一个属性(并且可能是一个 objectClasswebAppUser 在上面的例子中)将需要被添加。

接下来,您需要决定如何使用数据。一种可能性是在用户登录时检查用户的权限(找出他们所在的组,或者他们被授予的权限)并将它们存储在 session 中的网络服务器端。这有一个问题,即权限更改仅在用户登录时生效,而不是立即生效。如果您不希望权限经常更改(或者当用户同时使用系统时),这可能是一个合理的方法。这有一些变体,例如在经过一定时间后重新加载用户的权限。

另一种可能性,但具有更严重(负面)的性能影响,是根据需要检查权限。在这种情况下,您最终会更频繁地访问 AD 服务器,从而导致负载增加(在 Web 服务器和 AD 服务器上)、网络流量增加以及延迟/请求时间增加。但您可以确定权限始​​终是最新的。

如果您仍然认为将单独的页面和按钮名称作为权限检查的一部分会有用,您可以拥有页面/按钮 => 权限的全局“映射”,并通过以下方式进行所有权限查找那。一些东西(完全未经测试,主要是伪代码):

$permMap = array(
"personnel_payroll" => "ViewPayroll",
"personnel_payroll_myButton" => "EditPayroll",
...
);

function check_permission($elementName) {
$permissionName = $permMap[$elementName];
return isUserInLdapGroup($user,$permissionName);
}

关于security - 授权系统设计题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1191213/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com