【问题标题】:Controlling Access to Routes Laravel and Sentry控制对 Laravel 和 Sentry 路由的访问
【发布时间】:2016-03-27 21:08:03
【问题描述】:

我想知道在使用Sentry 时如何限制对routes.php 文件中某些路由的访问。目前我设置了以下路线

Route::model('book', 'Book');
Route::get('/books', 'BookController@index');
Route::get('book/create', 'BookController@create');
Route::get('book/edit/{book}', 'BookController@edit');
Route::get('book/delete/{book}', 'BookController@delete');
Route::get('book/view/{book}', 'BookController@view');
Route::post('book/create', 'BookController@handleCreate');
Route::post('book/edit', 'BookController@handleEdit');
Route::post('book/delete', 'BookController@handleDelete');

我有 2 个groups

  1. 管理员
  2. 用户

我只希望Admin 能够访问这些路由。我会很感激任何帮助

【问题讨论】:

标签: php laravel laravel-4 cartalyst-sentry


【解决方案1】:

取自 http://laravelsnippets.com/snippets/sentry-route-filters 并根据您的建议进行修改。希望这可以帮助。我最近实现了类似的东西。

您需要将失败重定向中的路由替换为您自己的。

<?php 
/**
* Sentry filter
*
* Checks if the user is logged in
*/
Route::filter('Sentry', function()
{
    if ( ! Sentry::check()) {
        return Redirect::route('cms.login');
 }
});

/**
* hasAcces filter (permissions)
*
* Check if the user has permission (group/user)
*/
Route::filter('hasAccess', function($route, $request, $value)
{
    try
    {
        $user = Sentry::getUser();

        if( ! $user->hasAccess($value))
        {
            return Redirect::route('cms.login')->withErrors(array(Lang::get('user.noaccess')));
        }
    }
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
    {
        return Redirect::route('cms.login')->withErrors(array(Lang::get('user.notfound')));
    }

});

/**
* InGroup filter
*
* Check if the user belongs to a group
*/
Route::filter('inGroup', function($route, $request, $value)
{
    try
    {
        $user = Sentry::getUser();

        $group = Sentry::findGroupByName($value);

        if( ! $user->inGroup($group))
        {
            return Redirect::route('cms.login')->withErrors(array(Lang::get('user.noaccess')));
        }
    }
    catch (Cartalyst\Sentry\Users\UserNotFoundException $e)
    {
        return Redirect::route('cms.login')->withErrors(array(Lang::get('user.notfound')));
    }
    catch (Cartalyst\Sentry\Groups\GroupNotFoundException $e)
    {
        return Redirect::route('cms.login')->withErrors(array(Lang::get('group.notfound')));
    }
});


//Example use

Route::group(array('before' => 'Sentry|inGroup:Admin'), function()
{
    Route::model('book', 'Book');
    Route::get('/books', 'BookController@index');
    Route::get('book/create', 'BookController@create');
    Route::get('book/edit/{book}', 'BookController@edit');
    Route::get('book/delete/{book}', 'BookController@delete');
    Route::get('book/view/{book}', 'BookController@view');
    Route::post('book/create', 'BookController@handleCreate');
    Route::post('book/edit', 'BookController@handleEdit');
    Route::post('book/delete', 'BookController@handleDelete');
});

【讨论】:

  • 有没有办法实现一个多重过滤器,如果至少一个过滤器为真,它将返回路由?例如像这样:Route::get('users', array('as' => 'getUsers', 'uses' => 'UsersController@getIndex', 'before' => 'inGroup:Administrator|hasAccess:users.指数'));还是我还需要为管理员组定义所有这些权限,这些权限也在其他组中?现在我只有 1 个用于全局的管理员组,因此管理员可以访问所有内容,并且特定于其他组
猜你喜欢
  • 2013-08-15
  • 2023-03-27
  • 2017-03-05
  • 1970-01-01
  • 2013-11-14
  • 2021-04-09
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
相关资源
最近更新 更多