m7 / iam
M7 s.r.o. 开发的 Laravel 6+ IAM 封装器
Requires
- php: ^7.2
- ext-json: *
- doctrine/dbal: ^2.9
- firebase/php-jwt: ^5.0
- guzzlehttp/guzzle: ^6.3
- laravel/framework: ^6.0
README
本软件包为 Laravel 6+ 应用程序中与 M7 s.r.o. 创建的 IAM 进行通信的简单封装器。
安装
- 使用 composer 安装:
composer require m7/iam
- 运行迁移:
php artisan migrate
- 这将在users
表中创建(或更新)一些字段,用于将您的用户与 IAM 配对iam_uid
name
surname
email
- 从本软件包生成的迁移字段应添加到您的
User
模型的fillable
属性中,如下所示use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Authenticatable; protected $fillable = ['iam_uid', 'name', 'surname', 'email', 'password']; }
- 接下来,您应该在您的用户模型中使用
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
路由的请求体应包含 username
和 password
键及其对应的值。
或者,如果您出于某种原因不希望使用这些特定的路由,您可以通过管理辅助实例方法 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()