Authentication یا احراز هویت در فریمورک Yii
فرایندی که در آن هویت یک کاربر،اعتبارسنجی می شود، احراز هویت یا authentication نام دارد. این فرآیند معمولاً از یک username و password استفاده می کند تا تعیین کند که آیا کاربر، کسی که ادعا می کند، هست یا خیر.
برای استفاده از authentication در فریمورک Yii شما نیاز دارید تا :
- کامپوننت user را پیکربندی کنید.
- رابط yii\web\IdentityInterface را پیاده سازی کنید.
قالب basic برنامه، دارای یک authentication داخلی می باشد که از کامپوننت user استفاده می کند، همانطور که در کد زیر نشان داده شده است :
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'basic',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'components' => [
'request' => [
// !!! insert a secret key in the following (if it is empty) - this
//is required by cookie validation
'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
//other components...
'db' => require(__DIR__ . '/db.php'),
],
'modules' => [
'hello' => [
'class' => 'app\modules\hello\Hello',
],
],
'params' => $params,
];
if (YII_ENV_DEV) {
// configuration adjustments for 'dev' environment
$config['bootstrap'][] = 'debug';
$config['modules']['debug'] = [
'class' => 'yii\debug\Module',
];
$config['bootstrap'][] = 'gii';
$config['modules']['gii'] = [
'class' => 'yii\gii\Module',
];
}
return $config;
?>
همانطور که در پیکربندی یا configuration بالا مشاهده می کنید، برای کاربر ،کلاسِ هویت (identityClass) برابر با کلاسِ app\models\User تنظیم شده است.
identity class باید yii\web\IdentityInterface را با متدهای زیر پیاده سازی کند :
- findIdentity() – با استفاده از یک user ID تعیین شده ، شی کلاس identity را جستجو می کند.
- findIdentityByAccessToken() - با استفاده از یک access token تعیین شده ، شی کلاس identity را جستجو می کند.
- getId() – این متد، ID کاربر را بر می گرداند.
- getAuthKey() - کلیدی را که برای اعتبارسنجیِ cookie-based login (login بر اساس cookie)، مورد استفاده قرار می گیرد، باز می گرداند.
- validateAuthKey() – یک logic برای اعتبارسنجیِ کلید برای cookie-based login (login بر اساس cookie)، پیاده سازی می کند.
در قالبِ basic برنامه، مدلِ User تمامی توابع فوق را پیاده سازی می کند. داده های کاربر در property با نام $users ذخیره می شود :
<?php
namespace app\models;
class User extends \yii\base\Object implements \yii\web\IdentityInterface {
public $id;
public $username;
public $password;
public $authKey;
public $accessToken;
private static $users = [
'100' => [
'id' => '100',
'username' => 'admin',
'password' => 'admin',
'authKey' => 'test100key',
'accessToken' => '100-token',
],
'101' => [
'id' => '101',
'username' => 'demo',
'password' => 'demo',
'authKey' => 'test101key',
'accessToken' => '101-token',
],
];
/**
* @inheritdoc
*/
public static function findIdentity($id) {
return isset(self::$users[$id]) ? new static(self::$users[$id]) : null;
}
/**
* @inheritdoc
*/
public static function findIdentityByAccessToken($token, $type = null) {
foreach (self::$users as $user) {
if ($user['accessToken'] === $token) {
return new static($user);
}
}
return null;
}
/**
* Finds user by username
*
* @param string $username
* @return static|null
*/
public static function findByUsername($username) {
foreach (self::$users as $user) {
if (strcasecmp($user['username'], $username) === 0) {
return new static($user);
}
}
return null;
}
/**
* @inheritdoc
*/
public function getId() {
return $this->id;
}
/**
* @inheritdoc
*/
public function getAuthKey() {
return $this->authKey;
}
/**
* @inheritdoc
*/
public function validateAuthKey($authKey) {
return $this->authKey === $authKey;
}
/**
* Validates password
*
* @param string $password password to validate
* @return boolean if password provided is valid for current user
*/
public function validatePassword($password) {
return $this->password === $password;
}
}
?>
مرحله 1 – در مرورگر وب تان آدرس http://localhost:8080/index.php?r=site/login را تایپ کنید و داخل فیلد های username و password کلمه ی admin را وارد کنید تا وارد سایت شوید.
مرحله 2 - سپس یک تابع جدید به نام actionAuth() به SiteController اضافه کنید.
public function actionAuth(){
// the current user identity. Null if the user is not authenticated.
$identity = Yii::$app->user->identity;
var_dump($identity);
// the ID of the current user. Null if the user not authenticated.
$id = Yii::$app->user->id;
var_dump($id);
// whether the current user is a guest (not authenticated)
$isGuest = Yii::$app->user->isGuest;
var_dump($isGuest);
}
مرحله 3 - آدرس http://localhost:8080/index.php?r=site/auth را در مرورگر وب تان تایپ کنید، آنگاه می توانید اطلاعات دقیق در مورد کاربر را مشاهده نمایید.
مرحله 4 - برای login و logout کردنِ یک کاربر، می توانید از کد زیر استفاده کنید.
public function actionAuth() {
// whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
// find a user identity with the specified username.
// note that you may want to check the password if needed
$identity = User::findByUsername("admin");
// logs in the user
Yii::$app->user->login($identity);
// whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
Yii::$app->user->logout();
// whether the current user is a guest (not authenticated)
var_dump(Yii::$app->user->isGuest);
}
ابتدا، بررسی می کنیم که آیا کاربر login شده است یا نه. اگر مقدار بازگشتی flase بود، پس از طریق فراخوانی متد Yii::$app → user → login() ، کاربر را login می کنیم و با استفاده از متد Yii::$app → user → logout() کاربر logout می شود.
مرحله 5 – در مرورگر وب تان به آدرس http://localhost:8080/index.php?r=site/auth بروید، آنچه که مشاهده خواهید کرد مطابق با تصویر زیر می باشد.
کلاس yii\web\User رویدادهای زیر را به وجود می آورد :
- EVENT_BEFORE_LOGIN - این رویداد، در ابتدایِ متدِ yii\web\User::login() ، ایجاد می شود
- EVENT_AFTER_LOGIN - این رویداد، بعد از یک login شدنِ موفقیت آمیز، ایجاد می شود
- EVENT_BEFORE_LOGOUT - این رویداد، در ابتدایِ متدِ yii\web\User::logout() ، ایجاد می شود
- EVENT_AFTER_LOGOUT - این متد، بعد از یک logout شدنِ موفقیت آمیز، ایجاد می شود
این فصل در یک نگاه:
…
سلام . پیشنهاد میکنم حتما دموی دوره رو مشاهده کنید درباره فریم ورک Yii: در پاسخ به سوالات : آیا این فریم ورک سریع است؟ آیا این یک فریم ورک امن است؟ آیا این یک فریم ورک حرفه ای است؟ آیا ا…این فصل در یک نگاه:
…
پیشنهاد میکنیم دمو دوره رو حتما مشاهده کنید با سلام خدمت دوستان عزیز . ابتدا عرض کنم که این دوره برای دوستانی آماده شده که میخوان وب اپلیکیشن های مدرنی رو طراحی بکنن و وارد بازار کار ط…