【问题标题】:Best way to check permissions with sentry 2 at Laravel在 Laravel 使用 sentry 2 检查权限的最佳方法
【发布时间】:2014-03-06 16:11:49
【问题描述】:

我正在开发一个基本的应用程序核心,首先我使用用户/组和权限访问。

我选择 Sentry 2 工作,并且我想将访问 my.domain/admin 的权限限制为具有管理员权限的用户或组。

我正在开发一个过滤器来检查用户是否是管理员以及是否有权访问特定操作,例如 users.index 或 users.custom_fction。

在我的路线中,我有:

/**
* ADMIN ROUTES
*/
Route::group(array('before' => 'sentry'), function() {
    Route::group(array('before' => 'admin'), function() {

        Route::group(array('prefix' => 'admin'), function()
        {

            Route::get('/', function()
            {
                return View::make('admin');
            });

            Route::resource('groups', 'GroupController',
                array('except' => array('show')));

            Route::resource('users', 'UserController',
                array('except' => array('show')));

            Route::get('users/{id}/groups', 'UserController@groups');
            Route::post('users/{id}/groups', 'UserController@store_groups');

            Route::get('{table}/{id}/permissions',
               'PermissionController@manage_entity');
            Route::post('{table}/{id}/permissions',
               'PermissionController@update_permissions');
        });
    });
});

哨兵过滤器仅检查是否已登录并重定向到登录页面,管理员过滤器是:

/*
 * Sentry admin & hasAccess filter
 */
Route::filter('admin', function()
{
    $user = Sentry::getUser();

    if (!$user->hasAccess('admin')) return Redirect::to('/');

    // Ask if user hasAccess to specific action
    var_dump(Route::getCurrentRoute()->getPath());
    var_dump(Route::getCurrentRoute()->getAction());
});

我必须再次检查实际路线,在 getAction 数组中有一个

'as' => string 'admin.users.index' (length=17)

我可以将它用于我定义的 Route::resource,但是,对于其他功能,如组或权限,我是如何做到的。

也许有更好的方法来处理它,但我不知道。

感谢您的建议。

【问题讨论】:

    标签: php laravel-4 cartalyst-sentry


    【解决方案1】:

    我找到了解决办法:

    http://laravel.com/docs/routing#named-routes

    现在我有:

    Route::get('users/{id}/groups', array('as' => 'admin.users.groups', 'uses' => 'UserController@groups'));
    Route::post('users/{id}/groups', 'UserController@store_groups');
    
    Route::get('{table}/{id}/permissions', array('as' => 'admin.permissions.manage_entity', 'uses' => 'PermissionController@manage_entity'));
    Route::post('{table}/{id}/permissions', 'PermissionController@update_permissions');
    

    过滤器看起来像:

    Route::filter('admin', function()
    {
        $user = Sentry::getUser();
        $action = Route::getCurrentRoute()->getAction();
    
        if (!$user->hasAccess($action['as'])) return Redirect::to('/admin');
    });
    

    但是现在,该过滤器内的所有路由都需要声明,否则会弹出错误。

    希望这对其他人有所帮助。

    【讨论】:

    • 此外,您可以使用通配符权限 - 例如“admin.*”或“admin.users.*”等。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2021-09-02
    • 2016-05-28
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    相关资源
    最近更新 更多