资讯专栏INFORMATION COLUMN

laravel框架学习之路(一)前后台用户认证分离

Joonas / 467人阅读

摘要:防止前台用户注销的时候清除后台用户的。框架自带用户认证在注销时会清空所有重写前台注销操作至此,后台用户登录全部完成。

准备工作:
1、下载laravel框架
2、配置好项目(数据库连接以及虚拟主机)

开始:
前台用户认证laravel已经为我们写好了,此部分可参考官方文档

创建模型(以adminstrator为例)

php artisan make:model Models/Adminstrator -m 

编写administrator表迁移

Schema::create("administrators", function (Blueprint $table) {
    $table->engine = "InnoDB";
    $table->increments("id");
    $table->string("login_name")->unique();
    $table->string("display_name")->nullable();
    $table->string("password");
    $table->string("avatar")->nullable();
    $table->rememberToken();
    $table->tinyInteger("status")->default(1);
    $table->timestamps();
});

编写administrator模型


创建后台配置文件admin.php,在return数组中写入

"auth" => [
    "guards" => [
        "administrator" => [
            "driver"   => "session",
            "provider" => "administrators",
        ],
    ],

    "providers" => [
        "administrators" => [
            "driver" => "eloquent",
            "model"  => AppModelsAdministrator::class,
        ],
    ],
],

创建后台用户认证中间件Authenticate,运行:

php artisan make:middleware Admin/Authenticate

修改handle方法:

guest() && !$this->shouldPassThrough($request)) {
            return redirect()->guest(admin_base_path("login"));
        }
        return $next($request);
    }

    /**
     * Determine if the request has a URI that should pass through verification.
     *
     * @param IlluminateHttpRequest $request
     *
     * @return bool
     */
    protected function shouldPassThrough($request)
    {
        $excepts = [
            admin_base_path("login"),
            admin_base_path("logout"),
        ];
        foreach ($excepts as $except) {
            if ($except !== "/") {
                $except = trim($except, "/");
            }
            if ($request->is($except)) {
                return true;
            }
        }
        return false;
    }
}

创建AdminServiceProvider,运行:

php artisan make:provider AdminServiceProvider

编写:

 AppHttpMiddlewareAdminAuthenticate::class,
        "admin.pjax" => SpatiePjaxMiddlewareFilterIfPjax::class,
        "admin.log" => AppHttpMiddlewareAdminLogOperation::class,
    ];

    /**
     * 中间件组
     * @var array
     */
    protected $middlewareGroups = [
        "admin" => [
            "admin.auth",
            "admin.pjax",
            "admin.log",
        ],
    ];

    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        if (file_exists($routes = base_path("routes/admin.php"))) {
            $this->loadRoutesFrom($routes);
        }
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->loadAdminAuthConfig();

        $this->registerRouteMiddleWare();
    }

    /**
     * 注册路由中间件
     */
    public function registerRouteMiddleWare()
    {
        // 注册路由中间件
        foreach ($this->routeMiddleware as $key => $middleware) {
            app("router")->aliasMiddleware($key, $middleware);
        }

        // 注册路由中间件组
        foreach ($this->middlewareGroups as $key => $middleware) {
            app("router")->middlewareGroup($key, $middleware);
        }
    }

    /**
     * Setup auth configuration.
     *
     * @return void
     */
    protected function loadAdminAuthConfig()
    {
        config(array_dot(config("admin.auth", []), "auth."));
    }
}

config/app.php中注册provider和facades

"providers" => [
    ...,
    AppProvidersAdminServiceProvider::class,
]

"aliases" => [
    ...,
    "Admin" => AppFacadesAdminAdmin::class,
]

创建登录表单验证类,运行:

php artisan make:request AdministratorLoginRequest

重写其父类rulesmessages方法:

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

    public function messages()
    {
        return [
            "login_name.required" => "请输入用户名",
            "password.required" => "请输入密码",
            "password.min" => "密码至少6位",
        ];
    }
}

创建登录控制器,运行:

php artisan make:controller Admin/Auth/LoginController

编写登录方法:

guest()) {
            return redirect(config("admin.route.prefix"));
        }

        return view(admin_view_base_path("auth.login.index"));
    }

    /**
     * 登录操作
     * @param AdministratorLoginRequest $loginRequest
     * @return IlluminateHttpRedirectResponse|IlluminateRoutingRedirector
     */
    public function postLogin(AdministratorLoginRequest $loginRequest)
    {
        $postData = $loginRequest->only("login_name", "password", "remember");

        $result = Auth::guard("administrator")->attempt($postData, $loginRequest->filled("remember"));

        if ($result) {
            admin_toast("登录成功");
            $loginRequest->session()->regenerate();
            return redirect()->intended(config("admin.route.prefix"));
        }else{
            return redirect()->back()->withInput()
                ->withErrors([
                    "login_name" => "用户名或密码错误"
                ]);
        }
    }

    /**
     * 注销登录
     * @return IlluminateHttpRedirectResponse|IlluminateRoutingRedirector
     */
    public function postLogout()
    {
        Auth::guard("administrator")->logout();

        session()->forget("url.intented");

        return redirect(config("admin.route.prefix"));
    }
}

