您的位置 首页 技术

laravel如何实现多用户体系登录

laraveli添加一个或多个用户表,以admin为例。 部分文件内容可能需要根据实际情况修改 推荐:laravel教程 创建一个Admin模型 php artisan make:…

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

<?phpnamespace 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,    ]],

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

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

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

使用命令生成一个Request

php artisan make:request AdminLoginRequest

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

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

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

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

添加路由。打开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

<?phpRoute::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复制到resources/views/admin下

把layouts/app.blade.php复制为layouts/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复制到admin/Auth目录下

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

编辑这个文件:

<?phpnamespace 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:adminRoute::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如何实现多用户体系登录的详细内容,更多请关注24课堂在线网其它相关文章!

本文来自网络,不代表24小时课堂在线立场,转载请注明出处:https://www.24ketang.cn/56677.html

为您推荐

返回顶部