自定义后台用户表或者登陆字段

Laravel-admin在安装之后,会自动创建好用户表,以及相关的其它表和关系,并且默认使用usernamepassword作为登陆字段,如果你需要自定义其它表作为用户表,或者修改登陆字段的话,可以参考下面的方式。

假设你的后台用户表为customers,对应的模型为App\Models\Customer,然后希望使用customers表中的emailpassword两个字段登陆。

定义模型

首先参考vendor/encore/laravel-admin/src/Auth/Database/Administrator.php定义你的模型App\Models\Customer

<?php

namespace App\Models;

use Encore\Admin\Auth\Database\HasPermissions;
use Encore\Admin\Traits\AdminBuilder;
use Illuminate\Auth\Authenticatable;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Database\Eloquent\Model;

class Customer extends Model implements AuthenticatableContract
{
    use Authenticatable, AdminBuilder, HasPermissions;
}

修改配置

打开config/admin.php,找到database配置部分,将users_tableusers_model修改为你自定义的用户表和模型:


'database' => [
    'users_table' => 'customers',
    'users_model' => App\Models\Customer::class,
]

修改auth.providers.admin.modelApp\Models\Customer::class


    'auth' => [

        ....

        'providers' => [
            'admin' => [
                'driver' => 'eloquent',
                'model'  => App\Models\Customer::class,  // 修改这里
            ],
        ],
    ],

修改控制器

打开app/Admin/Controllers/AuthController.php, 登陆的页面和登陆请求的处理,是通过这个控制器的父类Encore\Admin\Controllers\AuthController中的getLoginpostLogin两个action来实现的

如果你想要修改登陆页面,复制vendor/encore/laravel-admin/resources/views/login.blade.php,到resources/views目录下,比如resources/views/admin/login.blade,php,将视图中的提交字段username修改为email,如果要修改页面的其它内容请自行修改,然后在app/Admin/Controllers/AuthController.php中加入下面的代码覆盖掉父类的getLogin方法:

<?php

namespace App\Admin\Controllers;

use Encore\Admin\Controllers\AuthController as BaseAuthController;

class AuthController extends BaseAuthController
{
    public function getLogin()
    {
        if ($this->guard()->check()) {
            return redirect($this->redirectPath());
        }

        //  修改这里,指定`resources/views/admin/login.blade,php`作为登陆页的视图
        return view('admin.login');
    }
}

接下来一步就是修改处理登陆的逻辑,同样是在app/Admin/Controllers/AuthController.php中覆盖掉父类的postLogin方法就好,修改里面的登陆字段。在父类的postLogin方法中我们可以看到是通过$this->username()获取的用户登陆账号字段,所以只要在app/Admin/Controllers/AuthController.php加上username()方法,返回字段名email即可:

<?php

namespace App\Admin\Controllers;

use Encore\Admin\Controllers\AuthController as BaseAuthController;

class AuthController extends BaseAuthController
{
    public function username()
    {
        return 'email';
    }
}

如果你要调整整个登陆逻辑,就直接覆盖postLogin方法就可以了。

总结

需要注意一点的就是,你自定义了后台的用户表和模型之后,这个表和Laravel-admin内置的角色表和权限表之间的关系需要保持,所以在新的模型中,需要按照vendor/encore/laravel-admin/src/Auth/Database/Administrator.php设置他们的关系,实现其中的一些方法。