Snipe-IT v6(Laravel8)隐藏Admin设置中Branding和LDAP菜单报错
问题描述
我正在使用基于Laravel 8构建的Snipe-IT v6资产管理系统,想隐藏Admin设置页面中的Branding和LDAP菜单,于是注释了routes目录下web.php中的Branding路由代码,结果出现服务器错误;取消注释后错误就消失了。想请教问题出在哪里?我的web.php代码如下:
Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'authorize:superuser']], function () { Route::get('settings', [SettingsController::class, 'getSettings'])->name('settings.general.index'); Route::post('settings', [SettingsController::class, 'postSettings'])->name('settings.general.save'); // 我注释了这段代码,想隐藏后台设置里的菜单 // Route::get('branding', [SettingsController::class, 'getBranding'])->name('settings.branding.index'); // Route::post('branding', [SettingsController::class, 'postBranding'])->name('settings.branding.save'); Route::get('security', [SettingsController::class, 'getSecurity'])->name('settings.security.index'); Route::post('security', [SettingsController::class, 'postSecurity'])->name('settings.security.save'); Route::get('groups', [GroupsController::class, 'index'])->name('settings.groups.index'); Route::get('localization', [SettingsController::class, 'getLocalization'])->name('settings.localization.index'); Route::post('localization', [SettingsController::class, 'postLocalization'])->name('settings.localization.save'); Route::get('notifications', [SettingsController::class, 'getAlerts'])->name('settings.alerts.index'); Route::post('notifications', [SettingsController::class, 'postAlerts'])->name('settings.alerts.save'); Route::get('slack', [SettingsController::class, 'getSlack'])->name('settings.slack.index'); Route::post('slack', [SettingsController::class, 'postSlack'])->name('settings.slack.save'); Route::get('asset_tags', [SettingsController::class, 'getAssetTags'])->name('settings.asset_tags.index'); Route::post('asset_tags', [SettingsController::class, 'postAssetTags'])->name('settings.asset_tags.save'); Route::get('barcodes', [SettingsController::class, 'getBarcodes'])->name('settings.barcodes.index'); Route::post('barcodes', [SettingsController::class, 'postBarcodes'])->name('settings.barcodes.save'); Route::get('labels', [SettingsController::class, 'getLabels'])->name('settings.labels.index'); Route::post('labels', [SettingsController::class, 'postLabels'])->name('settings.labels.save'); Route::get('ldap', [SettingsController::class, 'getLdapSettings'])->name('settings.ldap.index'); Route::post('ldap', [SettingsController::class, 'postLdapSettings'])->name('settings.ldap.save'); Route::get('phpinfo', [SettingsController::class, 'getPhpInfo'])->name('settings.phpinfo.index'); Route::get('oauth', [SettingsController::class, 'api'])->name('settings.oauth.index'); Route::get('google', [SettingsController::class, 'getGoogleLoginSettings'])->name('settings.google.index'); Route::post('google', [SettingsController::class, 'postGoogleLoginSettings'])->name('settings.google.save'); Route::get('purge', [SettingsController::class, 'getPurge'])->name('settings.purge.index'); Route::post('purge', [SettingsController::class, 'postPurge'])->name('settings.purge.save'); Route::get('login-attempts', [SettingsController::class, 'getLoginAttempts'])->name('settings.logins.index'); // 备份 Route::group(['prefix' => 'backups', 'middleware' => 'auth'], function () { Route::get('download/{filename}', [SettingsController::class, 'downloadFile'])->name('settings.backups.download'); Route::delete('delete/{filename}', [SettingsController::class, 'deleteFile'])->name('settings.backups.destroy'); Route::post('/', [SettingsController::class, 'postBackups'] )->name('settings.backups.create'); Route::post('/restore/{filename}', [SettingsController::class, 'postRestore'] )->name('settings.backups.restore'); Route::post('/upload', [SettingsController::class, 'postUploadBackup'] )->name('settings.backups.upload'); Route::get('/', [SettingsController::class, 'getBackups'])->name('settings.backups.index'); }); Route::resource('groups', GroupsController::class, [ 'middleware' => ['auth'], 'parameters' => ['group' => 'group_id'], ]); Route::get('/', [SettingsController::class, 'index'])->name('settings.index'); });
问题原因与解决方法
问题根源
直接注释Branding路由会报错,是因为系统的其他地方(比如后台设置页面的侧边栏视图、控制器逻辑)还在调用settings.branding.index这个路由名称,Laravel找不到对应的路由就会抛出路由未找到的异常,导致服务器错误。
而且,菜单的显示逻辑和路由是否存在没有直接绑定——你要隐藏的是菜单,不是禁用路由访问,所以直接动路由是找错了方向。
正确的隐藏方式
隐藏Branding菜单
- 找到后台设置页面的侧边栏视图文件,路径一般是
resources/views/settings/partials/sidebar.blade.php - 在里面找到Branding对应的菜单代码,大概长这样:
<li class="nav-item"> <a class="nav-link" href="{{ route('settings.branding.index') }}"> <i class="fas fa-palette"></i> {{ trans('settings.branding') }} </a> </li>
- 把这段代码注释掉或者直接删除,Branding菜单就不会显示了。
隐藏LDAP菜单
用同样的方法,找到LDAP对应的菜单代码,注释或删除即可。如果担心用户直接输入URL访问LDAP设置页面,可以给LDAP路由添加自定义权限限制,而不是删除路由,避免系统其他调用报错。
额外提醒
如果确实需要禁用路由访问,不要直接删除路由,而是给路由添加权限中间件。比如:
Route::get('ldap', [SettingsController::class, 'getLdapSettings']) ->name('settings.ldap.index') ->middleware('can:access-ldap');
然后在权限系统里不给用户分配access-ldap权限,这样用户既看不到菜单,也无法直接访问页面,还不会触发路由不存在的错误。
内容的提问来源于stack exchange,提问作者aldoprogrammer
相关产品推荐
相关产品推荐

