ホームページ >PHPフレームワーク >Laravel >laravelでマルチユーザーシステムログインを実装する方法

laravelでマルチユーザーシステムログインを実装する方法

藏色散人
藏色散人転載
2020-03-30 08:56:143244ブラウズ

laraveli は、admin を例として、1 つ以上のユーザー テーブルを追加します。

実際の状況に応じて一部のファイルの内容を変更する必要がある場合があります

推奨: laravel チュートリアル

管理モデルの作成

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 = [
        &#39;name&#39;, &#39;password&#39;,&#39;remember_token&#39;
    ];
    protected $hidden = [
        &#39;password&#39;,&#39;remember_token&#39;
    ];
}

auth.php 構成ファイルの変更

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

app/Http/Controllers の下にディレクトリ Admin/Auth を作成します

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

<?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(&#39;auth:admin&#39;);
    }
    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view(&#39;admin.home&#39;);
    }
}

コマンドを使用してリクエストを生成します

php artisan make:request AdminLoginRequest

この時点では app/Http/Request ディレクトリにこのファイルが生成されるので、このファイルを編集します。

<?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 [
            &#39;name&#39;     => &#39;required&#39;,
            &#39;password&#39; => [&#39;required&#39;, &#39;min:6&#39;] //密码必须,最小长度为6
        ];
    }
}

Admin/Auth ディレクトリにファイル 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(&#39;admin.auth.login&#39;);
    }
    public function postLogin(AdminLoginRequest $loginRequest)
    {
        $data = $loginRequest->only(&#39;name&#39;, &#39;password&#39;);
        $result = Auth::guard(&#39;admin&#39;)->attempt($data, true);
        if ($result) {
            return redirect(route(&#39;admin.home&#39;));
        } else {
            return redirect()->back()
                ->with(&#39;name&#39;, $loginRequest->get(&#39;name&#39;))
                ->withErrors([&#39;name&#39; => &#39;用户名或密码错误&#39;]);
        }
    }
    public function postLogout()
    {
        Auth::guard(&#39;admin&#39;)->logout();
        return redirect(route(&#39;admin.login.show&#39;));
    }
}

を作成して追加します。ルーティング。 app/providers/RouteServiceProvider.phpを開きます。mapWebRoutes()

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

メソッドの後にメソッドを追加します。map()メソッドで上記の追加メソッドを呼び出します。

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

In Addルーティング ファイル admin.php を Routes ディレクトリにコピーします。

<?php
Route::get(&#39;login&#39;,&#39;Admin\Auth\LoginController@showLoginForm&#39;)
    ->middleware(&#39;guest:admin&#39;)
    ->name(&#39;admin.login.show&#39;);
Route::get(&#39;/&#39;,&#39;Admin\HomeController@index&#39;)
    ->name(&#39;admin.home&#39;);
Route::post(&#39;login&#39;,&#39;Admin\Auth\LoginController@postLogin&#39;)
    ->middleware(&#39;guest:admin&#39;)
    ->name(&#39;admin.login.post&#39;);
Route::post(&#39;logout&#39;,&#39;Admin\Auth\LoginController@postLogout&#39;)
    ->middleware(&#39;auth:admin&#39;)
    ->name(&#39;admin.logout&#39;);

home.blade.php を resource/views/admin にコピーします。

layouts/app.blade.php をlayouts/admin .blade にコピーします。 php、対応する場所を変更します

<ul class="nav navbar-nav navbar-right">
    <!-- Authentication Links -->
    @guest(&#39;admin&#39;)
        <li><a href="{{ route(&#39;admin.login.show&#39;) }}">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(&#39;admin&#39;)->user()->name }} <span class="caret"></span>
        </a>
        <ul class="dropdown-menu">
            <li>
                <a href="{{ route(&#39;admin.logout&#39;) }}"
                    onclick="event.preventDefault();
                    document.getElementById(&#39;logout-form&#39;).submit();">
                    Logout
                </a>
                <form id="logout-form" action="{{ route(&#39;admin.logout&#39;) }}" method="POST" style="display: none;">
                    {{ csrf_field() }}
                </form>
            </li>
        </ul>
    </li>
    @endguest
</ul>

login.blade.phpをadmin/Authディレクトリにコピーします

@extends(&#39;layouts.admin&#39;)
@section(&#39;content&#39;)
    <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(&#39;admin.login.post&#39;) }}">
                            {{ csrf_field() }}
                            <div class="form-group{{ $errors->has(&#39;name&#39;) ? &#39; has-error&#39; : &#39;&#39; }}">
                                <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(&#39;name&#39;) }}" required autofocus>
                                    @if ($errors->has(&#39;name&#39;))
                                        <span class="help-block">
                                        <strong>{{ $errors->first(&#39;name&#39;) }}</strong>
                                    </span>
                                    @endif
                                </div>
                            </div>
                            <div class="form-group{{ $errors->has(&#39;password&#39;) ? &#39; has-error&#39; : &#39;&#39; }}">
                                <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(&#39;password&#39;))
                                        <span class="help-block">
                                        <strong>{{ $errors->first(&#39;password&#39;) }}</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([
            &#39;name&#39;=>&#39;yzha5&#39;,
            &#39;password&#39;=> bcrypt(&#39;123456&#39;)
        ]);
    }
DatabaseSeeder.php
$this->call(AdminsTableSeeder::class);

ファイルをサーバーにアップロードし、サーバーにログインし、fill コマンドを実行します。

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(), &#39;admin&#39;)
            ? redirect(route(&#39;admin.login.show&#39;))
            : parent::unauthenticated($request, $exception);
    }

上記のコードを改善します。管理者がログインして URI /admin/login に再度アクセスすると、自動的に URI /home にジャンプします。これはゲスト ミドルウェアのためです。デフォルトでは、ジャンプします。 /home (ミドルウェア ディレクトリ内のファイル RedirectIfAuthenticated.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(&#39;/admin&#39;);
        }
        return $next($request);
    }
}
在Kernel.php中添加一行
protected $routeMiddleware = [
        ...
        &#39;admin.guest&#39; => \App\Http\Middleware\RedirectIfAdminAuthenticated::class,
        ...
    ];
更改admin路由,将guest:admin改为admin.guest:admin
Route::get(&#39;login&#39;,&#39;Admin\Auth\LoginController@showLoginForm&#39;)
    ->middleware(&#39;admin.guest:admin&#39;)
    ->name(&#39;admin.login.show&#39;);
Route::post(&#39;login&#39;,&#39;Admin\Auth\LoginController@postLogin&#39;)
    ->middleware(&#39;admin.guest:admin&#39;)
    ->name(&#39;admin.login.post&#39;);

以上がlaravelでマルチユーザーシステムログインを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。