Yii 2 认证未前后端分离方式

Yii 2 认证

1.认证

认证是鉴定用户身份的过程。它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份。认证是登录功能的基础,这个是官话 说白了认证就是登录。

准备工作:数据库我这里的创建了一张admin 表

CREATE TABLE `admin` (
`id`  int(11) NOT NULL AUTO_INCREMENT ,
`username`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '用户名' ,
`password`  varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '密码' ,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=1
ROW_FORMAT=DYNAMIC
;
1.1 配置认证前的工作

Yii2提供了一个认证的框架,我们只需要去完善这个框架

1.设置用户组件 yii\web\User ;

2.创建一个类实现 yii\web\IdentityInterface 接口

用户组件 yii\web\User 用来管理用户的认证状态。这需要你 指定一个含有实际认证逻辑的认证类 yii\web\User::identityClass。 在以下web应用的配置项中,将用户用户组件 yii\web\User 的 认证类 yii\web\User::identityClass 配置成 模型类 app\models\User

'user' => [ //登录路径
            'loginUrl'=>['admin/login'],
            'identityClass' => \app\models\Admin::class,
            'enableAutoLogin' => true,
        ],

认证接口 yii\web\IdentityInterface 的实现

认证类 yii\web\User::identityClass 必须实现包含以下方法的,认证接口 yii\web\IdentityInterface:

yii\web\IdentityInterface::findIdentity():根据指定的用户ID查找 认证模型类的实例,当你需要使用session来维持登录状态的时候会用到这个方法。

yii\web\IdentityInterface::findIdentityByAccessToken():根据指定的存取令牌查找 认证模型类的实例,该方法用于 通过单个加密令牌认证用户的时候(比如无状态的RESTful应用)。

yii\web\IdentityInterface::getId():获取该认证实例表示的用户的ID。

yii\web\IdentityInterface::getAuthKey():获取基于 cookie 登录时使用的认证密钥。 认证密钥储存在 cookie 里并且将来会与服务端的版本进行比较以确保 cookie的有效性。

yii\web\IdentityInterface::validateAuthKey() :是基于 cookie 登录密钥的 验证的逻辑的实现

这是我实现接口的模型类:

<?php

namespace app\models;

use Yii;
use yii\web\IdentityInterface;

/**
 * This is the model class for table "admin".
 *
 * @property int $id
 * @property string $username 用户名
 * @property string $password 密码
 */
class Admin extends \yii\db\ActiveRecord  implements IdentityInterface
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'admin';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['username', 'password'], 'required'],
            [['username', 'password'], 'string', 'max' => 255],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'username' => '用户名',
            'password' => '密码',
        ];
    }

    /**
     * 返回主体
     * @param int|string $id
     * @return void|IdentityInterface|null
     */
    public static function findIdentity($id)
    {
        return self::findOne([
            'id'=>$id
        ]);
        // TODO: Implement findIdentity() method.
    }

    public static function findIdentityByAccessToken($token, $type = null)
    {
        // TODO: Implement findIdentityByAccessToken() method.
    }

    public function getId()
    {
      return  $this->id;
        // TODO: Implement getId() method.
    }

    public function getAuthKey()
    {
        // TODO: Implement getAuthKey() method.
    }

    public function validateAuthKey($authKey)
    {
        // TODO: Implement validateAuthKey() method.
    }
}

1.2 用户登录(认证)实现

创建登录表单 Login Form:


namespace app\models;

use Yii;
use yii\base\Model;

/**
 * LoginForm is the model behind the login form.
 *
 * @property User|null $user This property is read-only.
 *
 */
class LoginForm extends Model
{
    public $username;
    public $password;

    public function rules()
    {
        return [
            [['username','password'],'required']
        ];
    }

    public function attributeLabels()
    {
        return [
            'username'=>'用户名',
            'password'=>'密码'
        ];
    }

    public function login()
    {
        //通过用户名查找用户
        $admin = Admin::findOne(['username' => $this->username]);
        if ($admin) {
            //用户存在
            //对比用户密码
            //没有加密 $admin->password == $model->password
            //md5 加密 $admin->password == md5($model->password)
            //yii2框架密码加密
            //密码加密
            //$password_hash = \Yii::$app->security->generatePasswordHash('明文密码');
            //验证密码
            //$result = \Yii::$app->security->validatePassword('明文密码','密文');
            //对比用户密码
            if (Yii::$app->security->validatePassword($this->password,$admin->password)) {
                //密码正确,可以登录
                \Yii::$app->user->login($admin);
                return true;
            }else{
                //密码错误.提示错误信息
                $this->addError('password','密码错误');
            }
        }else{
            //用户不存在,提示 用户不存在 错误信息
            $this->addError('username','用户名不存在');
        }
        return  false;
    }
}

在 views/admin/ 中创建index.php ,和login.php

index.php:


<?php
/* @var $this yii\web\View */
?>
<h1>admin/index</h1>

<p>
    You may change the content of this page by modifying
    the file <code><?= __FILE__; ?></code>.
</p>

login.php:

<?php
$form = \yii\bootstrap\ActiveForm::begin();
echo $form->field($model,'username');
echo $form->field($model,'password')->passwordInput();

echo \yii\bootstrap\Html::submitButton('登录',['class'=>'btn btn-info']);

\yii\bootstrap\ActiveForm::end();

创建admin 控制器 admin Controller:

<?php
namespace app\controllers;
use app\filters\RbacFilter;
use app\models\Admin;
use app\models\LoginForm;
use Yii;

class AdminController extends \yii\web\Controller
{
    //登录
    public function actionLogin()
    {
        //认证(检测密码和账号是否正确)
        $model = new LoginForm();
        $request = \Yii::$app->request;
        if ($request->isPost) {
            $model->load($request->post());
            if ($model->login()){
                //登录成功
                \Yii::$app->session->setFlash('success','登录成功');
                return $this->redirect(['admin/index']);
            }
        }
        //没有成功者继续输入
        return $this->render('login',['model'=>$model]);
    }
    //添加用户
    public function actionAdd()
    {
        $admin = new Admin();
        $admin->username = 'admin';
        $admin->password = \Yii::$app->security->generatePasswordHash('123456');
        $admin->save();
    }
    //注销
    public function actionLogOut()
    {
        Yii::$app->user->logout();
    }
}
1.3 查看用户认证状态
可以通过 Yii::$app->user 获得一个 User实例,
$user = Yii::$app->user;

// 当前用户的身份实例。未认证用户则为 Null 。 
$identity = Yii::$app->user->identity; 

// 当前用户的ID。 未认证用户则为 Null 。 
$id = Yii::$app->user->id; 

// 判断当前用户是否是游客(未认证的) 
$isGuest = Yii::$app->user->isGuest;

这就是Yii 的简单认证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值