0

laravel 4 を使用してサイトを開発しており、Sentry 2 を使用して ACL を実装しようとしています。以下を構成する方法について助けが必要です。

私は、ロール HR に対して次の権限を持っています。

Staffs|View staff details
Staffs|Register new staff
Staffs|Edit staff details
Staffs|Delete staff details

以下の路線に対応。

//get route to staffs landing page
Route::get('staffs/view-staffs', 'UsersController@getManageStaffs'); 

//post routes
Route::post('staffs/add-staff', 'UsersController@postAddStaff');
Route::post('staffs/update-staff', 'UsersController@postUpdateStaff');
Route::post('staffs/delete-staff', 'UsersController@postDeleteStaff');

次のアクセス制御が必要です。

  1. view-staffs のマイ メニューのリンク: すべてのスタッフ権限が無効になっている場合は、リンクを無効にします。これは私がやっている方法です:

    if($user->hasAnyAccess(array('Staffs|View staff details', 'Staffs|Register new staff', 'Staffs|Edit staff details', 'Staffs|Delete staff details')))
    {
        //display menu link
    }
    
  2. my routes: すべてのスタッフ権限が無効になっている場合、「staff/」に該当するすべてのルートを無効にします

    //For this, i have no idea how to restrict routes based on my permissions
    //But i don't want to do it like i did in (1) within my controllers
    
  3. 無効化された権限に対応するアクション ボタンを無効化する

    //same as no (1)
    
4

2 に答える 2

1

フル機能の管理パネルを実装するセントリー ACL のクールなパッケージがあります https://github.com/intrip/laravel-authentication-acl

于 2014-06-02T21:51:17.590 に答える
1

次のようなことができます。

app/filters.php で、次のようにフィルターを作成します。

Route::filter('permissions', function()
{
    $name = Route::current()->getName();
    $name =  'system' . ( ! empty($name) ? '.' : '') . $name;

    if (!UserHelper::hasPermission($name)) {
        App::abort(401, 'You are not authorized to access route '.$name);
    }
});

ルートに before フィルターを配置することで、フィルターを適用できます。

Route::group(array('before' => 'permissions'), function()
{
    // routes
}

このシステムでは、次のような権限グループを作成できます。

Sentry::getGroupProvider()->create(array(
    'id' => 1,
    'name'        => 'Super Administrators',
    'permissions' => array(
        'system' => 1,
    ),
));

Sentry::getGroupProvider()->create(array(
    'id' => 2,
    'name'        => 'Administrators',
    'permissions' => array(
        'system.users' => 1,
        'system.products' => 1,
        'system.store' => 1,
        'system.profile' => 1,
    ),
));
Sentry::getGroupProvider()->create(array(
    'id' => $id++,
    'name'        => 'Managers',
    'permissions' => array(
        'system.products' => 1,
        'system.store' => 1,
        'system.profile' => 1,
    ),
));

したがって、ユーザーがsystem.products許可を持っていれば、すべての製品ルートを使用できます。

さて、特定のグループへのリンクを表示したい部分については、次のようなヘルパーでそれを行うことができます:

public static function has($permission)
{
    $all = [];
    $parts = explode('.',$permission);
    $permission = '';

    foreach($parts as $part) {
        $permission .= (!empty($permission) ? '.' : '') . $part;
        $all[] = $permission;
    }

    return Sentry::check() and Sentry::getUser()->hasAnyAccess($all);
}

ルート名 (system.products など) を関数に渡すだけで、ユーザーがアクセスできるかどうかが返されます。ソース: https://laracasts.com/forum/conversation/post/2819

于 2014-04-02T16:45:38.017 に答える