search
HomePHP FrameworkLaravelHow to implement multi-user system login in laravel

laraveli adds one or more user tables, taking admin as an example.

Some file contents may need to be modified according to the actual situation

Recommended: laravel tutorial

Create an Admin model

php artisan make:model Admin -m

Write admins Table fields

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

Edit admin model

<?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;
    ];
}

Modify the auth.php configuration file

&#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,
    ]
],

Create the directory Admin/Auth under app/Http/Controllers

Create the file HomeController.php in the Admin directory (this file is used to test the jump page after successful login)

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

Use the command to generate a Request

php artisan make:request AdminLoginRequest

At this time in app/Http/Request This file is generated in the directory, and then edit this file

<?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
        ];
    }
}

Create the file 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;));
    }
}

in the Admin/Auth directory to add routing. Open app/providers/RouteServiceProvider.php

Add a method after the method mapWebRoutes()

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

Call the above added method in the map() method

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

In Add a routing file admin.php to the routes directory

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

Copy home.blade.php to resources/views/admin

Copy layouts/app.blade.php to layouts/admin .blade.php, modify the corresponding place

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

Copy login.blade.php to the admin/Auth directory

@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

Data filling

php artisan make:seed AdminsTableSeeder

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

Upload the file to the server, log in to the server, and execute the fill command

php artisan migrate
php artisan db:seed

At this time, opening http://xxx/admin directly will not jump to http://xxx/admin/ login, so some exceptions need to be handled. Open app/Exceptions/Handle.php

Rewrite the unauthenticated() method.

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

Improve the above code. When the admin logs in and accesses the URI /admin/login again, it will automatically jump to the URI /home. This is because of the guest middleware. By default, it jumps to /home, which is the file RedirectIfAuthenticated.php in the middleware directory.

The solution is:

Create a single file named: RedirectIfAdminAuthenticated

php artisan make:middleware RedirectIfAdminAuthenticated

Edit this file:

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

The above is the detailed content of How to implement multi-user system login in laravel. For more information, please follow other related articles on the PHP Chinese website!

Statement
This article is reproduced at:segmentfault. If there is any infringement, please contact admin@php.cn delete
Collaborative Document Editing: Streamlining Workflow in Distributed TeamsCollaborative Document Editing: Streamlining Workflow in Distributed TeamsApr 27, 2025 am 12:21 AM

Collaborative document editing is an effective tool for distributed teams to optimize their workflows. It improves communication and project progress through real-time collaboration and feedback loops, and common tools include Google Docs, Microsoft Teams, and Notion. Pay attention to challenges such as version control and learning curve when using it.

How long will the previous Laravel version be supported?How long will the previous Laravel version be supported?Apr 27, 2025 am 12:17 AM

ThepreviousversionofLaravelissupportedwithbugfixesforsixmonthsandsecurityfixesforoneyearafteranewmajorversion'srelease.Understandingthissupporttimelineiscrucialforplanningupgrades,ensuringprojectstability,andleveragingnewfeaturesandsecurityenhancemen

Leveraging Laravel's Features for Both Frontend and Backend DevelopmentLeveraging Laravel's Features for Both Frontend and Backend DevelopmentApr 27, 2025 am 12:16 AM

Laravelcanbeeffectivelyusedforbothfrontendandbackenddevelopment.1)Backend:UtilizeLaravel'sEloquentORMforsimplifieddatabaseinteractions.2)Frontend:LeverageBladetemplatesforcleanHTMLandintegrateVue.jsfordynamicSPAs,ensuringseamlessfrontend-backendinteg

Can Laravel be used for Full Stack Development (Frontend   Backend)?Can Laravel be used for Full Stack Development (Frontend Backend)?Apr 27, 2025 am 12:10 AM

Laravelcanbeusedforfullstackdevelopment.1)BackendmasterywithLaravel'sexpressivesyntaxandfeatureslikeEloquentORMfordatabasemanagement.2)FrontendintegrationusingBladefordynamicHTMLtemplates.3)EnhancingfrontendwithLaravelMixforassetcompilation.4)Fullsta

What tools help with upgrading to the latest Laravel version?What tools help with upgrading to the latest Laravel version?Apr 27, 2025 am 12:02 AM

Answer: The best tools for upgrading Laravel include Laravel's UpgradeGuide, LaravelShift, Rector, Composer, and LaravelPint. 1. Use Laravel's UpgradeGuide as the upgrade roadmap. 2. Use LaravelShift to automate most of the upgrade work, but it requires manual review. 3. Automatically refactor the code through Rector, and you need to understand and possibly customize its rules. 4. Use Composer to manage dependencies and pay attention to possible dependency conflicts. 5. Run LaravelPint to maintain code style consistency, but it does not solve the functional problems.

Beyond the Zoom Call: Creative Strategies for Connecting Distributed TeamsBeyond the Zoom Call: Creative Strategies for Connecting Distributed TeamsApr 26, 2025 am 12:24 AM

ToenhanceengagementandcohesionamongdistributedteamsbeyondZoom,implementthesestrategies:1)Organizevirtualcoffeebreaksforinformalchats,2)UseasynchronoustoolslikeSlackfornon-workdiscussions,3)Introducegamificationwithteamgamesorchallenges,and4)Encourage

What are the breaking changes in the latest Laravel version?What are the breaking changes in the latest Laravel version?Apr 26, 2025 am 12:23 AM

Laravel10introducesseveralbreakingchanges:1)ItrequiresPHP8.1orhigher,2)TheRouteServiceProvidernowusesabootmethodforloadingroutes,3)ThewithTimestamps()methodonEloquentrelationshipsisdeprecated,and4)TheRequestclassnowpreferstherules()methodforvalidatio

The Productivity Paradox: Maintaining Focus and Motivation in Remote SettingsThe Productivity Paradox: Maintaining Focus and Motivation in Remote SettingsApr 26, 2025 am 12:17 AM

Tomaintainfocusandmotivationinremotework,createastructuredenvironment,managedigitaldistractions,fostermotivationthroughsocialinteractionsandgoalsetting,maintainwork-lifebalance,anduseappropriatetechnology.1)Setupadedicatedworkspaceandsticktoaroutine.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 English version

SublimeText3 English version

Recommended: Win version, supports code prompts!

mPDF

mPDF

mPDF is a PHP library that can generate PDF files from UTF-8 encoded HTML. The original author, Ian Back, wrote mPDF to output PDF files "on the fly" from his website and handle different languages. It is slower than original scripts like HTML2FPDF and produces larger files when using Unicode fonts, but supports CSS styles etc. and has a lot of enhancements. Supports almost all languages, including RTL (Arabic and Hebrew) and CJK (Chinese, Japanese and Korean). Supports nested block-level elements (such as P, DIV),

EditPlus Chinese cracked version

EditPlus Chinese cracked version

Small size, syntax highlighting, does not support code prompt function

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Integrate Eclipse with SAP NetWeaver application server.