laravel5.5前后台登录认证实现过程详解

来源:互联网 发布:虚拟云桌面软件 编辑:程序博客网 时间:2024/05/29 12:32

认证原理
     Laravel 的认证组件由 guards 和 providers 组成,guard 定义了用户在每个请求中如何实现认证,例如,Laravel 通过session guard 来维护 Session 存储的状态和 Cookie。provider 定义了如何从持久化存储中获取用户信息,laravel 底层支持通过 Eloquent 和数据库查询构建器两种方式来获取用户。
     了解了它的认证原理,那么让我们开始去实现前后台登录认证吧。前台的认证使用默认的就好,这里主要讲怎么在有前台认证的情况下同时实现后台验证。

1、生成laravel自带的认证脚手架
     $ php artisan make:auth
     以上命令将自动生成auth模板文件夹和layouts模板文件夹以及路由信息:
        Auth::routes();
        Route::get('/home', 'HomeController@index')->name('home');

2、修改config/auth.php配置,添加后台认证信息
    2.1 在 gurads 处,添加 admin guard 用于后台管理员认证
        'admin' => [
            'driver' => 'session',
           'provider' => 'admins',
        ],
    2.2 在 providers 处添加 admins provider,使用 Admin 模型
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Http\Model\Admin\Admin::class,
        ],

3、创建后台管理员模型
    $ php artisan make:model Http/Model/Admin/Admin -m
    //-m 参数会同时生成数据库迁移文件 xxx_create_admins_table
    //等同于
    //php artisan make:model Admin
    //php artisan make:migration creaet_admins_table

4、修改数据库迁移文件xxx _create_admins_table
    Schema::create('admins', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
   });

5、创建表并生成临时数据
    5.1 database/factories/ModelFactory.php, 添加数据:
        $factory->define(App\Http\Model\Admin\Admin::class, function (Faker\Generator $faker) {
            static $password;

            return [
                'name' => $faker->name,
                'password' => $password ?: $password = bcrypt('123456'),
                'email' =>  $faker->email,
                'remember_token' => str_random(10),
            ];
        });
    5.2 生成数据方式1---使用tinker:
        $ php artisan tinker
        use App;
        factory(App\Http\Model\Admin\Admin::class,5)->create();//3表示生成3条测试数据
    5.3 方式2---在 database/seeds 目录下生成 AdminsTableSeeder.php 文件
        $ php artisan make:seeder AdminsTableSeeder
        编辑该文件
            public function run()
            {
                factory('App\Http\Model\Admin\Admin', 3)->create([//3表示生成3条测试数据
                    'password' => bcrypt('123456')
                ]);
            }

        在 database/seeds/DatabaseSeeder.php 的 run 方法里调用 AdminsTableSeeder 类
            public function run()
            {
                $this->call(AdminsTableSeeder::class);
            }
        执行数据库迁移命令
            $ php artisan migrate --seed

        数据库里会创建 admins 表,并且生成了3条数据

6、修改 app/Http/Model/Admin/Admin.php 模型文件
    namespace App\Http\Model\Admin;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    class Admin extends Authenticatable
    {
        use Notifiable;
        /**
        * The attributes that are mass assignable.
        *
        * @var array
        */
        protected $fillable = [
            'name', 'email', 'password',
        ];
        /**
        * The attributes that should be hidden for arrays.
        *
        * @var array
        */
        protected $hidden = [
            'password', 'remember_token',
        ];
    }

7、创建控制器
    $ php artisan make:controller Admin/LoginController
    $ php artisan make:controller Admin/AdminController

