laravel 5.3 多用户认证

 不知道对不对,乱来一下!!!!

 

1)laravel自带了一个用户认证系统,要使用的话,直接运行一下命令就可以用了

php artisan make:auth

会生成相应的控制器、路由和模版文件

 

2)数据迁移

php artisan migrate

会生成两个数据迁移文件和相应的数据表(users 和 password_resets 表)(要先配置好数据库连接)

 

3)多用户认证

如果只是需要完善一个用户资料字段,你只需要添加一个users表的数据迁移文件,再执行一下迁移就行了(看这里

但如果想添加更多不同类型的用户(比如后台用户、商家用户等等),要怎么办呢?

 

4)修改用户认证配置(增加“守卫”和“服务提供者”)

打开 config/auth.php 配置看一下就知道什么是“守卫”了

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],

很明显,所谓的“守卫”就laravel认证系统的端口,默认已经有两个“守卫”了,一个守web进口的,一个守api接口进口的

现在如果想添加一个后台“守卫”的话,就增加一个配置就行了(driver 表示认证系统用什么来驱动,provider 表示认证服务由谁的提供)

'admin' => [
    'driver' => 'session',
    'provider' => 'admins',
],

上面配置了一个admins服务提供者,所以相应的,还需要在 providers(服务提供者)列表里添加一个配置

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ],
],

 

5)配置是弄好,但提供服务的 Eloquent 模型还是不存在的,所以我们就来创建吧

php artisan make:model Admin --migration

--migration参数是同时生成相应的数据迁移文件的意思

 

Admin模型的内容大概是这样的:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;

class AdminController extends Controller
{
    public function __construct(){
        $this->middleware('auth:admin');
    }

    public function index(){
        $user = Auth::user();
        dd($user->email);
        return '后台!!!!';
    }
}

关键的地方是 $this->middleware('auth:admin'),关键laravel你要用的“守卫”是admin,否则打印的 Auth::user 将会是默认的前台用户信息

 

6)按自己的需求填一下数据迁移文件,再执行一下迁移(生成数据表)(这里演示的偷懒了,直接复制前台的用户表来玩的)

Schema::create('admins', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password', 60);
    $table->rememberToken();
    $table->timestamps();
});
php artisan migrate

 

7)添加访问路由,laravel5.3的auth路由在 /vendor/laravel/framework/src/Illuminate/Routing/Router.php 里的 auth 方法里

继续偷懒,直接复制前台路由,加一个后台路由组就行了,大概是这个样子:

$this->group(['prefix'=>'admin', 'namespace'=>'Admin', 'middleware'=>'adminview'], function(){
      // Authentication Routes...
      $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
      $this->post('login', 'Auth\LoginController@login');
      $this->post('logout', 'Auth\LoginController@logout')->name('logout');

      // Registration Routes...
      $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
      $this->post('register', 'Auth\RegisterController@register');

      // Password Reset Routes...
      $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm');
      $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
      $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm');
      $this->post('password/reset', 'Auth\ResetPasswordController@reset');
});

可以看到,上面路由组里定义使用了一个Admin的命名空间和一个adminview的中间件中间件的作用待会再说,我们先把命名空间下的控制器给搞定先~~

 

另外, routes/web.php 里一个后台前页的路由

Route::get('/admin','AdminController@index');

 

8)路由有了,但Admin命名空间下的路由还一个控制器还没有呢!!再再再偷懒,控制器也直接复制过去吧哈哈

 

LoginController 和 RegisterController 控制器里命名空间要改成

namespace App\Http\Controllers\Admin\Auth;

 

然后先说一下 RegisterController 控制器里的改动吧,有三处改动:

1、类头部把 use App\User 改成 use App\Admin;

2、redirectTo 属性值改成 protected $redirectTo = '/admin';

3、create 方法里把 User 模型改成 Admin 模型

 

完整的代码是这样的:

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        return Admin::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}
View Code

 

好了,再说一下 LoginController 控制器里的改动,也是三处改动:

1、类头部声明使用 Auth 门面,use Illuminate\Support\Facades\Auth;

2、redirectTo 属性值改成 protected $redirectTo = '/admin';

3、加 guard 方法来自定义使用的 “守卫”,看这里

 

完整的代码是这样的:

