gpt4 book ai didi

php - 在 php 应用程序中实现基于角色的访问控制

转载 作者:行者123 更新时间:2023-11-29 01:56:40 24 4
gpt4 key购买 nike

我一直在为我的大学开发一个需要基于角色的访问控制的 PHP 应用程序。我采用的方法是为每个角色创建一个单独的 MySQL 用户。所以每个角色都有一个单独的数据库用户。这些数据库用户中的每一个都拥有该角色所需的最小表集的权限。

现在,我的问题是这实际上是否是处理基于角色的应用程序的正确方法。我产生这种怀疑的原因是因为现在是时候让系统联机(使用 GoDaddy 托管)我发现他们不允许创建具有表特定权限的用户。事实上,他们甚至不允许直接通过 SQL 脚本创建用户(系统上的角色创建涉及通过执行 SQL 命令的 php 脚本创建用户)。

因此,我现在正在考虑我的方法实际上是否正确。实现这种基于角色的系统的标准方法是什么?

这是我的第一个现场项目,所以我之前并没有太多实际交付真实项目的经验。

最佳答案

除非您不是托管商,否则您可能不想通过脚本动态创建数据库用户。想想看:

A database user is a component that interacts with your application and not with your end-users.

因此,请坚持为您的应用程序使用一个数据库,并使用专用表来构建您的 ACL。您的数据库架构可能如下所示:

users( id:pk, name )
roles( id:pk, name )
permissions( id:pk, key, description )
permission_role( permission_id:fk, role_id:fk )
role_user( role_id:fk, user_id:fk )

这里基本上有三样东西:

  • 用户:没什么特别的。只是一个可以由它的 id 唯一定义的用户
  • 权限:基本上只是一个 key 存储,将在您的脚本中查询这些 key 以检查权限。
  • 角色:用户和权限之间的粘合剂。用户所属的角色及其权限的总和将定义用户可以做什么和不可以做什么的全部内容。

这是基本设置。其他表只是帮助表,用于将各个部分连接在一起。

您的代码会处理其余部分。设置一个(或更好的)类来完成繁重的工作。然后将您的 ACL 实例传递给您的用户类(其他实现当然是可能的。请参阅帖子底部)。

<?php 

class Acl implements AclInterface {

public function hasPermissionTo( $action )
{
// Query DB and check if a record exists
// in the role_user table where the
// user_id matches with the current user
// and join the role_id with `roles` and then
// with `permission_role` to see if the user
// is permitted to perform a certain action
}

}

class User {

protected $acl;

public function __construct( AclInterface $acl )
{
$this->acl = $acl;
}

public function hasPermissionTo( $action )
{
return $this->acl->hasPermissionTo( $action );
}

}

您应该了解基本概念。实际的实现取决于您。您可能需要考虑的事项:

  • 您希望您的 ACL 成为您的 User 的一部分还是一个独立的组件?
  • 您想如何将当前用户传递给 ACL?您要将当前用户的实例传递给 ACL,还是只传递用户 ID?

这些问题取决于您喜欢什么以及您的架构。快乐编码!

关于php - 在 php 应用程序中实现基于角色的访问控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27100526/

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