php后台增加权限控制

发布于:2025-06-26 ⋅ 阅读:(18) ⋅ 点赞:(0)
  • 背景
    最近在对接某大厂,部署差不多了,但是在漏洞扫描环节有问题,前端是用vue代码写的。后端是php。发现前端路由可以拦截未登录的url。但是后端php接口不用登录就能访问,很危险

  • 解决方法

一、创建 Auth 中间件
首先创建一个专门用于验证 Session 的中间件: 里面可以放开不用登录的接口

<?php
// 目录位置 app/middleware/Auth.php
namespace app\middleware;

use think\facade\Session;
use think\Response;

class Auth
{
    // 定义不需要验证的接口路径
    protected $exceptPaths = [
        'Auth/login',       // 登录接口
        'Auth/logout',    // 注册接口
        'Auth/getCode',    // 注册接口
        'Index/getTitle',    // 注册接口
        // 可添加更多无需验证的接口...
    ];
    public function handle($request, \Closure $next)
    {
        // 获取当前请求的路径(不含域名和参数)
        $path = $request->pathinfo();

        // 检查是否为排除的路径
        if ($this->shouldPassThrough($path)) {
            return $next($request); // 跳过验证,直接继续
        }
        // 检查Session中是否有登录用户信息
        if (!Session::has(SESSION_LOGIN_KEY)) {
            // 未登录,返回JSON错误响应
            return json([
                'code' => 0,
                'msg' => '请先登录',
                'data' => 401,
                'url' => null,
                'wait' => 3
            ]);
        }

        // 已登录,将用户信息注入请求对象,方便后续使用
        $request->user = Session::get(SESSION_LOGIN_KEY);

        // 继续执行后续请求处理
        return $next($request);
    }

    // 判断请求是否应跳过验证
    protected function shouldPassThrough($path)
    {
        foreach ($this->exceptPaths as $except) {
            if (strpos($path, $except) === 0) {
                return true;
            }
        }
        return false;
    }
}

二、注册中间件
有两种方式注册中间件,根据你的需求选择:

  1. 全局中间件(所有请求都验证)
    打开 目录位置app/middleware.php 文件,添加中间件:
// app/middleware.php
return [
    // 其他中间件...
    \app\middleware\Auth::class,
];
  1. 路由中间件(按需验证)
    如果你只想验证部分接口,在路由定义中使用中间件:
// app/route/route.php
use think\facade\Route;

// 应用Auth中间件到整个Video控制器组
Route::group('video', function () {
    Route::get('getIqiyiLists', 'Video/getIqiyiLists');
    Route::get('getSohuLists', 'Video/getSohuLists');
    // 其他接口...
})->middleware(\app\middleware\Auth::class);

// 或者只应用到特定接口
Route::get('video/getIqiyiLists', 'Video/getIqiyiLists')
    ->middleware(\app\middleware\Auth::class);
  • 总结
    大概就是这样玩的。ThinkPHP 的中间件机制还是挺不错。后续你还可以加入权限的控制之类的。如果发现博文有问题,欢迎老鸟指点一二

网站公告

今日签到

点亮在社区的每一天
去签到