入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Yii2.0 探究三 :用户登录机制

创建时间:2016-12-22 投稿人: 浏览次数:684

前言:做后台管理的首要任务当然是登陆、注册;登陆的重要性不言而喻,而yii框架为我们封装好了用户的验证方法,我们要做的就是模仿,接触别的框架的可能会有人问:我自己写一个验证登录啊,不就是查询数据库,对照字段吗?下面就做出解答:

一、为什么推荐你用自带的登陆?

  1. yii2.0框架为我们封装好了用户的信息(登录后才可以查看);
    比如:
    Yii::$app->user->isGuest 判断是否为访客
    Yii::$app->user->id 用户id
    Yii::$app->user->identity 这是一个登陆用户的信息;里面包括了当前登录用户的全部信息(user数据表中所有的字段);登录后可以自行 var_dump去打印查看;
    比如

    获取当前用户名: Yii::$app->user->identity->username
    获取当前用户的ip: Yii::$app->user->identity->login_ip

    所以,我们不用费劲的去编写象下面的这样一个数组去判读
    [IsLogin=>0,Username=>’李华’]

  2. 自带csrf,和密码加密技术bcrypt加密方式,PHP自带的crypt函数去加密成的hash值;bcrypt 哈希是公认加密程度较好的加密方式(相对于md5和sha1来说,有破解md5的彩虹表不是说这种加密方式不安全,可自行google)。

所以我们还是乖乖用这种方式,去习惯、理解Yii框架的运作方式;闲话休说,我们一起做下后台登录;

二、后台如何完美登录?

步骤一:前后端登录分离;

  • . 默认生成的前端用户表的model在common>models文件夹下面

User.php;我们要做的就是copy一份;重命名为AdminUser.php,并且把类名改为AdminUser作为我们的后台用户表的model部分

  • . 分别去到frontend和backend下面的config>main.php中配置登录

    的session和cookie

"components" => [
        "request" => [
            "csrfParam" => "_csrf-backend",
        ],
        "user" => [
            "identityClass" => "commonmodelsAdminUser",
            "enableAutoLogin" => true,
            "identityCookie" => ["name" => "_identity-backend", "httpOnly" => true],
        ],
        "session" => [

            "name" => "advanced-backend",
        ],

这一步是为了彻底区分前后台,前台有前台的cookie和session;后台有后台的cookie和session前台把backend改为frontend就好,
千万别少了session这个配置

步骤二:后台管理员表adminuser的建立,(我们这次采取命令行的方式)

位置:console>migrations下面就是表的数据文件;下面我们就用命令

行来建表,win下面调用win+R进入cd项目目录

D:wampwamp64wwwsiteangular>
输入:yii migrate/create adminuser
Yii Migration Tool (based on Yii v2.0.10)

Create new migration "D:wampwamp64wwwsiteangularconsole/migrationsm161127_162856_ad
minuser.php"? (yes|no) [no]:
输入:yes
New migration created successfully.

命令行中console中进入到项目输入

yii migrate/create adminuser这个命令就是新建adminuser表的控制台模型(不起作用了在前面加php)    这时候会在console>migrations下出现一个文件类似 这样m161127_162856_adminuser.php的文件,我们可以在 这个文件中新建我们的表模型;我们copy上一个存在的user表模型;

class m161127_162856_adminuser extends Migration(这里千万别改,只copy里面的方法就行)
{
    public function up()
    {
        $tableOptions = null;
        if ($this->db->driverName === "mysql") {

            $tableOptions = "CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB";
        }

        $this->createTable("{{%adminuser}}", [
            "id" => $this->primaryKey(),
            "username" => $this->string()->notNull()->unique(),
            "auth_key" => $this->string(32)->notNull(),
            "password_hash" => $this->string()->notNull(),
            "password_reset_token" => $this->string()->unique(),
            "email" => $this->string()->notNull()->unique(),
            "status" => $this->smallInteger()->notNull()->defaultValue(10),
            "created_at" => $this->integer()->notNull(),
            "updated_at" => $this->integer()->notNull(),
        ], $tableOptions);
    }

    public function down()
    {
        $this->dropTable("{{%adminuser}}");
    }

    /*
    // Use safeUp/safeDown to run migration code within a transaction
    public function safeUp()
    {
    }

    public function safeDown()
    {
    }
    */
}

这样表就建模完成,剩下的就是命令行执行建表命令了。
D:wampwamp64wwwsiteangular>
输入:yii migrate
Yii Migration Tool (based on Yii v2.0.10)

Creating migration history table "migration"...Done.
Total 2 new migrations to be applied:
        m130524_201442_init
        m161127_162856_adminuser

Apply the above migrations? (yes|no) [no]:yes
*** applying m130524_201442_init
    > create table {{%user}} ... done (time: 1.555s)
*** applied m130524_201442_init (time: 1.850s)

*** applying m161127_162856_adminuser
    > create table {{%adminuser}} ... done (time: 0.404s)
*** applied m161127_162856_adminuser (time: 0.436s)


2 migrations were applied.

Migrated up successfully.

我们去数据库看下,果然大功告成,两个表user、adminuser已经新建完成;这一步我们学会了很多yii的控制台命令:

yii+....
   migrate                         数据库中添加model
   migrate/create admin            创建表
   migrate/down                    回滚表(删除已经创建的)              
   migrate/up (default)            更新表(更新新建的表模型)

当然也可以新建类似这样结构的表;

步骤三:登录开始

1. //登录方法

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

        $model = new backendmodelsLoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {

            return $this->goBack();
     //或者改为 return $this->redirect(["site/index"])也可以;
        } else {
            return $this->render("login", [
                "model" => $model,
            ]);
        }
    }

