どのようにマルチユーザのログインシステムを実現laravel

例管理者に1つ以上のユーザーテーブルを追加laraveli。

 

ファイルの一部は、実際の状況に応じて変更する必要があります

 

モデル管理者の作成

php artisan make:model Admin -m

書き込みには、フィールドを管理者向け機能します

Schema::create('admins', function (Blueprint $table) {

    $table->increments('id');

    $table->string('name')->unique();

    $table->string('password');

    $table->rememberToken();

    $table->timestamps();

});

編集管理モデル

<?php

namespace App;

use Illuminate\Notifications\Notifiable;

use Illuminate\Foundation\Auth\User as Authenticatable;

/**

 * @property int $id

 * @property \Carbon\Carbon $created_at

 * @property \Carbon\Carbon $updated_at

 */

class Admin extends Authenticatable

{

    use Notifiable;

    protected $fillable = [

        'name', 'password','remember_token'

    ];

    protected $hidden = [

        'password','remember_token'

    ];

}

Auth.php変更の設定ファイル

'guards' => [

    ...

    'admin' => [

        'driver' => 'session',

        'provider' => 'admins'

    ]

],

'providers' => [

    ...

    'admins' => [

        'driver' => 'eloquent',

        'model' => App\Admin::class,

    ]

],

アプリ/ HTTP /コントローラにディレクトリ管理/認証を作成します。

管理ディレクトリ内のファイルHomeController.phpを作成します(このファイルは、ログイン成功後にジャンプページをテストするために使用されます)

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

class HomeController extends Controller

{

    /**

     * HomeController constructor.

     */

    public function __construct()

    {

        $this->middleware('auth:admin');

    }

    /**

     * Show the application dashboard.

     *

     * @return \Illuminate\Http\Response

     */

    public function index()

    {

        return view('admin.home');

    }

}

リクエストを生成するためのコマンドを使用します

php artisan make:request AdminLoginRequest

アプリ/ HTTP /リクエストカタログのこの時点でファイルを生成し、このファイルを編集します

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class AdminLoginRequest extends FormRequest

{

    /**

     * 确定用户是否有权发出此请求.

     *

     * @return bool

     */

    public function authorize()

    {

        return true;

    }

    /**

     * 获取适用于请求的验证规则.

     *

     * @return array

     */

    public function rules()

    {

        return [

            'name'     => 'required',

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

        ];

    }

}

管理/認証ディレクトリ内のファイルLoginController.phpを作成します。

<?php

namespace App\Http\Controllers\Admin\Auth;

use App\Http\Controllers\Controller;

use App\Http\Requests\AdminLoginRequest;

use Illuminate\Support\Facades\Auth;

class LoginController extends Controller

{

    public function showLoginForm()

    {

        return view('admin.auth.login');

    }

    public function postLogin(AdminLoginRequest $loginRequest)

    {

        $data = $loginRequest->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'));

    }

}

ルートを追加します。開き、アプリ/プロバイダ/ RouteServiceProvider.php

方法mapWebRoutes()メソッドでは後者の方法を追加

protected function mapAdminWebRoutes()

    {

        Route::middleware('web')

            ->prefix('admin')

            ->namespace($this->namespace)

            ->group(base_path('routes/admin.php'));

    }

この方法でマップ()メソッドを超えて増加するために呼び出します

public function map()

    {

        $this->mapApiRoutes();

        $this->mapAdminWebRoutes();//调用新增的方法

        $this->mapWebRoutes();

    }

ルートファイルadmin.phpディレクトリにルートを追加します。

<?php

Route::get('login','Admin\Auth\LoginController@showLoginForm')

    ->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コピー

レイアウト/ app.blade.phpコピーは適切な場所を変更し、レイアウト/ admin.blade.phpました

<ul class="nav navbar-nav navbar-right">

    <!-- Authentication Links -->

    @guest('admin')

        <li><a href="{{ route('admin.login.show') }}">admin Login</a></li>

    @else

    <li class="dropdown">

        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false" aria-haspopup="true">

            {{ Auth::guard('admin')->user()->name }} <span class="caret"></span>

        </a>

        <ul class="dropdown-menu">

            <li>

                <a href="{{ route('admin.logout') }}"

                    onclick="event.preventDefault();

                    document.getElementById('logout-form').submit();">

                    Logout

                </a>

                <form id="logout-form" action="{{ route('admin.logout') }}" method="POST" style="display: none;">

                    {{ csrf_field() }}

                </form>

            </li>

        </ul>

    </li>

    @endguest

