m7/iam

M7 s.r.o. 开发的 Laravel 6+ IAM 封装器

安装: 53

依赖: 0

建议: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:封装器

0.2.0 2019-10-28 13:02 UTC

This package is auto-updated.

Last update: 2024-09-29 00:01:50 UTC


README

本软件包为 Laravel 6+ 应用程序中与 M7 s.r.o. 创建的 IAM 进行通信的简单封装器。

安装

  1. 使用 composer 安装:composer require m7/iam
  2. 运行迁移:php artisan migrate - 这将在 users 表中创建(或更新)一些字段,用于将您的用户与 IAM 配对
    1. iam_uid
    2. name
    3. surname
    4. email
  3. 从本软件包生成的迁移字段应添加到您的 User 模型的 fillable 属性中,如下所示
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use Authenticatable;
    
        protected $fillable = ['iam_uid', 'name', 'surname', 'email', 'password'];
    }
  4. 接下来,您应该在您的用户模型中使用 Iam 特性
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use m7\Iam\Traits\Iam;
    
    class User extends Authenticatable
    {
        use Authenticatable, Iam;
    
        protected $fillable = ['iam_uid', 'name', 'surname', 'email', 'password'];
    }

配置

.env 值

IAM_MANAGER_SERVER=https://server.url
IAM_MANAGER_CLIENT_ID=xxx
IAM_MANAGER_CLIENT_SECRET=xxx
IAM_MANAGER_REDIRECT_URL=/ # redirect after login
IAM_MANAGER_REDIRECT_CALLBACK=/ # redirect after logout
IAM_MANAGER_PUBLIC_KEY=auth.pub # relative path from root of the project to public key file

注意 公钥文件也应包含在您的 .gitignore 文件中,出于安全考虑

中间件

中间件设置不是必需的,但非常有用。您也可以使用此软件包中的方法创建自己的中间件

IAM 范围

您可以将此软件包中提供的中间件注册为中间件,以根据 IAM 中分配给用户的范围保护某些路由或路由组。

为此,请在您的 app/Http/Kernel.php 中注册 IamScopes 中间件

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;
use m7\Iam\Http\Middleware\IamScopes;

class Kernel extends HttpKernel 
{
    ...
    protected $routeMiddleware = [
        ...
        'iam.scopes' => IamScopes::class,
        ...
    ];
    ...
}

IAM 认证

IAM 认证中间件用于保护您希望限制访问的路由。这种限制基于从 IAM 获取有效的访问令牌。

要注册 IAM 认证中间件,请在您的 app/Http/Kernel.php 中注册 IamAuth 中间件类

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;
use m7\Iam\Http\Middleware\IamAuth;

class Kernel extends HttpKernel 
{
    ...
    protected $routeMiddleware = [
        ...
        'iam.auth' => IamAuth::class,
        ...
    ];
    ...
}

用法

基本

如果您需要,您可以通过辅助函数 iam_manager() 获取 iam 管理器类的实例。

创建了两个路由用于登录和注销。您可以自由使用自己的路由和功能,但推荐使用这些路由来记录用户的登录和注销。

Route::post('iam/login', 'm7\Iam\Http\Controllers\LoginController@login')->name('iam.manager.login');
Route::post('iam/logout', 'm7\Iam\Http\Controllers\LoginController@logout')->name('iam.manager.logout');

iam.manager.login 路由的请求体应包含 usernamepassword 键及其对应的值。

或者,如果您出于某种原因不希望使用这些特定的路由,您可以通过管理辅助实例方法 iam_manager()->login($username, $password)iam_manager()->logout() 来登录和注销用户

iam_manager()->login 方法在成功登录时返回 User 模型实例,否则返回 false

特性方法

如果您成功将 Iam 特性添加到用户模型中,您现在可以访问几个方法

Auth::user()->getScopes() // get all scopes assigned to this user
Auth::user()->hasScope($scope) // check if user has certain scope ($scope can also be array, that way you can check if user has multiple scopes)

中间件

如果您在配置期间注册了中间件,您可以根据 IAM 提供的范围或基于设置有效的访问令牌来保护路由或路由组

单个范围

iam.scopes 中间件用于单个范围的示例用法可能如下所示

Route::middleware('iam.scopes:auth.users.manage')->group(function () {
    Route::get('users/manage', function() {
        echo "This route is scope protected";
    });
})

多个范围

您还可以使用多个范围。只需用管道(|)分隔它们,您可以使用任意数量的范围

Route::middleware('iam.scopes:auth.users.manage|auth.groups.view')->group(function () {
    Route::get('users/manage', function() {
        echo "This route is scope protected";
    });
})

IAM 认证

使用 IamAuth 中间件保护路由可能如下所示

Route::middleware('iam.auth')->group(function () {
    Route::get('orders', function() {
        echo "This route requires valid access token to be set";
    });
})

管理方法

iam_manager()->isUserLoggedIn()
iam_manager()->login($username, $password)
iam_manager()->logout()
iam_manager()->getAccessToken()
iam_manager()->getAccessTokenDecoded()
iam_manager()->getRefreshToken()
iam_manager()->issetValidAccessToken()
iam_manager()->refreshToken()