Laravel网站地址访问权限控制优化方案咨询
优化方案
原有代码存在的问题
- 重复定义了两次完全相同的
try-catch逻辑,代码冗余 $admin/$pages等路径变量单独定义没有必要,增加了不必要的代码量in_array($link_panel[$url] , $link_panel)的判断完全冗余,前面已经判断了$url在$link_panel中存在- 权限配置和业务逻辑耦合在一起,后续新增权限页面需要改动核心逻辑,扩展性差
- 用异常捕获判断视图是否存在不够优雅,Laravel自带原生的视图存在判断方法
优化后实现代码
控制器代码
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\View; class UrlController extends Controller { public function urlpanel($url) { // 面板页面配置:key为url参数,value对应视图路径+所需访问角色(null为所有登录用户可访问) $panelConfig = [ 'index' => ['view' => 'admin.index', 'role' => null], 'index2' => ['view' => 'admin.index2', 'role' => 'admin'], // 仅管理员可访问 'index3' => ['view' => 'admin.index3', 'role' => null], 'calendar' => ['view' => 'admin.pages.calendar', 'role' => null], 'widgets' => ['view' => 'admin.pages.widgets', 'role' => null], 'chartjs' => ['view' => 'admin.pages.charts.chartjs', 'role' => null], 'flot' => ['view' => 'admin.pages.charts.flot', 'role' => null], 'inline' => ['view' => 'admin.pages.charts.inline', 'role' => null], '404' => ['view' => 'admin.pages.examples.404', 'role' => null], '500' => ['view' => 'admin.pages.examples.500', 'role' => null], 'blank' => ['view' => 'admin.pages.examples.blank', 'role' => null], 'invoice-print' => ['view' => 'admin.pages.examples.invoice-print', 'role' => null], 'invoice' => ['view' => 'admin.pages.examples.invoice', 'role' => null], 'lockscreen' => ['view' => 'admin.pages.examples.lockscreen', 'role' => null], 'login' => ['view' => 'admin.pages.examples.login', 'role' => null], 'profile' => ['view' => 'admin.pages.examples.profile', 'role' => null], 'register' => ['view' => 'admin.pages.examples.register', 'role' => null], 'advanced' => ['view' => 'admin.pages.forms.advanced', 'role' => null], 'editors' => ['view' => 'admin.pages.forms.editors', 'role' => null], 'general' => ['view' => 'admin.pages.forms.general', 'role' => null], 'compose' => ['view' => 'admin.pages.mailbox.compose', 'role' => null], 'mailbox' => ['view' => 'admin.pages.mailbox.mailbox', 'role' => null], 'read-mail' => ['view' => 'admin.pages.mailbox.read-mail', 'role' => null], 'data' => ['view' => 'admin.pages.tables.data', 'role' => null], 'simple' => ['view' => 'admin.pages.tables.simple', 'role' => null], 'buttons' => ['view' => 'admin.pages.UI.buttons', 'role' => null], 'icons' => ['view' => 'admin.pages.UI.icons', 'role' => null], 'sliders' => ['view' => 'admin.pages.UI.sliders', 'role' => null], ]; // 校验页面是否在配置列表中 if (!isset($panelConfig[$url])) { abort(404); } $currentPageConfig = $panelConfig[$url]; // 权限校验:配置了角色限制的页面,判断当前用户是否符合权限要求 if ($currentPageConfig['role'] && !Auth::user()->hasRole([$currentPageConfig['role']])) { abort(404); } // 校验视图文件是否存在 if (!View::exists($currentPageConfig['view'])) { abort(404); } return view($currentPageConfig['view'], ['active' => 'active']); } }
进一步扩展优化建议
如果后续页面数量、权限规则复杂度上升,可以做如下升级:
- 把
$panelConfig配置项放到Laravel的独立配置文件(比如config/panel.php)中,实现业务逻辑和配置分离,修改页面配置不需要改动控制器代码 - 权限校验逻辑单独抽成中间件,通用的权限判断能力可以复用到其他路由
- 通配符路由增加正则约束,避免匹配到不符合规则的URL参数,修改路由定义即可:
Route::get('{url}', [UrlController::class , 'urlpanel'])->name('users_url')->where('url', '[a-zA-Z0-9\-]+');
内容的提问来源于stack exchange,提问作者ahmadreza1383
相关产品推荐
相关产品推荐

