phpben/imi-auth

基于IMI的AUTH组件。

v1.1.7 2022-08-09 07:18 UTC

This package is auto-updated.

Last update: 2024-04-19 21:01:34 UTC


README

Imi-Auth

安装:composer require phpben/imi-auth

逻辑,表按照tp-auth进行开发
用法与laravel-auth基本同理,主要使用注解验证,手动验证马上回来
可以实现Phpben\Imi\Auth\Contract\TokenContract开发自己的token鉴权方式,默认有jwt与session
可以实现Phpben\Imi\Auth\Contract\HashContract开发自己的密码验证方式,默认有md5和md5salt


该组件设计为了不单单只让auth适用于后台,前台/api/代理模块等等都可以使用该组件,添加不同配置即可,如无需规则权限验证,关闭check即可
后台管理员获取当前组别,规则等可以看 Phpben\Imi\Auth\Auth, 静态调用 方法与tpauth无异,不一一讲解了
AuthManager 是自动调用jwt/session/自定义类的管理类 可以使用guard方法调用非配置定义的类
Auth 是管理员/权限/组的快捷方法,里面内置获取用户所有组,树状组,所属自己的下级管理员等方法,具体可以使用ide或看文件注释了解

需要在config/beans.php配置添加auth相关配置
jwt需要安装imi-jwt组件
缓存名称需按imi缓存一节配置
表可以自行创建自己喜欢的表格式,也可以直接复制tp-auth的表,在配置中设置字段名称即可,当然表的id是必须的
auth_rule中验证的规则不在采用路由地址验证,内容为类名::方法,例:ImiApp\ApiServer\Backend\Controller\TestController::login

    'AuthConfig' => [
        // 是否开启 
        'status' => true,
        // 配置名称-默认配置
        'default' => [
            // 鉴权方式 Session稍后支持
            'auth' => \Phpben\Imi\Auth\Jwt::class,
            // IMI-缓存配置名称
            'cache' => "redis",
            // 一个账号只能一个人登陆
            'unique' => true,
            // 是否判断权限规则
            'check' => true,
            // JWT配置 结合IMI-JWT组件使用
            'jwt' => [
                // IMI-JWT名称
                'name' => 'default',
                // JWT Header名称
                'header_name' => 'Authorization',
                // JWT 前缀
                'prefix' => 'Bearer ',
            ],
            // 错误配置
            'error' => [
                // 错误Code值
                'code' => 401,
                // 错误http状态码
                'status_code' => 401,
                // 错误消息
                'message' => 'auth error',
            ],
            // 模型配置
            'model' => [
                // 用户表模型
                'user' => \ImiApp\ApiServer\Backend\Model\SoAdmin::class,
                // 登陆日志表模型
                'login_log' => \ImiApp\ApiServer\Backend\Model\SoAdminLoginLog::class,
                // 操作日志表模型
                'operate_log' => \ImiApp\ApiServer\Backend\Model\SoAdminOperateLog::class,
                // 权限组模型 如果需要验证组和规则 auth_group模型必须引入imi的树状模型trait并定义相关代码,具体可以看                 
                // https://doc.imiphp.com/v2.0/components/orm/TreeModel.html
                'auth_group' => \ImiApp\ApiServer\Backend\Model\SoAuthGroup::class,
                // 权限组关系表模型
                'auth_group_access' => \ImiApp\ApiServer\Backend\Model\SoAuthGroupAccess::class,
                // 权限规则表模型
                'auth_rule' => \ImiApp\ApiServer\Backend\Model\SoAuthRule::class,
            ],
            // 设置
            'settings' => [
                // 登陆日志
                'login_log' => true,
                // 操作日志
                'operate_log' => true,
                // Hash密码类
                'hash' => \Phpben\Imi\Auth\Hasher\Md5Salt::class,
                // Hash类配置
                'hash_option' => [

                ],
                // 用户表字段
                'user_keys' => [
                    // username唯一用户名
                    'username' => 'username',
                    // password 密码
                    'password' => 'password',
                    // salt 密码盐,非必需
                    'salt' => 'salt',
                    // token 存入字段
                    'token' => 'token'
                ],
                // 规则表字段
                'auth_rule_keys' => [
                    // 规则表字段 内容例: ImiApp\ApiServer\Controller\TestController::login
                    'rule' => 'rule',
                    // 规则所属分组字段
                    'pid' => 'pid',
                ],
                'auth_group_keys' => [
                    // 规则Ids字段 内容例:1,3,5,7,9 支持*
                    'ids' => 'rules',
                    // 开关字段 1/0判断
                    'status' => 'status',
                    // 所属user字段id
                    'pid' => 'pid'
                ],
                'auth_group_access_keys' => [
                    // 用户id
                    'user_id' => 'uid',
                    // auth_group组id
                    'group_id' => 'gid'
                ]
            ]
        ],
        // 后端
        'backend' => [
            // 鉴权方式 Session稍后支持
            'auth' => \Phpben\Imi\Auth\Jwt::class,
            // IMI-缓存配置名称
            'cache' => "redis",
            // 一个账号只能一个人登陆
            'unique' => true,
            // 是否判断权限规则
            'check' => true,
            // JWT配置 结合IMI-JWT组件使用
            'jwt' => [
                // IMI-JWT名称
                'name' => 'default',
                // JWT Header名称
                'header_name' => 'Authorization',
                // JWT 前缀
                'prefix' => 'Bearer ',
            ],
            // 错误配置
            'error' => [
                // 错误Code值
                'code' => 401,
                // 错误http状态码
                'status_code' => 401,
                // 错误消息
                'message' => 'auth error',
            ],
            // 模型配置
            'model' => [
                // 用户表模型
                'user' => \ImiApp\ApiServer\Backend\Model\SoAdmin::class,
                // 登陆日志表模型
                'login_log' => \ImiApp\ApiServer\Backend\Model\SoAdminLoginLog::class,
                // 操作日志表模型
                'operate_log' => \ImiApp\ApiServer\Backend\Model\SoAdminOperateLog::class,
                // 权限组模型
                'auth_group' => \ImiApp\ApiServer\Backend\Model\SoAuthGroup::class,
                // 权限组关系表模型
                'auth_group_access' => \ImiApp\ApiServer\Backend\Model\SoAuthGroupAccess::class,
                // 权限规则表模型
                'auth_rule' => \ImiApp\ApiServer\Backend\Model\SoAuthRule::class,
            ],
            // 设置
            'settings' => [
                // 登陆日志
                'login_log' => true,
                // 操作日志
                'operate_log' => true,
                // Hash密码类
                'hash' => \Phpben\Imi\Auth\Hasher\Md5Salt::class,
                // Hash类配置
                'hash_option' => [

                ],
                // 用户表字段
                'user_keys' => [
                    // username唯一用户名
                    'username' => 'username',
                    // password 密码
                    'password' => 'password',
                    // salt 密码盐,非必需
                    'salt' => 'salt',
                    // token 存入字段
                    'token' => 'token'
                ],
                // 规则表字段
                'auth_rule_keys' => [
                    // 规则表字段 内容例: ImiApp\ApiServer\Controller\TestController::login
                    'rule' => 'rule',
                    // 规则所属分组字段
                    'pid' => 'pid',
                ],
                'auth_group_keys' => [
                    // 规则Ids字段 内容例:1,3,5,7,9 支持*
                    'ids' => 'rules',
                    // 开关字段 1/0判断
                    'status' => 'status',
                    // 所属user字段id
                    'pid' => 'pid'
                ],
                'auth_group_access_keys' => [
                    // 用户id
                    'user_id' => 'uid',
                    // auth_group组id
                    'group_id' => 'gid'
                ]
            ]
        ],
    ],

