在 Laravel 中检查网站地址的访问权限
Posted
技术标签:
【中文标题】在 Laravel 中检查网站地址的访问权限【英文标题】:Check access for website addresses in Laravel 【发布时间】:2021-12-25 21:30:03 【问题描述】:对不起,因为我的英语很弱,我不能说得很好!!
这是我在 web.php 页面上定义的路由:
<?php
use App\Http\Controllers\Controller;
use App\Http\Controllers\GoogleAuthController;
use App\Http\Controllers\ProfileController;
use App\Http\Controllers\UrlController;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function ()
return view('project.index');
);
Route::group(['middleware' => ['auth' , 'InfoFolder' , 'verified' , 'Roles'] , 'prefix' => 'users/'] , function()
Route::get('url', [UrlController::class , 'urlpanel'])->name('users_url');
);
还有我的控制器代码:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
class UrlController extends Controller
//
public function urlpanel($url)
$admin = "admin";
$pages = "admin.pages";
$charts = "admin.pages.charts";
$examples = "admin.pages.examples";
$forms = "admin.pages.forms";
$mailbox = "admin.pages.mailbox";
$tables = "admin.pages.tables";
$UI = "admin.pages.UI";
$link_panel = [
'index' => "$admin.index",
'index2' => "$admin.index2",
'index3' => "$admin.index3",
'calendar' => "$pages.calendar",
'widgets' => "$pages.widgets",
'chartjs' => "$charts.chartjs",
'flot' => "$charts.flot",
'inline' => "$charts.inline",
'404' => "$examples.404",
'500' => "$examples.500",
'blank' => "$examples.blank",
'invoice-print' => "$examples.invoice-print",
'invoice' => "$examples.invoice",
'lockscreen' => "$examples.lockscreen",
'login' => "$examples.login",
'profile' => "$examples.profile",
'register' => "$examples.register",
'advanced' => "$forms.advanced",
'editors' => "$forms.editors",
'general' => "$forms.general",
'compose' => "$mailbox.compose",
'mailbox' => "$mailbox.mailbox",
'read-mail' => "$mailbox.read-mail",
'data' => "$tables.data",
'simple' => "$tables.simple",
'buttons' => "$UI.buttons",
'general' => "$UI.general",
'icons' => "$UI.icons",
'sliders' => "$UI.sliders",
];
$link_permission_owner = [
'index2',
];
if(!isset($link_panel[$url]))
return abort(404);
if(in_array($link_panel[$url] , $link_panel))
if(in_array($url , $link_permission_owner) && Auth::user()->hasRole(['member']))
return abort(404);
try
$active = "active";
return view($link_panel[$url] , compact('active'));
catch (\Exception $e)
return abort(404);
try
$active = "active";
return view($link_panel[$url] , compact('active'));
catch (\Exception $e)
return abort(404);
这是我为用户编写的访问文件的代码
但是很脏
有没有更好的方式来吸引用户?
我希望我在演示文稿中指定的某些页面仅供管理员查看
感谢您的帮助
【问题讨论】:
你能解释一下为什么你使用 1Controller
和 1 Route
。通常更好的做法是为您的Controller
中的每个Method
使用多个Controllers
和1 个Route
。你使用角色/权限包吗?或者你的角色是如何存储的?
我使用角色/权限
【参考方案1】:
第一步,获取一个可以帮助你管理角色和权限的 laravel 包,我推荐类似spatie laravel permissions
第二步是有一个用于报告的控制器并为其分配一个路由,当具有特定角色的用户登录时,然后就被重定向到该路由。
对于重定向部分,您可以为此目的使用中间件,然后在控制器构造函数中使用它,如下例所示。
public function __construct()
$this->middleware('guest', ['except' => 'logout']);
然后您需要保护您希望用户登录访问的路由。
Route::group(['middleware' => 'auth'], function()
Route::get('/yourReportPath', 'YourReportController@index');
);
请稍微阅读一下中间件here
【讨论】:
你能再解释一下吗?如何将它们重定向到授权页面 用示例更新了我的帖子以上是关于在 Laravel 中检查网站地址的访问权限的主要内容,如果未能解决你的问题,请参考以下文章
403 禁止 您没有权限访问此服务器上的 /。部署 Laravel 项目后
Laravel Valet托管网站返回Chrome中的“无法访问网站”
错误记录GitHub 网站和仓库无法访问 ( 域名重定向 | 检查 C:WindowsSystem32driversetchosts 配置文件中的 GitHub 地址域名配置 )