资讯专栏INFORMATION COLUMN

laravel 实现多用户体系登录

xuweijian / 712人阅读

摘要:添加一个或多个用户表,以为例。。完善一下以上代码,当登录后,再次访问这个时,会自动跳转到这个,这是因为这个中间件默认跳转到了,也就是目录下的这个文件。

laraveli添加一个或多个用户表,以admin为例。。
部分文件内容可能需要根据实际情况修改

创建一个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" => AppAdmin::class,
    ]
],

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

middleware("auth:admin");
    }

    /**
     * Show the application dashboard.
     *
     * @return IlluminateHttpResponse
     */
    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("/","AdminHomeController@index")
    ->name("admin.home");

Route::post("login","AdminAuthLoginController@postLogin")
    ->middleware("guest:admin")
    ->name("admin.login.post");

Route::post("logout","AdminAuthLoginController@postLogout")
    ->middleware("auth:admin")
    ->name("admin.logout");

home.blade.php复制到resources/views/admin
layouts/app.blade.php复制为layouts/admin.blade.php,修改相应的地方

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

@extends("layouts.admin")

@section("content")
    
Admin Login
{{ csrf_field() }}
@if ($errors->has("name")) {{ $errors->first("name") }} @endif
@if ($errors->has("password")) {{ $errors->first("password") }} @endif
@endsection

数据填充

php artisan make:seed AdminsTableSeeder

编辑AdminsTableSeeder.php

public function run()
    {
        AppAdmin::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 IlluminateSupportFacadesRoute;

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" => AppHttpMiddlewareRedirectIfAdminAuthenticated::class,
        ...
    ];

更改admin路由,将guest:admin改为admin.guest:admin

Route::get("login","AdminAuthLoginController@showLoginForm")
    ->middleware("admin.guest:admin")
    ->name("admin.login.show");
Route::post("login","AdminAuthLoginController@postLogin")
    ->middleware("admin.guest:admin")
    ->name("admin.login.post");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28235.html

相关文章

  • 打通Laravel和Yii2任督二脉

    摘要:于是直接暴力开干,找说明书查询。测试登录,果然不通。一般情况下,这时候应该遵照官方手册,开始建立自己相配套的数据库体系。数据库是连通了,出现了熟悉的错误找不到表。登入登出完全正常,终于可以和和和美美地住在一个小房子里了。 Yii2与Laravel相爱相杀已经很久了,导致广大PHP爱好者必须选边站队,生怕自己站错了阵营。作为一个已经上了Yii2贼船很久的人想换船是需要很大勇气的,能不能就...

    kohoh_ 评论0 收藏0
  • Laravel 教程 - 实战 iBrand 开源电商 API 系统

    摘要:最佳实践良好的编码规范单元测试持续集成文档,从一开始就形成良好的编码习惯。真实的电商业务所有的业务需求来自真实的客户,并且线上良好运营中。 重要通知: Laravel + 小程序的开源电商版本源码已经在 github 上拉,欢迎提交 issue 和 star :) 开源电商 Server 端: Laravel API源码 开源电商 client 端:小程序源码 iBrand 简介...

    iOS122 评论0 收藏0
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器

    摘要:别堵塞了传输层大多数事件处理器被当作传输层组件。解耦事件处理器开始本命题前,我们来使用一个示例。假想下把队列处理器用来发送消息给用户。尽量避免在事件处理器中掺杂太多的业务逻辑。 声明:本文并非博主原创,而是来自对《Laravel 4 From Apprentice to Artisan》阅读的翻译和理解,当然也不是原汁原味的翻译,能保证90%的原汁性,另外因为是理解翻译,肯定会有错误的...

    HackerShell 评论0 收藏0
  • Wizard 开源文档管理系统1.0发布啦

    摘要:总结如果你在为公司寻找一款开源免费的开发文档文档管理工具,不妨考虑一下项目,一定不会让你失望的。 Wizard 是一款开源文档管理系统,项目地址为 https://github.com/mylxsw/wizard。这个项目是 我 在2017年就开始开发的,起初只是想做一款能够在公司内部把Swagger文档管理起来的工具,但在这近两年的时间里,一直断断续续的为其添加各种功能,现在终于下决...

    cod7ce 评论0 收藏0
  • Laravel框架的体系结构

    摘要:开发人员可以通过命令行工具生成和管理项目环境。附带了一个名为的优秀的命令行工具它提供了一些开发过程中有用的命令用,可以用来生成框架代码和数据库管理。这就是的目录结构发挥作用的地方。 Laravel被称为全栈式框架,因为它能够处理从网络服务到数据库管理、HTML生成的一切事情,垂直集成的web开发环境给开发者提供了更好的体验。 开发人员可以通过命令行工具,生成和管理Laravel项目环...

    ACb0y 评论0 收藏0

发表评论

0条评论

xuweijian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<