在 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);
                
        
    







这是我为用户编写的访问文件的代码

但是很脏

有没有更好的方式来吸引用户?

我希望我在演示文稿中指定的某些页面仅供管理员查看

感谢您的帮助

【问题讨论】:

你能解释一下为什么你使用 1 Controller 和 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 中检查网站地址的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

centos 7.2 Laravel访问网站页面空白

403 禁止 您没有权限访问此服务器上的 /。部署 Laravel 项目后

19:批量检查多个网站地址是否正常

Laravel Valet托管网站返回Chrome中的“无法访问网站”

错误记录GitHub 网站和仓库无法访问 ( 域名重定向 | 检查 C:WindowsSystem32driversetchosts 配置文件中的 GitHub 地址域名配置 )

从使用 AngularJS 开发的网站获取数据访问权限