laravel实现多用户体系登录的方法
创始人
2024-11-25 10:21:53
0次

laraveli添加一个或多个用户表,以admin为例。

部分文件内容可能需要根据实际情况修改

推荐:laravel教程

创建一个Admin模型

php artisan make:model Admin -m

编写admins表字段

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

编辑admin模型

修改auth.php配置文件

'guards' => [
    ...
    'admin' => [
        'driver' => 'session',
        'provider' => 'admins'
    ]
],
'providers' => [
    ...
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],

在app/Http/Controllers下创建目录Admin/Auth

在Admin目录下创建文件HomeController.php(这个文件用来测试登录成功后的跳转页面)

middleware('auth:admin');
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('admin.home');
    }
}

使用命令生成一个Request

php artisan make:request AdminLoginRequest

此时在app/Http/Request目录下便生成了这个文件,然后编辑这个文件

 'required',
            'password' => ['required', 'min:6'] //密码必须,最小长度为6
        ];
    }
}

在Admin/Auth目录下创建文件LoginController.php

only('name', 'password');
        $result = Auth::guard('admin')->attempt($data, true);
        if ($result) {
            return redirect(route('admin.home'));
        } else {
            return redirect()->back()
                ->with('name', $loginRequest->get('name'))
                ->withErrors(['name' => '用户名或密码错误']);
        }
    }
    public function postLogout()
    {
        Auth::guard('admin')->logout();
        return redirect(route('admin.login.show'));
    }
}

添加路由。打开app/providers/RouteServiceProvider.php

在方法mapWebRoutes()方法后面增加一个方法

protected function mapAdminWebRoutes()
    {
        Route::middleware('web')
            ->prefix('admin')
            ->namespace($this->namespace)
            ->group(base_path('routes/admin.php'));
    }

在map()方法里调用上面增加的方法

public function map()
    {
        $this->mapApiRoutes();
        $this->mapAdminWebRoutes();//调用新增的方法
        $this->mapWebRoutes();
    }

在routes目录下增加一个路由文件admin.php

middleware('guest:admin')
    ->name('admin.login.show');
Route::get('/','Admin\HomeController@index')
    ->name('admin.home');
Route::post('login','Admin\Auth\LoginController@postLogin')
    ->middleware('guest:admin')
    ->name('admin.login.post');
Route::post('logout','Admin\Auth\LoginController@postLogout')
    ->middleware('auth:admin')
    ->name('admin.logout');

把home.blade.php复制到resources/views/admin下

把layouts/app.blade.php复制为layouts/admin.blade.php,修改相应的地方


    
    @guest('admin')
        
  • admin Login
  •     @else                           {{ Auth::guard('admin')->user()->name }}                                
  •                                      Logout                                                       {{ csrf_field() }}                              
  •                   @endguest

    把login.blade.php复制到admin/Auth目录下

    @extends('layouts.admin')
    @section('content')
        
            
                
                    
                        Admin Login
                                                                              {{ csrf_field() }}                             has('name') ? ' has-error' : '' }}">                                 E-Mail Address                                                                                                           @if ($errors->has('name'))                                                                                  {{ $errors->first('name') }}                                                                          @endif                                 
                                
                                has('password') ? ' has-error' : '' }}">                                 Password                                                                                                           @if ($errors->has('password'))                                                                                  {{ $errors->first('password') }}                                                                          @endif                                 
                                
                                                                                                                                               Login                                                                      
                                
                                                 
                    
                
            
         @endsection

    数据填充

    php artisan make:seed AdminsTableSeeder

    编辑AdminsTableSeeder.php

    public function run()
        {
            \App\Admin::insert([
                'name'=>'yzha5',
                'password'=> bcrypt('123456')
            ]);
        }
    DatabaseSeeder.php
    $this->call(AdminsTableSeeder::class);

    文件上传至服务器,登入服务器,执行填充命令

    php artisan migrate
    php artisan db:seed

    此时,直接打开http://xxx/admin并不会跳转到http://xxx/admin/login,因此需要处理一些异常。打开app/Exceptions/Handle.php

    重写unauthenticated()方法。

    use Illuminate\Support\Facades\Route;
    protected function unauthenticated($request, AuthenticationException $exception)
        {
            return starts_with(Route::currentRouteName(), 'admin')
                ? redirect(route('admin.login.show'))
                : parent::unauthenticated($request, $exception);
        }

    完善一下

    以上代码,当admin登录后,再次访问/admin/login这个URI时,会自动跳转到/home这个URI,这是因为guest这个中间件默认跳转到了/home,也就是middleware目录下的RedirectIfAuthenticated.php这个文件。

    解决方法为:

    创建一个中单件,名为:RedirectIfAdminAuthenticated

    php artisan make:middleware RedirectIfAdminAuthenticated

    编辑这个文件:

    check()) {
                return redirect('/admin');
            }
            return $next($request);
        }
    }
    在Kernel.php中添加一行
    protected $routeMiddleware = [
            ...
            'admin.guest' => \App\Http\Middleware\RedirectIfAdminAuthenticated::class,
            ...
        ];
    更改admin路由,将guest:admin改为admin.guest:admin
    Route::get('login','Admin\Auth\LoginController@showLoginForm')
        ->middleware('admin.guest:admin')
        ->name('admin.login.show');
    Route::post('login','Admin\Auth\LoginController@postLogin')
        ->middleware('admin.guest:admin')
        ->name('admin.login.post');

    上一篇:vscode如何修改当前工作区默认文件编码

    下一篇:laravel中间件如何创建

    相关内容

    热门资讯

    空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
    空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
    格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
    空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
    格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
    品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
    空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
    空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
    中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
    中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...