为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel 7 身份验证尝试

Laravel 7 身份验证尝试

PHP
一只甜甜圈 2023-08-26 17:32:10
根据 Laravel 7.x 文档,我尝试为我的应用程序创建手动身份验证。文档显示如下:<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;class LoginController extends Controller{    public function authenticate(Request $request)    {        $credentials = $request->only('email', 'password');        if (Auth::attempt($credentials)) {            // Authentication passed...            return redirect()->intended('dashboard');        }    }}我有自己的用户表:sys_users==========user_acc character varying(20) NOT NULL, -- Primary Keyfull_name character varying(300) NOT NULL,is_suspended boolean DEFAULT FALSE,CONSTRAINT PK_SysUsers PRIMARY KEY (user_acc),要登录,用户需要输入以下数据:用户名密码访问模块我尝试对控制器进行一些自定义(尚未完成):class LoginController extends Controller{    public function authenticate(Request $request)    {        $request->validate([            'username' => 'required',            'password' => 'required',        ]);                $credentials = $request->only('username', 'password', 'module');        if (Auth::attempt($credentials)) {            return redirect()->route($request->module);        }    }}我想在上面的自定义代码中添加的是:(i)通过查询表来检查用户名是否存在于表中sys_users,(ii)使用POP3检查密码(我已经准备好了phpmailer库和代码),以及( iii)通过查询我准备的另一个表来检查用户是否有权访问这些模块。问题是:我不知道将所有代码放在哪里。如果可能的话,我想将它们放在Auth类的attempt方法中,但我似乎找不到所谓的方法。文档非常缺乏,没有提供详细的解释。如果不知何故无法修改类attempt中的方法Auth,我应该如何进行身份验证过程?
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

您想要做的是实现您自己的用户提供程序,以使用外部 POP3 电子邮件系统验证您的用户凭据。

我不认为您需要自定义您的 Guard,因为我假设您仍然希望StatefulGuard默认的SessionGuardGuard 会检查并存储有关会话中身份验证状态的信息。

我认为除了如何验证所提供的凭据之外,您可能还需要所有其他默认行为。

也许./app/Providers/您可以在文件夹中创建:

PopThreeUserProvider.php

namespace App\Providers;


use Illuminate\Auth\EloquentUserProvider;

use Illuminate\Contracts\Auth\Authenticatable as UserContract;


class PopThreeUserProvider extends EloquentUserProvider

{

    /**

     * Validate a user against the given credentials.

     *

     * @param  \Illuminate\Contracts\Auth\Authenticatable  $user

     * @param  array  $credentials

     * @return bool

     */

    public function validateCredentials(UserContract $user, array $credentials)

    {

        // Implement your pop3 authentication here, I have left the default code

        // for the Eloquent provider below

        $plain = $credentials['password'];


        return $this->hasher->check($plain, $user->getAuthPassword());

    }

}

现在在你的./app/Providers/AuthServiceProvider.php


class AuthServiceProvider extends ServiceProvider

{

    ...


    /**

     * Register any application authentication / authorization services.

     *

     * @return void

     */

    public function boot()

    {

        ...


        Auth::provider('pop3', function ($app, array $config) {

            return new PopThreeUserProvider($app->make('hash'), $config['model']);

        });


        ...

    }


    ...

}

现在在你的config/auth.php:


    ...


    'providers' => [

        'users' => [

            'driver' => 'pop3',

        ],

    ],


    ...

当然,这一切都假设您拥有:


class User extends Authenticatable

{

    protected $table = 'sys_users';

    protected $primaryKey = 'user_acc';

    protected $incrementing = false;

    ...


查看完整回答
反对 回复 2023-08-26
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信