2.去render一个login的表单:
<div class="login-box-body">
        <p class="login-box-msg">后台登录</p>

        <?php $form = ActiveForm::begin(["id" => "login-form", "enableClientValidation" => false]); ?>

        <?= $form
            ->field($model, "username", $fieldOptions1)
            ->label(false)
            ->textInput(["placeholder" => $model->getAttributeLabel("用户名")]) ?>

        <?= $form
            ->field($model, "password", $fieldOptions2)
            ->label(false)
            ->passwordInput(["placeholder" => $model->getAttributeLabel("密码")]) ?>

        <div class="row">
            <div class="col-xs-8">
                <?= $form->field($model, "rememberMe")->checkbox() ?>
            </div>
            <!-- /.col -->
            <div class="col-xs-4">
                <?= Html::submitButton("登录", ["class" => "btn btn-primary btn-block btn-flat", "name" => "login-button"]) ?>
            </div>
            <!-- /.col -->
        </div>


        <?php ActiveForm::end(); ?>
        <!-- /.social-auth-links -->

        <a href="#">忘记密码?</a><br>

    </div>

3.把common>models下面的LoginForm.php copy过来,放到backend>models下面并且修改:
 protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = AdminUser::findByUsername($this->username);
        }

        return $this->_user;
    }

将AdminUser的model去user进来;
use commonmodelsAdminUser;

三、常见问题?

Q:我的登陆成功后不跳转,我的登陆成功后跳转别的页面?:

A:配置文件中session和cookie缺少配置,详情见上面;

Q:我的自动登录失败?:

A:user组件的自动登录缺少;

"user" => [
            "identityClass" => "commonmodelsUser",
            "enableAutoLogin" => true,
            "identityCookie" => ["name" => "_identity-frontend", "httpOnly" => true],
        ],

Q:我的登陆不成功?:

A:……..;

四、我为什么不说具体函数?

都是菜鸟过来的,因为这要留给你去研究,配个好的IDE去追踪代码吧,骚年;

注意:验证主要是AdminUser中的model去实现了

yiiwebIdentityInterface 这个接口去验证的,自己可以看一下,里面有

几个规定的方法要去实现,不然会报错;

The End

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。