Laravel 5.3:localhost重定向了你太多次了

时间:2016-11-28 08:33:47

标签: php laravel laravel-5.3

我有2个用户角色,superadminadmin

我不希望admin访问“设置页面”。

我不确定这是否正确。

所以,这是我的SettingsController.php

class SettingsController extends Controller {
    public function index() {
        if(Auth::user()->roles == 0) {
            return redirect(url()->previous());
        } else {
            return view('settings.index');
        }
    }
}

您可以看到roles是否为0.我将用户重定向到他们所在的最后一页。我还尝试使用return back();

web.php(路线)

<?php

Route::get('/', ['uses' => 'UsersController@index']);
Route::post('login', ['uses' => 'UsersController@login']);

Route::group(['middleware' => ['auth']], function() {
    Route::get('logout', ['uses' => 'UsersController@destroy']);
    Route::get('upline', ['uses' => 'UplinesController@index']);
    Route::get('upline/create', ['uses' => 'UplinesController@create']);
    Route::post('upline', ['uses' => 'UplinesController@store']);
    Route::delete('upline/destroy/{id}', ['uses' => 'UplinesController@destroy']);
    Route::put('upline/update/{id}', ['uses' => 'UplinesController@update']);
    Route::get('upline/getdownlines/{id}', ['uses' => 'UplinesController@getDownlines']);

    Route::get('downline', ['uses' => 'DownlinesController@index']);
    Route::post('downline', ['uses' => 'DownlinesController@store']);
    Route::delete('upline/destroy/{id}', ['uses' => 'DownlinesController@destroy']);
    Route::put('downline/update/{id}', ['uses' => 'DownlinesController@update']);

    Route::get('bonus', ['uses' => 'BonusController@index']);
    Route::post('bonus/csv', ['uses' => 'BonusController@fileUpload']);

    Route::get('settings', ['uses' => 'SettingsController@index']);
});

我有第二个问题。我可以使用中间件限制管理员吗?如果有,怎么样?

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

可能是第二个选项,&#34; 使用中间件限制管理员&#34;。 所以你可以尝试类似的东西;

Route::group(['prefix' => 'admin', 'middleware' => 'auth'], function () {
    Route::get('/', 'DownlinesController@update');
});

然后

Route::group(['prefix' => 'super', 'middleware' => 'auth'], function () {
    Route::get('/', 'UplinesController@index');
});

答案 1 :(得分:1)

正如@michael的回答建议使用中间件,他的回答无法证明如何做到(我也是,我只是添加了更多文本)。

  

注意:Laravel因其文档很重要,使用IT

您有2个(或更多选项):

  • 参数化中间件
  • 2个独特的中间件(一个用于管理员,另一个用于superadmin)
  

注意:使用artisan从存根中生成中间件,$ php artisan make:middleware MyNewShinyMiddleware

参数化中间件(我的选择)

前往文档并查看this

示例显示了您的问题。

public function handle($request, Closure $next, $role)
{
    if (! $request->user()->hasRole($role)) { //implement hasRole in User Model
        // Redirect... 
        // (use named routes to redirect or do 401 (unauthorized) because thats what is going on!
        // abort(401) // create view in /views/errors/401.blade.php
        // return redirect()->route('home');
    }

    //success user has role $role, do nothing here just go to another "onion" layer
    return $next($request);
}

2个独特的中间件

简单地创建两个中间件并对您的角色检查例程进行硬编码 (与您在控制器示例中的操作相同),除了使用$request->user() ...

(路线)web.php

Route::group(['middleware' => 'role:admin'], function () {...} //parametrized

Route::group(['middleware' => 'checkRoleAdmin'], function () {...}
Route::group(['middleware' => 'checkRoleSuper'], function () {...}
  

注意rolecheckRoleAdmincheckRoleSuper被&#34;命名为&#34;中间件,你需要在kernel.php中注册它们

另一种方法是使用最有意义的门或策略,因为你试图限制用户。阅读更多here

我使用基于ACL的中间件进行非常简单的项目(比如一个管理员,没有真正的用户) 我使用基于门的ACL进行中型项目(1-2个角色) 我使用基于策略的ACL来实现&#34;巨大的&#34;项目(许多角色,许多用户)。

另请考虑查看https://github.com/Zizaco/entrust