CaiWuXiTong/app/Http/Middleware/EnsureLimitedDingTalkPageAccess.php
limeng f41a8fa6ba 钉钉登录:单独授权人员仅访问三个快递报价页面 (#339)
按精确企业身份开放受限登录,保留在职校验和普通角色;统一限制菜单、页面、导出与预览。59 项相关测试通过,无数据库迁移。
2026-10-15 15:21:05 +08:00

48 lines
1.8 KiB
PHP

<?php
namespace App\Http\Middleware;
use App\Utilities\SidebarPermissions;
use Closure;
use Illuminate\Http\Request;
class EnsureLimitedDingTalkPageAccess
{
public function handle(Request $request, Closure $next): mixed
{
$user = $request->user();
$route = $request->route();
if (! $user || ! $route?->hasParameter('company_id') || ! SidebarPermissions::hasLimitedDingTalkAccess($user)) {
return $next($request);
}
// Keep the application entrance, sign-out and existing self-profile checks.
if ($route->named('dashboard', 'logout', 'profile.edit', 'profile.update')) {
return $next($request);
}
$allowed = SidebarPermissions::allowedKeys($user);
$key = $route->parameter('section').'/'.$route->parameter('page');
if (in_array($key, $allowed, true)) {
return $next($request);
}
// The section and quote group are navigation containers for the three pages.
if ($route->named('business.pages.show') && $route->parameter('section') === 'courier-payables'
&& in_array($route->parameter('page'), [null, 'courier-quote'], true)) {
return $next($request);
}
// Dedicated detail, file and action routes declare their owning business page.
foreach ($route->gatherMiddleware() as $middleware) {
if (is_string($middleware) && str_starts_with($middleware, 'business.page:')
&& in_array(str_replace(',', '/', substr($middleware, strlen('business.page:'))), $allowed, true)) {
return $next($request);
}
}
// Also deny legacy exports/previews that do not declare a page permission.
abort(403, '当前账号没有该页面权限。');
}
}