如何根据用户的角色允许访问PHP方法?

时间:2011-09-23 19:02:15

标签: php model rbac

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

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

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

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

  1. 每个角色都有一个单独的服务类,并根据用户的角色将它们提供给User类

  2. 只需简化用户类中的所有方法,并且只有在用户具有正确角色时才允许访问每个方法。

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

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

2 个答案:

答案 0 :(得分:3)

为什么不将基于角色的类组合到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();
}

答案 1 :(得分: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 
      }
   }
}