【问题标题】:How to allow access to PHP methods according to user's role?如何根据用户的角色允许访问 PHP 方法?
【发布时间】:2011-09-23 19:02:14
【问题描述】:

我有一个基本的用户模型,可以满足一般用户的所有需求。我现在需要为用户创建几个不同的角色,每个角色都有大约 10-20 种其他角色无法使用的不同方法。

假设我必须加载通用 User 类来确定用户的角色...

由于将这么多不同的基于角色的方法打包到通用用户模型中(当它们不能被所有角色使用时)效率低且繁重,让用户访问其基于角色的方法的最佳方式是什么只在他们需要的时候?

以下是我正在折腾的一些想法:

  1. 每个角色有一个单独的服务类,根据用户的角色交给User类

  2. 简单地围绕用户类中的所有方法,只有当用户具有正确的角色时才允许访问每个方法。

  3. 完全重构并让基于角色的类继承自 User 类。

这些有什么好主意,还是有更好的主意?

【问题讨论】:

    标签: php model rbac


    【解决方案1】:

    为什么不将基于角色的类组合到 User 对象中?

    $user = new User(/* pass role as an arg */);
    
    // Internally:
    // if ($user->getRole() instanceof AdminRole) or similar...
    if ($user->isAdmin()) {
        // AdminRole::doSomethingAdminish()
        $user->getRole()->doSomethingAdminish();
    }
    

    【讨论】:

    • 所以,在这种情况下 - 我将实例化 User(),并且根据角色,User 类将“实例化”角色,然后可以像这样使用 - $user-> adminRoles->doSomething() ?
    • 我编辑了答案以更清楚地解释它。本质上,您将“角色”和“用户”概念分开,而不是试图将它们捆绑到一个继承链中。
    • 啊,我明白了,所以在这种情况下,“角色”只是一组“帮助”函数,如果用户符合描述,则“给予”类......听起来很灵活,我喜欢分离
    • 正确。如果您需要它,您还可以对其进行结构化,以便用户只需使用一组角色而不是一个角色就可以拥有多个角色。这可能会给基于继承的设计带来麻烦,因为 PHP 类只能扩展一个类。
    • 谢谢!我不确定您的具体示例是否是我最终将如何做到的(基本上,我不会传递角色,而是让类自己生成它),但一般概念似乎适用于我。 :)
    【解决方案2】:

    看看工厂模式。本质上,您将实例化对象所需的数据传递给它,它会返回处于准备使用状态的正确对象。

    可能是这样的

    class UserFactory
    {
       public static function getUser($userId)
       {
          $user = new User($userId);
          switch ($user->getType()) {
             case 'admin' :
                return new AdminUser($user);
             case 'guest' :
                return new GuestUser($user);
             default :
                //handle 
          }
       }
    }
    

    【讨论】:

    • 您好,感谢您的回复...在这种情况下,getUser() 是否从数据库中检索用户数据? AdminUser 和 GuestUser 是 User 的扩展吗?
    • 哦,我想我明白了...这是否意味着我会做类似的事情: $admin = new UserFactory(12);回声 $admin->user->user_id; ....如果我想访问通用用户对象?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    • 2020-09-07
    • 1970-01-01
    • 2021-09-28
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多