</ul>

次の管理/認証ディレクトリにlogin.blade.phpをコピーします

@extends('layouts.admin')@section('content')

    <div class="container">

        <div class="row">

            <div class="col-md-8 col-md-offset-2">

                <div class="panel panel-default">

                    <div class="panel-heading">Admin Login</div>

                    <div class="panel-body">

                        <form class="form-horizontal" method="POST" action="{{ route('admin.login.post') }}">

                            {{ csrf_field() }}

                            <div class="form-group{{ $errors->has('name') ? ' has-error' : '' }}">

                                <label for="name" class="col-md-4 control-label">E-Mail Address</label>

                                <div class="col-md-6">

                                    <input id="name" type="text" class="form-control" name="name"

                                           value="{{ old('name') }}" required autofocus>

                                    @if ($errors->has('name'))

                                        <span class="help-block">

                                        <strong>{{ $errors->first('name') }}</strong>

                                    </span>

                                    @endif

                                </div>

                            </div>

                            <div class="form-group{{ $errors->has('password') ? ' has-error' : '' }}">

                                <label for="password" class="col-md-4 control-label">Password</label>

                                <div class="col-md-6">

                                    <input id="password" type="password" class="form-control" name="password" required>

                                    @if ($errors->has('password'))

                                        <span class="help-block">

                                        <strong>{{ $errors->first('password') }}</strong>

                                    </span>

                                    @endif

                                </div>

                            </div>

                            <div class="form-group">

                                <div class="col-md-8 col-md-offset-4">

                                    <button type="submit" class="btn btn-primary">

                                        Login

                                    </button>

                                </div>

                            </div>

                        </form>

                    </div>

                </div>

            </div>

        </div>

    </div>

@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の/管理者はにジャンプしないのhttp:// xxxの/管理/ログインは、いくつかの例外に対処する必要があります。開き、アプリ/例外/ Handle.php

認証されていない()メソッドを書き換えます。

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);

    }

パーフェクトルック

場合は、上記のコード、とき管理者ログイン、訪問再び/管理/ログインこのURIに、自動的にこのURIは、それがあるに/家庭ジャンプしますので、ミドルウェアディレクトリにRedirectIfAuthenticatedされているデフォルトの/ home、このミドルウェアのゲストジャンプ。 PHPファイル。

解決策は以下のとおりです。

単一の部品を作成する、というタイトル:RedirectIfAdminAuthenticated

php artisan make:middleware RedirectIfAdminAuthenticated

 

このファイルを編集します。

<?php

namespace App\Http\Middleware;

use Closure;

use Illuminate\Support\Facades\Auth;

class RedirectIfAdminAuthenticated

{

    /**

     * Handle an incoming request.

     *

     * @param $request

     * @param Closure $next

     * @param null $guard

     * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|mixed

     */

    public function handle($request, Closure $next, $guard = null)

    {

        if (Auth::guard($guard)->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');

これらは、マルチユーザのログインシステムを実現laravel方法の詳細です

より多くの情報を学び、ご覧ください。

テンセントT3-T4標準ブティックDaquanのPHPアーキテクトのチュートリアルディレクトリは、限り、あなたは読んで保証賃金は(継続的に更新された)より高いレベルに上昇します

ヘルプみんなに希望の上に、私はいくつかの情報をコンパイル上昇、を含むを開始する場所を多くのPHPerは、常に先進的な時間内にいくつかの問題やボトルネックが発生し、方向音痴は、私から知っていませんより多くのビジネスコードを書きますこれらに限定されない:分散アーキテクチャ、拡張性の高い、高性能、高同時実行、サーバーのパフォーマンスチューニング、TP6、laravel、YII2、Redisの 、Swoole、Swoft、カフカ、MySQLの最適化、シェルスクリプト、ドッカー、マイクロサービス、nginxの、など高度な乾燥品のために必要な、より高度な知識が共有への皆のための無料することができ、追加する必要が私の公式グループにここに

公開された265元の記事 ウォン称賛36 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43814458/article/details/105203628