thinkphp5 mysql uuid_tp5.1 权限模块 -- 权限实现

思路:用户登录验证的时候将用户权限路由存储session,定义方法执行前行为,行为验证当前访问的方法路由是否属于用户所拥有的权限路由。

一、在制作站点权限之前我们需要准备好所需的数据表,数据表如下:(各表字段可酌情加减,视各自站点逻辑而定)

1.admin -- 管理员账户表

a86b671b3d6c

image.png

2.role -- 角色表

a86b671b3d6c

image.png

3.admin_role -- 管理员角色关系表

a86b671b3d6c

image.png

4.role_action -- 角色方法表

a86b671b3d6c

image.png

5.admin_action -- 管理员特殊方法表(酌情添加)

a86b671b3d6c

image.png

6.action -- 方法表(方法数据通过站点采集而来。ps 采集方法,附上链接:https://www.jianshu.com/p/5e013fcb19aa)

a86b671b3d6c

image.png

二、数据表大致准备如上,接下来进行我们的权限验证流程:

1.应用目录下 tags.php(应用行为扩展定义文件) 定义应用操作执行前行为。ps:关于行为,笔者之前讲过:https://www.jianshu.com/p/5bb4ec8189f7

// 应用行为扩展定义文件

return [

// 应用初始化

'app_init' => [],

// 应用开始

'app_begin' => [],

// 模块初始化

'module_init' => [],

// 操作开始执行 注:笔者在 OperateBehavior 中进行权限验证

'action_begin' => ['app\\behavior\\OperateBehavior','app\\behavior\\AccessBehavior'],

// 视图内容过滤

'view_filter' => [],

// 日志写入

'log_write' => [],

//日志写入完成

'log_write_done' => [],

// 应用结束

'app_end' => ['app\\behavior\\LogBehavior'],

];

2.定义OperateBehavior.php行为文件,进行权限验证

a86b671b3d6c

image.png

OperateBehavior.php中代码如下:

namespace app\behavior;

use think\Db;

use think\facade\Log;

use think\facade\Session;

use think\Request;

use think\Exception;

use app\facade\ActionModel;

use think\Controller;

class OperateBehavior extends Controller

{

// 定义需要排除的权限路由

protected $exclude = [

'index/index/index',

'admin/login/index',

'admin/login/loginverify',

'admin/login/outlogin',

'admin/login/iebrowsernocompat',

'admin/index/index',

'admin/index/welcome',

'mobile/login/ajaxpswlogin',

'mobile/login/ajaxsmslogin',

'mobile/login/sendsms',

'mobile/login/ajaxupdatepsw',

'mobile/login/ajaxisregister',

'mobile/login/ajaxregister'

];

// 定义未登陆需要排除的权限路由

protected $login = [

'admin/login/index',

'admin/login/loginverify',

'admin/login/iebrowsernocompat',

'admin/index/welcome',

'mobile/login/ajaxpswlogin',

'mobile/login/ajaxsmslogin',

'mobile/login/sendsms',

'mobile/login/ajaxupdatepsw',

'mobile/login/ajaxisregister',

'mobile/login/ajaxregister'

];

// 定义不需要检测权限的模块

protected $moudel = ['union','mobile'];

/**

* 权限验证

* @param Request $Request

*/

public function run(Request $Request)

{

// 行为逻辑

try {

// 获取当前访问路由

$url = $this->getActionUrl($Request);

if(empty(Session::get()) && !in_array($url,$this->login) && !in_array(strtolower($Request->module()), $this->moudel)){

$this->error('请先登录1','/login/index');

}

// 用户所拥有的权限路由

$auth = Session::get('auth.url')?Session::get('auth.url'):[];

if(!$auth && !in_array($url,$this->login) && !in_array($url, $this->exclude) && !in_array(strtolower($Request->module()), $this->moudel)){

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例: 1.首先,我们需要创建一个自定义服务类 MyService。 ```php <?php namespace app\service; class MyService { public function doSomething() { // 这里是你的业务逻辑代码 // ... } } ``` 2.然后,在 config 目录下创建一个 worker.php 配置文件,并配置 worker 的参数。 ```php <?php return [ 'worker_num' => 4, 'pid_file' => runtime_path() . 'worker.pid', 'log_file' => runtime_path() . 'worker.log', 'log_level' => 3, ]; ``` 3.接着,在启动文件 public/index.php 中添加以下代码,启动 worker 服务。 ```php <?php // 加载框架引导文件 require __DIR__ . '/../thinkphp/start.php'; // 启动 worker 服务 $worker = new \think\worker\Server(); $worker->count = 4; $worker->onWorkerStart = function ($worker) { // 自动加载类文件 require __DIR__ . '/../vendor/autoload.php'; }; $worker->onMessage = function ($connection, $data) { // 创建 MyService 服务实例 $service = new \app\service\MyService(); // 调用服务方法执行业务逻辑 $res = $service->doSomething(); // 将结果发送给客户端 $connection->send($res); }; $worker->runAll(); ``` 4.最后,我们可以在控制器中使用以下代码来向 worker 发送请求。 ```php <?php namespace app\controller; use think\worker\Server; class Demo { public function index() { $client = stream_socket_client('tcp://127.0.0.1:2345', $errno, $errmsg, 1); fwrite($client, 'hello'); $res = fread($client, 8192); fclose($client); return $res; } } ``` 这样,我们就可以通过 TP5.1 结合 think-worker,实现自定义服务类的功能了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值