PDA

View Full Version : نحوه استفاده از RBAC بعداز انجام تنظیمات



png_92
چهارشنبه 13 مرداد 1395, 13:04 عصر
سلام
من میخوام تو پروژم از RBAC استفاده کنم و یکسری کد اضافه کردم ولی دقیقا نمیدونم چطوری باید جاهای دیگه مثل اضافه شدن کاربر ازش استفاده کنم.
کد زیر کنترلر rbac:


<?php


namespace commands;

use Yii;
use yii\console\Controller;

class RbacController extends Controller
{
public function actionInit()
{
$auth = Yii::$app->authManager;

// add "login" permission
$login = $auth->createPermission('login');
$login->description = 'login';
$auth->add($login);


// add "create user" permission
$create = $auth->createPermission('create');
$create->description = 'create user';
$auth->add($create);

// add "user" role and give this role the "createPost" permission
$user = $auth->createRole('user');
$auth->add($user);
$auth->addChild($user, $login);

// add "admin" role and give this role the "updatePost" permission
// as well as the permissions of the "user,server,guest" role
$admin = $auth->createRole('admin');
$auth->add($admin);
$auth->addChild($admin, $create);
$auth->addChild($admin,$user);


// Assign roles to users. 1 and 2 are IDs returned by IdentityInterface::getId()
// usually implemented in your User model.

$auth->assign($user, 2);
$auth->assign($admin, 1);
}
}


و این هم فانکشن create که در کنترلر user قرار داره:


class UsersController extends Controller
{

public function actionCreate()
{
$model = new User();
// $model = new User(['scenario' => 'register']);
if ($model->load(Yii::$app->request->post()) && $model->save()) {

return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('create', [
'model' => $model,
]);
}

}}


این هم کد لاگینم در کنترلر site :


class SiteController extends Controller
{


public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
], ];
}

public function actionLogin()
{
if (!Yii::$app->user->isGuest) {
return $this->goHome();
}

$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
}
return $this->render('login', [
'model' => $model,
]);
}}



من موقع ثبت نام کاربر چطوری میتونم بهش نقش بدم؟ ایا باید از این کد استفاده کنم؟ :


public function signup()
{
if ($this->validate()) {
$user = new User();
$user->username = $this->username;
$user->email = $this->email;
$user->setPassword($this->password);
$user->generateAuthKey();
$user->save(false);

// the following three lines were added:
$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());

return $user;
}

return null;
}



من همه مراحلو انجام دادم. کانفیگ لازمو انجام دادم. جدولای migration رو درست کردم. آیا نیازی هست با وجود این جدولا بازم فیلد role در جدول user باشه؟
در کل چجوری باید ازش تعیین سطح دسترسی استفاده کنم.

مهرداد سیف زاده
چهارشنبه 13 مرداد 1395, 16:09 عصر
شما یه مرحله ساخت رولها دارید که بسته به نیازتون یه سری رول پایه تعریف میکنید مثلا کاربر و ادمین و ...
بعد از ساخت user جدید تنها کاری که باید انجام بدید مرحله assign هست که id کاربری رو با id رول(که همون اسمش هست) در جدول auth_assigment هست. برای این کار میتونید در هنگام ساخت user جدید بصورت استاتیک اون رول رو به کاربر بدید. همین کدی که نوشتید باید کار کنه

png_92
چهارشنبه 13 مرداد 1395, 16:23 عصر
اینی که نوشتم دیتارو تو دیتابیس ذخیره میکنه ولی تو جدول auth_assigment چیزی ذخیره نمیشه و این خطارو بر میگردونه :
exception with message 'Trying to get property of non-object'

مهرداد سیف زاده
شنبه 16 مرداد 1395, 09:17 صبح
از کد زیر استفاده کن. بجای ROLE نام رول و جای USERID شما user id از تیبل کاربر رو بزارید


Yii::$app->authManager->assign(Yii::$app->authManager->getRole('ROLE'), 'USERID');


یا همون کد بالایی خودت بجای خط ۱۱ تا ۱۴ کد زیر رو قرار بده


Yii::$app->authManager->assign(Yii::$app->authManager->getRole('author'), $user->getId());