美文网首页
用户认证

用户认证

作者: SexyPhoenix | 来源:发表于2019-10-24 10:34 被阅读0次

前期准备

Laravel的权限配置文件位于 config/auth.php,Laravel的认证组件由“guards”和“providers”组成,
Guard 通过 session 来维护用户登录的状态。Provider 是登录以及访问页面的时候获取用户的信息。本篇主要讲的是如何自定义Provider ,获取用户信息。

config/auth.php文件

Laravel提供了两种guard,web以及api,采取默认的web认证。在guards的web中,用了users提供者。接下来就需要注意了,我们自定义了服务提供者,就需要换到新的providers。首先,定义一个使用新驱动的provider:

 'providers' => [
     'users' => [
           'driver' => 'Focus',  //名称自定义,这里为Focus
           'model' => App\Models\User::class,  //Model放在Models文件夹下
      ],
],

Notes: 默认提供了两种驱动database和eloquent,而这两种的提供者分别是DatabaseUserProvider和EloquentUserProvider,都处于laravel\framework\src\Illuminate\Auth文件夹下,实现了UserProvider,我们自定义的 Focus provider 也将实现UserProvider。

生成路由和视图

php artisan make:auth  //命令可快速生成认证所需要的路由和视图

Http/Controllers 和 resources/views下会相应生成控制器和视图
默认用的Email,我们用username

LoginController:
//添加此方法,返回username

public function username(){
    return 'username';
}

login.blade.php:
将邮箱改为域账号,email 改为username

数据库

修改.env配置中的数据库信息。

php artisan make:model Models/User  // 使用命令创建User模型

默认User是继承Model的,需要修改。

use Illuminate\Foundation\Auth\User as Authenticatable;  //引入Authenticatable
class User extends Authenticatable
{
    protected $table      = 'employee';
        protected $primaryKey = 'employee_id';

         //can set all fields to user model
        protected $guarded = [];
}

为什么要引入Authenticatable呢,是因为Authenticatable实现了Illuminate\Contracts\Auth\Authenticatable接口,而FocusUserProvider 需要用到接口的实现。

创建扩展

在app下新建 Extensions/FocusUserProvider 文件,参考DatabaseUserProvider和EloquentUserProvider,实现UserProvider:

namespace App\Extensions;

use App\Services\LdapValidator;
use Illuminate\Support\Str;
use Illuminate\Contracts\Auth\UserProvider;
use \Illuminate\Contracts\Auth\Authenticatable;
    
class LaravelUserProvider implements UserProvider {

    protected $model;

    public function __construct($model)
    {
           $this->model = $model;
    } 
   
   //登录成功后,通过此方法获取用户信息,返回匹配该ID的 Authenticatable 实现
    public function retrieveById($identifier) {
       
      //此处可以将信息放入缓存,缓解数据库压力。
        $model = $this->createModel();
        return $model->newQuery()
            ->where($model->getAuthIdentifierName(), $identifier)
            ->first();
    }

    public function retrieveByToken($identifier, $token) {
    }
    public function updateRememberToken(Authenticatable $user, $token) {
    }

    //该方法可以根据账号名去查询数据库是否存在匹配的账号
    public function retrieveByCredentials(array $credentials) {  

        if (empty($credentials)) {
            return;
        }

        // First we will add each credential element to the query as a where clause.
        // Then we can execute the query and, if we found a user, return it in a
        // Eloquent User "model" that will be utilized by the Guard instances.
        $query = $this->createModel()->newQuery();

         foreach ($credentials as $key => $value) {
            if (! Str::contains($key, 'password')) {
                $query->where($key, $value);
            }
        }

        return $query->first();     
    }
  
   //该方法可以验证密码是否正确,因为我们是ldap登录,可以在此验证域账号
    public function validateCredentials(Authenticatable $user, array $credentials) {
       
      //LdapValidator类是为了验证域密码的,放在了app/Services,在上面已经引入
        $Ldap  = new LdapValidator($user->username, $credentials['password']);
        
        return $Ldap->validatePassword();
    }

    /**
     * Create a new instance of the model.
     *
     * @return \Illuminate\Database\Eloquent\Model
     */
    public function createModel()
    {
        $class = '\\'.ltrim($this->model, '\\');

        return new $class;
    }

}

注册提供者

Laravel 提供了AuthServiceProvider, 我们可以在这里注册。

public function boot()
{
        $this->registerPolicies();
       
       //Focus为auth.php里面定义的驱动
        Auth::provider('Focus', function($app, array $config){

             return new FocusUserProvider ($config['model']);
        });
} 

下面就可以访问http://你的域名/login 登录系统

相关文章

  • Apache用户认证、域名跳转、Apache访问日志

    Apache用户认证 针对目录认证 用户认证 文件认证文件认证 域名跳转 域名跳转 Apache访问日志 Apac...

  • 使用Flask实现用户登陆认证的详细过程

    用户认证的原理 在了解使用Flask来实现用户认证之前,我们首先要明白用户认证的原理。假设现在我们要自己去实现用户...

  • Django-便捷的用户认证系统

    Django默认用户认证系统 Django自带用户认证系统 它处理用户账号、组、权限以及基于cookie的用户会话...

  • django中级 --- 用户认证

    说明 django通过提供User、auth方法实现用户登录认证,权限管理等功能 一:用户认证 用户登录,判断用户...

  • OAuth2 概念学习

    2020-6-1学习 认证(登录) 定义用户认证就是判断一个用户的身份是否合法的过程 身份认证方式用户名密码登录、...

  • Shiro权限管理笔记

    一.用户身份认证 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输...

  • 众签电子签章接入流程

    调用个人用户颁发数字证书接口实现个人用户认证(一个用户只需认证一次) 调用企业用户颁发数字证书实现企业认证(只需认...

  • 用户认证

    Laravel的用户认证只需一行代码即可部署完成。 然后,我们就可以访问指定的路由 我们参看一下 php arti...

  • 用户认证

    what? 用户认证是鉴别用户身份的过程,它通常使用标识符(用户名/有消息)和加密令牌(密码/存取令牌)来鉴别用户...

  • 用户认证

    前期准备 Laravel的权限配置文件位于 config/auth.php,Laravel的认证组件由“guard...

网友评论

      本文标题:用户认证

      本文链接:https://www.haomeiwen.com/subject/iywlyctx.html