assin/php-auth

此包的最新版本(v1.0.0)没有可用的许可证信息。

v1.0.0 2020-06-21 08:09 UTC

This package is auto-updated.

Last update: 2024-09-21 20:33:28 UTC


README

一个用于处理PHP中用户身份验证的简单包。

特性列表

  • 注册自定义驱动程序以处理身份验证
  • 通过定义中间件在调用身份验证方法之前检查请求

安装

使用composer管理您的依赖关系并下载PHPAuth

composer require assin/php-auth

用法

  • 创建实现DriverInterface接口的驱动程序。
<?php

require 'vendor/autoload.php';

class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface
{
    public function login(\Assin\PHPAuth\ObjectValue\Input $input)
    {
        if($input->get('username') === 'test' && $input->get('password') === 'test'){
            return 'Success!';
        }
        return 'Failed!';
    }
}
  • 将驱动程序注册到DriverBuilder。
$driver = new SimpleDriver();

$driverId = 1;

$driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([
    $driverId=>$driver
]);
  • 初始化请求数据。
$input = new \Assin\PHPAuth\ObjectValue\Input([
    'username'=>'test',
    'password'=>'test'
]);
  • 配置身份验证类。
$auth = new \Assin\PHPAuth\Auth($driverBuilder);

print_r($auth->login($driverId, $input));

完整示例 1

<?php

require 'vendor/autoload.php';

class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface
{
    public function login(\Assin\PHPAuth\ObjectValue\Input $input)
    {
        if($input->get('username') === 'test' && $input->get('password') === 'test'){
            return 'Success!';
        }
        return 'Failed!';
    }
}

$driver = new SimpleDriver();

$driverId = 1;

$driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([
    $driverId=>$driver
]);

$input = new \Assin\PHPAuth\ObjectValue\Input([
    'username'=>'test',
    'password'=>'test'
]);

$auth = new \Assin\PHPAuth\Auth($driverBuilder);

print_r($auth->login($driverId, $input));

?>

注意:您可以根据业务请求注册多个驱动程序并更改身份验证行为!

多个驱动程序示例 2

<?php

require 'vendor/autoload.php';

class SimpleDriver implements \Assin\PHPAuth\Contracts\DriverInterface
{
    public function login(\Assin\PHPAuth\ObjectValue\Input $input)
    {
        if($input->get('username') === 'test' && $input->get('password') === 'test'){
            return 'Successful!';
        }
        return 'Failed!';
    }
}


class SimpleDriver2 implements \Assin\PHPAuth\Contracts\DriverInterface
{
    public function login(\Assin\PHPAuth\ObjectValue\Input $input)
    {
        if($input->get('username') === 'test' && $input->get('password') === 'test'){
            return ['status'=>true, 'message'=>'Successful!'];
        }
        return ['status'=>false, 'message'=>'Failed!'];
    }
}

$driverBuilder = new \Assin\PHPAuth\Builder\DriverBuilder([
    1=>new SimpleDriver(),
    2=>new SimpleDriver2()
]);



$input = new \Assin\PHPAuth\ObjectValue\Input([
    'username'=>'test',
    'password'=>'test'
]);

$auth = new \Assin\PHPAuth\Auth($driverBuilder);

//Print driver 1 respond
print_r($auth->login(1, $input));
print PHP_EOL;
//Print driver 2 respond
print_r($auth->login(2, $input));

中间件示例

  • 创建简单的中间件。
Class SimpleMiddleware implements \Assin\PHPAuth\Contracts\MiddlewareInterface{

    public function handle(\Assin\PHPAuth\ObjectValue\Input $input, \Closure $next)
    {
        if($input->get('username') === 'test'){
            throw new Exception('The user is banned');
        }
        $next($input);
    }
}
  • 将中间件注册到middleware/kernel并调用登录。
$auth = new \Assin\PHPAuth\Auth($driverBuilder, new \Assin\PHPAuth\Middleware\Kernel([
    new SimpleMiddleware()
]));

try {
    print_r($auth->login(1, $input));
}catch (\Exception $exception){
    print $exception->getMessage();
}

JWT驱动程序

JWT驱动程序使用lcobucci/jwt包通过Authorization头部参数进行身份验证。我们必须实现一些接口来使用此驱动程序。

实现UserRepositoryInterface类此接口查找用户并返回一个实现UserInterface的对象。

<?php

use Assin\PHPAuth\Auth;
use Assin\PHPAuth\Builder\DriverBuilder;
use Assin\PHPAuth\Config\Config;
use Assin\PHPAuth\Contracts\UserInterface;
use Assin\PHPAuth\Contracts\UserRepositoryInterface;
use Assin\PHPAuth\Drivers\JWT\Config as JWTConfig;
use Assin\PHPAuth\Drivers\JWT\JWTDriver;
use Assin\PHPAuth\Drivers\JWT\Response;
use Assin\PHPAuth\ObjectValue\Input;

require 'vendor/autoload.php';


class SimpleUserRepository implements UserRepositoryInterface {

    public function findForLogin(Input $input) : UserInterface{
        $userId = $input->get('username')=='1234' && $input->get('password')=='1234' ? 1 : 0;
        return new \Assin\PHPAuth\Drivers\JWT\User($userId);
    }

    public function findForForgetPassword(Input $input) : UserInterface{
        $userId = $input->get('username')=='1234' ? 1 : 0;
        return new \Assin\PHPAuth\Drivers\JWT\User($userId);
    }
}


$userRepository = new SimpleUserRepository();

$driverId = Config::DRIVER_JWT;
$JWTDriver = new JWTDriver(new JWTConfig(), $userRepository);

$driverBuilder = new DriverBuilder([$driverId => $JWTDriver]);

$input = new Input(['username'=>'1234', 'password'=>'1234']);

/** @var Response $response */
$response = (new Auth($driverBuilder))->login($driverId, $input);

$token = $response->getData()['token'];

print_r($token);

JWT驱动程序 - 创建访客令牌

<?php

require 'vendor/autoload.php';

$JWTDriver = new \Assin\PHPAuth\Drivers\JWT\JWTDriver();
$token = $JWTDriver->createToken();

print_r($JWTDriver->plainToken($token, true));

JWT驱动程序 - 刷新令牌

<?php

require 'vendor/autoload.php';

$oldToken = 'Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJqdGkiOiI0ZjFnMjNhMTJhYSIsImlhdCI6MTU5MjExNDczMywiZXhwIjoxNTkyMTE4MzMzLCJ1c2VyX2luZm8iOnsiaWQiOjF9fQ.gLhkKVtSjx5pDLX973grZ94CHKv5gsYw99sfeX5XzQs';
$JWTDriver = new \Assin\PHPAuth\Drivers\JWT\JWTDriver();
$token = $JWTDriver->parseToTokenObject($oldToken);
$newToken = $JWTDriver->refreshToken($token);

print_r($JWTDriver->plainToken($newToken, true));