1.配置RBAC
在配置文件配置RBAC
return [
// ...
'components' => [
'authManager' => [
// 'class' => 'yii\rbac\PhpManager', //使用php脚本保存授权数据
'class' => 'yii\rbac\DbMannager' //使用数据库保存授权数据
//'cache' => 'cache' //使用缓存
],
'user' => [
'identityClass' => 'app\models\Admin',//后台用户(管理员)模型(model)类
'enableAutoLogin' => true,
'enableSession' => false,//是否启用session,用token登录设为false
]
// ...
],
];
2.迁移(migration)权限数据库
使用命令行
yii migrate --migrationPath=@yii/rbac/migrations
之后会在数据库生成4张表
* [itemTable]: 该表存放授权条目(角色和权限同一张表,通过type区分)。默认表名为 "auth_item" 。
* [itemChildTable]: 该表存放授权条目的层次关系。默认表名为 "auth_item_child"。
* [assignmentTable]: 该表存放授权条目对用户的指派情况。默认表名为 "auth_assignment"。
* [ruleTable]: 该表存放规则(自定义规则)。默认表名为 "auth_rule"。
3.在控制器基础类里添加验证行为(behaviors)
namespace app\controllers\admin;
use Yii;
use yii\web\Controller;
use yii\filters\auth\HttpHeaderAuth;
/**
* 基础控制器类,其他控制器再继承该类
*/
class BaseController extends Controller
{
public function behaviors()
{
return [
//...
//简单权限检测,可以不配置该字段
"access" => [
'class' => AccessControl::class,
'only' => [], //需要检测的action
'except' => [],//不需要检测的action
//规则
'rules' => [
[
'allow' => true, //true代表符合该规则的可以访问,false表示符合该规则的不可以访问
'actions' => ['test'],//action id
'roles' => ['@'] //@表示已经认证的用户,?表示路人访客
]
],
//拒绝访问的回调函数
'denyCallback' => function($rule, $action){
print('You are not allowed to access this page');
}
],
//登录状态检测
'authValidate' => [
//检测是否登录的类
//yii\filters\auth\HttpBasicAuth 使用账号密码实现登陆状态
//yii\filters\auth\QueryParamAuth 使用url传递access-token
//yii\filters\auth\HttpHeaderAuth 使用http header里X-Api-Key字段传token
'class' => HttpHeaderAuth::class,
//access-token 部分接口需要验证,需要排除比如 login register 这样的接口
'optional' => ['register', 'login', "index"],
],
];
//...
}
4.在后台用户模型类里实现yii\web\IdentityInterface认证接口
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class Admin extends ActiveRecord implements IdentityInterface
{
/**
* 根据给到的ID查询身份。
*
* @param string|integer $id 被查询的ID
* @return IdentityInterface|null 通过ID匹配到的身份对象
*/
public static function findIdentity($id)
{
return static::findOne($id);
}
/**
* 根据 token 查询身份。
*yii\filters\auth\HttpHeaderAuth获取到的token后会调用此函数
* @param string $token 被查询的 token
* @return IdentityInterface|null 通过 token 得到的身份对象
*/
public static function findIdentityByAccessToken($token, $type = null)
{
return static::findOne(['access_token' => $token]);
}
/**
* @return int|string 当前用户ID
*/
public function getId()
{
return $this->id;
}
/**
* 如果是token登录此函数体留空
* @return string 当前用户的(cookie)认证密钥
*/
public function getAuthKey()
{
return $this->auth_key;
}
/**
* 如果是token登录此函数体留空
* @param string $authKey
* @return boolean if auth key is valid for current user
*/
public function validateAuthKey($authKey)
{
return $this->getAuthKey() === $authKey;
}
}
5.角色,权限,分配
$auth = Yii::$app->authManager;
// 添加 "createPost" 权限
$createPost = $auth->createPermission('createPost');
$createPost->description = '创建文章';
$auth->add($createPost);
//添加admin用户组
$admin = $auth->createRole("admin");
$auth->add($admin);
//给角色role分配权限permission
$auth->addChild($admin,$createPost );
//给用户分配角色role
$auth->assign($admin, 用户id);
6.判断是否有权限
$controller = Yii::$app->controller->id;
$action = Yii::$app->controller->action->id;
//假如权限格式是 controller/action
if (Yii::$app->user->can($controller."/".$action)) {
echo "有权限";
} else {
echo "没权限";
}