Yii框架中的RBAC实现

时间:2011-09-13 09:34:47

标签: yii

我正在尝试在我的Yii网络应用中应用简单的层次结构用户结构(例如:super-admin,admin,user)。我可以使用Yii的默认AccessControl来实现,还是需要在Rbac中实现。

1 个答案:

答案 0 :(得分:6)

您可以使用Yii的默认访问控制来执行此操作。

我不使用RBAC时通常会在ACL用户数据库中创建一个包含值的字段。管理员,超级管理员等然后登录后我将它分配给yon :: app() - componetnst / UserIdentity.php中的用户会话变量“注意$this->setState('accessCode',$user->accessCode);

class UserIdentity extends CUserIdentity
{
        private $_id;

    public function authenticate()
    {
            $username=strtolower($this->username);

            $user=Users::model()->find('LOWER(userName)=?',array($username));

            if($user===null)
                $this->errorCode=self::ERROR_USERNAME_INVALID;
            else if(!$user->validatePassword($this->password))
                $this->errorCode=self::ERROR_PASSWORD_INVALID;
            else
            {
                $this->_id=$user->u_id;
                $this->username=$user->userName;

                $this->setState('accessCode',$user->accessCode);
                $this->setState('userName',$this->username);
        $this->setState('id',$this->_id);
        $this->setState('accessCode',$user->accessCode);
                $this->errorCode=self::ERROR_NONE;
            }
            return $this->errorCode==self::ERROR_NONE;

    }

        public function getId(){
            return $this->_id;
        }

}

在我的控制器中没有我喜欢的东西

public function accessRules()
    {
        return array(
            array('allow',  
                'actions'=>array('admin'),
                'expression'=>'Yii::app()->user->accessCode & 8',
            ),
            array('allow', 
                'actions'=>array('create','update'),
                'expression'=>'Yii::app()->user->accessCode & 1',
            ),
            array('allow', 
                'actions'=>array('view'),
                'expression'=>'Yii::app()->user->accessCode & 4',
            ),
                        array('allow', 
                'actions'=>array('delete'),
                'expression'=>'Yii::app()->user->accessCode & 2',
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),
        );
    }

请注意,表达式的作用类似于if语句

我希望这会有所帮助