<?php

namespace App\Http\Controllers\Admin\Auth;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;

class LoginController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Login Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles authenticating users for the application and
    | redirecting them to your home screen. The controller uses a trait
    | to conveniently provide its functionality to your applications.
    |
    */

    use AuthenticatesUsers;

    /**
     * Where to redirect users after login.
     *
     * @var string
     */
    protected $redirectTo = '/admin';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('guest', ['except' => 'logout']);
    }

    protected function guard()
    {
        return Auth::guard('admin');
    }
}
View Code

 

9)OK,控制器也准备好了,该准备一下模版了,好,再再再再继承偷懒,还是直接复制前台模版改一下哈哈

模版内容我也不改了,直接改一下form表单的提交地址分别成 {{ url('/admin/login') }} 和 {{ url('/admin/login') }} 

 

10)好了,模版也有了,怎么访问显示模版呢?

从上面的路由可以看到,

登录页面的控制器方法叫 showLoginForm,它在 trait AuthenticatesUsers 里,大概是这样:

注册页面的控制器方法叫 showRegistrationForm,它在 trait RegistersUsers 里,大概是这样:

 

很明显都是直接return 的前台模版(后台的模版地址是 admin.auth.login 和 admin.auth.register),所以我要加一个判断,来判断动态显示前台模版和后台模版

怎么判断呢???

首页要判断的话,肯定要有个东西来判断的对吧?那这个东西哪里来呢?

肯定不能改路由,用url传参判断吧?那怎么怎么办呢?

想来想去,只能中间件来传参了。还是记得上面路由组里的中间吗?!!!!

 

11)好,我们来加一个 adminview 中间件

php artisan make:middleware AdminView

记得中间件是需要在 app/Http/kernel.php 里注册的,在 $routeMiddleware 数组后加上就行了

'adminview' => \App\Http\Middleware\AdminView::class,

 

中间件的内容如下:

<?php

namespace App\Http\Middleware;

use Closure;

class AdminView
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $request->is_admin = true;
        return $next($request);
    }
}

很明显,我只是在请求模型里加一个 is_admin 属性,并设置成 true

 

12)加完中间件后,上面的trait方法就要改一下了,判断也很简单,修改成下面这个样子

public function showLoginForm(Request $request)
{
    if ($request->is_admin) {
        return view('admin.auth.login');
    }else{
        return view('auth.login');
    }
}
public function showRegistrationForm(Request $request)
{
    if ($request->is_admin) {
        return view('admin.auth.register');
    } else {
        return view('auth.register');
    }
}

 

13)到此,添加后台用户认证其实就已经弄好的了,你可以访问 http://域名/admin/register 和 http://域名/admin/login 来测试注册和登录

 

14)最后一个,如果你成功登录了后台,然后再访问 /admin/register 或 /admin/login 的话,你会发现你跳走到 /home 里去了

照理来说登录之后应该是要跳 /admin 的,而不是 /home 的,什么原来呢??

其实就是 LoginController 和 RegisterController 里的构造方法里都写了使用一个叫 guest 的中间件,看一个 kernel.php,然后找到这个中间件的类在这里:

 

修改 RedirectIfAuthenticated 类的 handle 方法如下:

public function handle($request, Closure $next, $guard = null)
{
    if (Auth::guard($guard)->check()) {
        if ($request->is_admin) {
            return redirect('/admin');
        } else {
            return redirect('/home');
        }
    }

    return $next($request);
}

 


 

大功告成!!!

到此就真的大功告成了,这是我自己测试总结出来的,也不知道算不算是规范的写法(因为我看laravel-admin等的cms的后台用户认证的话不是这样写的,当然cms算了一个扩展应用,写法肯定是我们直接写是不同的)。

总之,如果你的项目要添加多一种用户认证(后台管理员、商家会员等等),可以参考一下这个写法哈哈哈哈哈!!!

 

PS:注册和登录的逻辑其实都不用怎么改,关键是要加一个 认证 “守卫”,然后 Admin 模型和 LoginController 控制器里声明要使用这个 “守卫”就行了,我已经写得比较详细了,如果你刚好来到这里,认真看一下!我很少写那么长的随笔哈哈。

转载于:https://www.cnblogs.com/tujia/p/6370898.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值