【问题标题】:laravel how to create page restrictionlaravel如何创建页面限制
【发布时间】:2014-07-19 21:02:06
【问题描述】:

请告诉我如何使用 laravel 限制页面,
我有 3 个用户。
1. 管理员,2. 客户,3. 合作伙伴
我想如果管理员登录然后只打开 - admin.index 页面
如果客户端已登录,则仅打开-client.index 页面

我在 route.php 中使用了以下代码-

 Route::group(array('before' => 'role'), function(){
      Route::resource('admin','AdminController@index');
      Route::resource('client','clientController@index');
      Route::resource('partner','partnerController@index');
 }); 

使用上面的代码,如果没有任何用户登录,那么它会正常运行,
并假设如果管理员登录,然后页面重定向到 AdminController 但是,
如果我硬编码(网址)点击clientController or partnerController 就像http://localhost/laravel-login/public/client 那么客户端页面即将到来。
所以请告诉我如何避免这些
对不起我的英语不好.. 谢谢

【问题讨论】:

  • 可能你必须为每个角色创建不同的过滤器,并为每个角色添加一个进入路径。
  • @fmgonzalez:我喜欢你的建议。你能回答吗?我有一个与您的建议非常相似的代码。我和 Reena 几乎有同样的问题。
  • @evoque2015 我有两个级别的权限。我可以授予对路由级别的访问权限,因此一个用户可以拥有多个角色,并且每个角色都有一些授予的路由。在每条路线中,我都请求权限,并寻找路线。它更灵活,但维护起来更复杂。另一方面,您不需要向控制器添加任何内容,也不需要对角色进行硬编码。
  • @fmgonzalez:我被困在这个问题上,还没有一个答案。 :(stackoverflow.com/questions/27236098/…

标签: php laravel laravel-4


【解决方案1】:

限制控制器制作新中间件的最佳方式,您可以在请求之前定义规则。示例:

我有一个管理员控制器,只有注册具有管理员角色的用户才能访问它。 在定义路由时这样做包括中间件。

// 命名空间 = 指明我的控制器在哪里(子文件夹) // 中间件 = 表明我想要对我的控制器有什么限制,你可以传递一个中间件或中间件数组

Route::group([ 'namespace' => 'Admin','middleware' => ['auth' , 'IsAdmin'] ], function()
{
  Route::resource('admin/posts', 'PostsController');


});

创建中间件并按照documentation注册它

看看这是我的中间件

    <?php

namespace App\Http\Middleware;

use Closure;

class IsAdmin
{
    public function handle($request, Closure $next)
    {
      if($request->user()->is_admin == false ){
        return redirect('/');
      }
        return $next($request);
    }
}

【讨论】:

    【解决方案2】:

    您可以为每个路由使用不同的路由过滤器并创建单独的过滤器,例如:

    Route::group(array('before' => 'auth'), function() {
        Route::resource('admin','AdminController@index');
        Route::resource('client','clientController@index');
        Route::resource('partner','partnerController@index');
    });
    

    在每个控制器中创建一个__construct 方法并添加过滤器,如:

    public function __construct()
    {
        // In your AdminController
        $this->beforeFilter(function() {
            if(Auth::user()->role->name != 'admin') return redirect::to('/'); // home
        });
    }
    

    同样的方式在其他控制器中声明其他过滤器:

    public function __construct()
    {
        // In your clientController
        $this->beforeFilter(function() {
            if(Auth::user()->role->name != 'client') return redirect::to('/'); // home
        });
    }
    

    等等。在 Laravel 网站上查看更多关于 controller filtering 的信息。

    【讨论】:

    • 如何添加角色->名称
    • 创建roles 表和Role 模型,并在User::role 方法中使用return $this-&gt;hasOne('Role') 为用户附加角色。演示所有内容是一项艰巨的工作,我只是给了你这个想法。
    • 它正在工作,但假设我以管理员身份登录并且我在 url 中点击页面,如“localhost/laravel-login/public/client”,然后 url 显示为“localhost/laravel-login/public/client”,但页面是管理页面。 它没有重定向
    • 然后检查你的受限控制器的每个__construct()方法,即if(Auth::user()-&gt;role-&gt;namne != 'desired_rule') return redirect::to('somepage');
    • //dd(Auth::user()->type); $this->beforeFilter(function(){ if(Auth::user()->type != 1) return Redirect::to('/'); });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    相关资源
    最近更新 更多