注解使用方式(注解只能设置在类上):
注解:@Auth
参数:

name = 对应beans配置中的键名<br>
nologin = 当前类不需要验证登陆的方法,直接填方法名称即可,数组格式,也可以填入字符串*代表所有方法都不需要验证登陆<br>
nocheck = 当前类不需要验证规则的方法,直接填方法名称即可,数组格式,也可以填入字符串*代表所有方法都不需要验证规则<br>

如果配置中check选项等于false,那么就相当于所有用了当前配置的auth注解对应的类都不会检测验证规则,相当于自动把所有auth注解都加了一个nocheck=“*”

// 注解验证
// 示例:@Auth 什么参数都没有则使用default配置
<?php

declare(strict_types=1);

namespace ImiApp\ApiServer\Backend\Controller;

use Imi\Server\Http\Controller\HttpController;
use Imi\Server\Http\Route\Annotation\Action;
use Imi\Server\Http\Route\Annotation\Controller;
use Imi\Server\Http\Route\Annotation\Route;
use Phpben\Imi\Auth\Annotation\Auth;
use Phpben\Imi\Validate\Annotation\Validate;

/**
 * @Auth(name="backend",nologin={"login"},nocheck={"index"})
 * @Controller("/test/")
 */
class TestController extends HttpController
{
    /**
     * @Action
     * @Route(url="login",method="POST")
     * @Validate
     */
    public function login($data)
    {
        // 使用imi-auth进行登陆验证
        $auth = new \Phpben\Imi\Auth\AuthManager($name = '配置名称');
        if($user = $auth->login($username,$password)){
            var_dump($user);//登陆成功
        }
        // 或者你也可以使用imi注入成员变量
        if($user = $this->auth->guard($name='变量名称')->login($username,$password)){
            var_dump($user);//登陆成功
        }
        else
        {
            //账号或者密码错误
        }
        // 登陆完毕
        return ‘无需登陆’;
    }

    /**
     * @Action
     * @Route(url="index")
     * @Validate
     */
    public function index()
    {
        // 登陆成功后可以使用imi-auth获取当前用户信息

        $auth = new \Phpben\Imi\Auth\AuthManager($name = '配置名称');
        var_dump($auth->user());//用户信息模型对象
        // 或者你也可以使用imi注入成员变量
        var_dump($this->auth->guard(配置名称)->user();//用户信息模型对象
        // 或者你使用了默认配置
        var_dump($this->auth->user();//用户信息模型对象
        // 
        return '需要登陆,无须验证权限规则';
    }


    

    /**
     * @Action
     * @Route(url="api")
     * @Validate
     */
    public function api($user)
    {
        $auth = new \Phpben\Imi\Auth\AuthManager($name = '配置名称');
        $auth->auth()->getRuleList(); // 支持auth方法调用Auth类 


        var_dump($user); // 使用了auth注解的类方法都会自动注入一个user变量到方法中,你也可以直接接收user变量获取用户信息
        return '需要登陆,并且需要验证权限规则,因为nocheck中不包含当前方法';
    }

   

}