0

我需要添加对我的网站的级别访问权限,我通常将我的路线编码为:

Route::get('/', array(
    'as' => 'home-view',
    'uses' => 'HomeController@viewHome'
));

/* Authenticated Group */
Route::group(array('before' => 'auth'), function(){
    Route::get('/', array(
        'as' => 'admin-view',
        'uses' => 'AdminController@viewAdmin'
    ));
}
/* Unauthenticated Group */
Route::group(array('before' => 'guest'), function(){
    Route::get('/signin', array(
        'as' => 'user-signin-get',
        'uses' => 'UserController@getSignIn'
    ));
}

我需要将级别访问权限添加为“用户”或“管理员”。我怎么能做那个过滤路线?尽可能简单或您有什么建议?

4

2 回答 2

1

您可以根据需要对单个路由设置任意数量的过滤器。考虑一下:

Route::group(array('before' => 'auth|hasAdminLevel'), function(){
    Route::get('/', array(
        'as' => 'admin-view',
        'uses' => 'AdminController@viewAdmin'
    ));
});

这会将过滤器authhasAdminLevel过滤器都应用到您的admin-view路线。hasAdminLevel路由是您需要定义的自定义过滤器。

更新

hasAdminLevel是一个自定义过滤器,可以这样定义:

Route::filter('hasAdminLevel', function() {
    if(Auth::user()->level != 'admin') {
        return Redirect::to('/');
    }
});

你把它放在哪里取决于你,但一个好地方应该是在恰当命名的app/filters.php.

于 2014-09-10T16:53:01.897 回答
0

我假设你有一个用户(id、用户名等)、角色(id、name 等)和user_role(user_id、role_id 等)表,并且在你的模型中正确设置了关系。

因此,您可以在您的用户模型中创建一个新函数来检查用户是否具有角色。

public function hasRole($name) {
    foreach ($this->roles as $role) {
        if ($role->name == $name) return true;
    }
    return false;
}

然后您可以为此创建一个过滤器:

Route::filter('role', function($route, $request, $role){
if( Auth::guest() or !Auth::user()->hasRole($role) ) {
    return Redirect::guest('/'); // whatever you want
}

});

最后只需将过滤器应用于您的路线:

Route::group(['prefix' => 'admin', 'before' => 'role:the_role_name_you_want'], function(){
  // Your Routes here
});
于 2014-09-10T17:00:18.750 回答