8、编辑 Admin/LoginController.php:
    <?php
        namespace App\Http\Controllers\Admin;
        use Illuminate\Http\Request;
        use App\Http\Controllers\Controller;
        use Illuminate\Foundation\Auth\ThrottlesLogins;
        use Illuminate\Foundation\Auth\AuthenticatesUsers;
        class LoginController extends Controller
        {
            use AuthenticatesUsers;
            /**
            * Where to redirect users after login / registration.
            *
            * @var string
            */
            protected $redirectTo = '/admin/index';
            protected $username;
            /**
            * Create a new controller instance.
            *
            * @return void
            */
            public function __construct()
            {
                //$this->middleware('guest.admin')->except('logout');//使用自定义的中间件
                $this->middleware('guest:admin')->except('logout');//冒号后面的admin作为参数传给中间件的$guard形参
                $this->username = config('admin.global.username');
            }
            /**
            * 重写登录视图页面
            */
            public function showLoginForm()
            {
                return view('admin.auth.login');
            }
            /**
            * 自定义认证驱动
            * @return mixed
            */
            protected function guard()
            {
                return auth()->guard('admin');
            }
            /**
            * 重写验证时使用的用户名字段
            */
            public function username()
            {
                return 'name';//默认为使用邮箱验证,这里可以改成用户名
            }
            /**
            * 重写退出登录
            *
            * @param  \Illuminate\Http\Request  $request
            * @return \Illuminate\Http\Response
            */
            public function logout(Request $request)
            {
                $this->guard()->logout();
                $request->session()->forget($this->guard()->getName());
                $request->session()->regenerate();
                return redirect('/admin');
            }
        }

9、修改 app\Http\Middleware\RedirectIfAuthenticated.php
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->check()) {
            // 根据不同 guard 跳转到不同的页面
            $url = $guard ? 'admin/index':'/home';
            return redirect($url);
        }
        return $next($request);
    }

10、编辑 Admin\AdminController.php:(作为后台基类)
    /**
    * Create a new controller instance.
    *
    * @return void
    */
    public function __construct()
    {
        $this->middleware('auth.admin:admin');
    }
    //
    public function index()
    {
        //dd('用户名:'.auth('admin')->user()->name);
        return view('admin.index');
    }

11、创建中间件
    11.1 创建后台管理认证中间件
        $ php artisan make:middleware AuthAdmin

        use Closure;
        use Illuminate\Support\Facades\Auth;
        public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->guest()) {
                if ($request->ajax() || $request->wantsJson()) {
                    return response('Unauthorized.', 401);
                } else {
                    return redirect()->guest('admin/login');
                }
            }
            return $next($request);
        }
    11.2 创建后台管理登录跳转中间件,用于登录之后再访问登录路由时的跳转
        11.2.1 如果LoginController中使用的中间件是'guest:admin',也就是RedirectIfAuthenticated,那么只要修改RedirectIfAuthenticated中间件即可
            public function handle($request, Closure $next, $guard = null)
            {
                if (Auth::guard($guard)->check()) {
                    //return redirect('/home');
                    // 根据不同 guard 跳转到不同的页面
                    $url = $guard ? 'admin/index':'/home';
                    return redirect($url);
                }
                return $next($request);
            }
        11.2.2 如果LoginController中使用的中间件是'guest.admin',那么创建后台管理登录跳转中间件,并注册为guest.admin
            $ php artisan make:middleware GuestAdmin
            public function handle($request, Closure $next)
            {
                if (auth()->guard('admin')->check()) {
                    return redirect('/admin');
                }
                return $next($request);
            }

12、在 app\Http\Kernel.php 中注册中间件:
    protected $routeMiddleware = [
        ******
        'auth.admin' => \App\Http\Middleware\AuthAdmin::class,
        'guest.admin' => \App\Http\Middleware\GuestAdmin::class,
    ];

13、注册路由-- routes/web.php 
    //后台模块
    Route::group(['prefix' => 'admin','namespace' => 'Admin', 'middleware'=>'web'],function ($router){
        $router->get('login', 'LoginController@showLoginForm')->name('admin.login');
        $router->post('login', 'LoginController@login');
        $router->post('logout', 'LoginController@logout')->name('admin.logout');
        $router->get('/', 'AdminController@index');
        $router->get('index', 'AdminController@index');
    });

15、视图文件创建和修改
    复制 views/layouts/app.blade.php  到 views/layouts/admin.blade.php
    复制 views/home.blade.php           到 views/admin/index.blade.php
    复制 views/auth/login.blade.php,   到 views/admin/auth/login.blade.php
    修改表单提交地址
        {{ url('/login') }} 改成 {{ route('admin.login') }}
    修改继承的模板
        @extends('layouts.app') 改成 @extends('layouts.admin')

原创粉丝点击