Laravel 7 身份验证尝试

根据 Laravel 7.x 文档,我尝试为我的应用程序创建手动身份验证。文档显示如下:


<?php


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

full_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)通过查询我准备的另一个表来检查用户是否有权访问这些模块。

问题是:

  1. 我不知道将所有代码放在哪里。如果可能的话,我想将它们放在Auth类的attempt方法中,但我似乎找不到所谓的方法。文档非常缺乏,没有提供详细的解释。

  2. 如果不知何故无法修改类attempt中的方法Auth,我应该如何进行身份验证过程?


一只甜甜圈
浏览 107回答 1
1回答

jeck猫

您想要做的是实现您自己的用户提供程序,以使用外部 POP3 电子邮件系统验证您的用户凭据。我不认为您需要自定义您的 Guard,因为我假设您仍然希望StatefulGuard默认的SessionGuardGuard 会检查并存储有关会话中身份验证状态的信息。我认为除了如何验证所提供的凭据之外,您可能还需要所有其他默认行为。也许./app/Providers/您可以在文件夹中创建:PopThreeUserProvider.phpnamespace 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.phpclass 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;    ...
打开App,查看更多内容
随时随地看视频慕课网APP