至此,认证业务已经完成,接下来进行完善,使系统能够跑起来

创建视图文件(ps:1、控制器中使用的admin_view_base_path为自定义函数,指向后台视图文件主目录。2、视图采用AdminLTE框架)
login.blade:form

@csrf
@if ($errors->has("login_name")) {{ $errors->first("login_name") }} @endif
@if ($errors->has("password")) {{ $errors->first("password") }} @endif

创建后台home控制器,运行:

php artisan make:controller Admin/Home/HomeController

编写index方法返回视图


若仅作登录之后跳转测试,home视图中保留注销按钮即可,例:
home.blade



编辑配置文件config.admin.php,加入以下配置:

"route" => [
    "prefix" => "admin",

    "namespace" => "AppHttpControllersAdmin",

    "middleware" => ["web", "admin"],
],

编写路由文件routes/admin.php

 config("admin.route.prefix"),
    "namespace"     => config("admin.route.namespace"),
    "middleware"    => config("admin.route.middleware"),
], function (Router $router) {
    $router->get("/", "HomeHomeController@index");
    $router->get("login", "AuthLoginController@getLoginForm");
    $router->post("login", "AuthLoginController@postLogin");
    $router->post("logout", "AuthLoginController@postLogout");
});

数据表迁移与填充: 修改database/seeds/DatabaseSeeder

call(UsersTableSeeder::class);
        DB::table("administrators")->insert(
            [
                "login_name" => "admin",
                "display_name" => "超级管理员",
                "password" => bcrypt("123456"),
                "created_at" => date("Y-m-d H:i:s", time()),
                "updated_at" => date("Y-m-d H:i:s", time()),
            ]
        );
    }
}

运行:

php artisan migrate //数据表迁移
php artisan db:seed //数据填充

如果前台使用了laravel框架用户认证的话,需要重写框架生成的LoginControllerlogout方法。防止前台用户注销的时候清除后台用户的session。(ps:框架自带用户认证在注销时会清空所有session)

/**
 * 重写前台注销操作
 * @param Request $request
 * @return IlluminateHttpRedirectResponse|IlluminateRoutingRedirector
 */
public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->forget("uri.intented");

    return redirect("/");
}

至此,后台用户登录全部完成。enjoy it!

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

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

相关文章

  • laravel框架学习之路(二)pjax的使用

    摘要:继第一篇文章发布之后框架学习之路一前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的框架学习之路。附件笔者的布局全局文件整页刷新时,菜单显示删除按钮确定删除此项确定取消 继第一篇文章发布之后laravel框架学习之路(一)前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的laravel框架学习之路。如需...

    lily_wang 评论0 收藏0
  • laravel框架学习之路(二)pjax的使用

    摘要:继第一篇文章发布之后框架学习之路一前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的框架学习之路。附件笔者的布局全局文件整页刷新时,菜单显示删除按钮确定删除此项确定取消 继第一篇文章发布之后laravel框架学习之路(一)前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的laravel框架学习之路。如需...

    gotham 评论0 收藏0
  • laravel框架学习之路(二)pjax的使用

    摘要:继第一篇文章发布之后框架学习之路一前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的框架学习之路。附件笔者的布局全局文件整页刷新时,菜单显示删除按钮确定删除此项确定取消 继第一篇文章发布之后laravel框架学习之路(一)前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的laravel框架学习之路。如需...

    vvpale 评论0 收藏0
  • 学习 Lumen 用户认证 ()

    摘要:在开发中,用户认证是核心,是数据是否有保障的前提,目前主要有两种常用方式进行用户认证和。附是为了在网络应用环境间传递声明而执行的一种基于的开放标准。 好久没写 PHP 代码了,尤其是 Lumen,我是 Lumen 的忠实用户,自从面世开始,我就将 Lumen 作为我 API 的主要框架使用。 但说到 API,不得不说的一个概念:「前后端分离」,现在越来越多的团队都采用前后端分离,彻底解...

    wangzy2019 评论0 收藏0
  • Laravel核心解读--Contracts契约

    摘要:的契约是一组定义框架提供的核心服务的接口,例如我们在介绍用户认证的章节中到的用户看守器契约和用户提供器契约以及框架自带的模型所实现的契约。接口与团队开发当你的团队在开发大型应用时,不同的部分有着不同的开发速度。 Contracts Laravel 的契约是一组定义框架提供的核心服务的接口, 例如我们在介绍用户认证的章节中到的用户看守器契约IllumninateContractsAuth...

    Prasanta 评论0 收藏0

发表评论

0条评论

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