繁体   English   中英

如何检查用户是否有权在 Laravel 中访问此功能

[英]How to check if user has permission to access this function in Laravel

我有一个检查用户是否有权限的函数,它返回Boolean

问题是

我如何签入每个功能用户是否有权限。 例如在用户控制器中,我有 2 个功能:

  1. index():显示所有用户
  2. delete($id):删除单个用户

指数():

public function index () {
    if(Auth::user() -> hasPermissionTo('show all users')) {
        // continue for API
    } else {
        // response with error for API
    }
}

我知道有更好的方法可以做到这一点,因为我不想在我的所有函数中重复这个 if 语句。

我试图做的事情:

我试图创建一个辅助函数来检查用户是否有权限,如果用户没有权限则返回响应错误。 并在每个函数中调用它,但它不起作用。

辅助功能代码:

if(!function_exists('userHasPermission')) {
    function userHasPermission ($permission) {
        $main_permission = 'do everything';
        if (!Auth::user() -> hasPermissionTo($main_permission) || !Auth::user() -> hasPermissionTo($permission)) {
            $res = trans('api_responses.authorization_failed');
            return Response::json([
                'message'   =>  $res['message'],
                'code'      =>  $res['code']
            ], $res['code']);
        }
    }
}

索引函数调用

public function index()
    {
        // PERMISSIONS CHECK
        userHasPermission('users show active');
        $getUsers = $this -> users -> getAllActive();
        return Response::json($getUsers);
    }

但即使用户没有权限,它也永远不会返回错误响应,甚至它在我的助手中输入了 if 语句!

您的辅助函数会返回一个新的响应,但不会将其作为HTTP响应返回给控制器,因此您可以像这样获得返回的值:

public function index()
    {
        // PERMISSIONS CHECK
        $response = userHasPermission('users show active');


        $getUsers = $this -> users -> getAllActive();
        return Response::json($getUsers);
    }

因此,您需要检查响应是否具有值,但是使用这种方法,您将遇到与第一个相同的问题。

解决方案:从辅助函数中引发异常,而不是返回一些响应。

更好的解决方案是使用FormRequest,选中此链接即可,请确保选中“授权表单请求”部分,其中指明了authorize函数。

编辑:

您需要执行以下操作:

创建新类,我们将其命名为“ FormRequest”类的“ IndexRequest”,然后实现authorize方法。

所以像这样:

class IndexRequest extends FormRequest
{
      /**
      * Determine if the user is authorized to make this request.
      *
      * @return bool
      */
      public function authorize()
      {
          return Auth::user() -> hasPermissionTo('show all users');
      }

          /**
      * Get the validation rules that apply to the request.
      *
      * @return array
      */
     public function rules()
     {
         return [
         ];
     }
 }

然后在您的方法中:

public function index(IndexRequest $request)
{
   $getUsers = $this -> users -> getAllActive();
   return Response::json($getUsers);
}

您不必手动检查它,Laravel将使用IndexRequest类的“授权”功能为您完成检查。

使用Laravel,您可以为此使用门。

在您的App \\ Providers \\ AuthServiceProvider文件中,执行以下操作:

public function boot()
{
    $this->registerPolicies();

    Gate::define('do-everything', function ($user) {
        return $user->hasPermission('do-everything');
    });

    Gate::define('do-one-thing', function ($user) {
        return $user->hasPermission('do-one-thing');
    });
}

然后在您的控制器中:

if (Auth::user()->can('do-everything')) {
    // the user can do everything
}

if (Auth::user()->can('do-one-thing')) {
    // the user can just do one thing
}

要么

if (!Auth::user()->can('do-everything')) {
    abort(403);
}
// user has permission to the everything from here on

或者在您的route / web.php中,您可以执行以下操作:

Route::get('/things', 'ThingController@action')->middleware(['can:do-one-thing']);

或者您可以按以下方式对路线进行分组:

Route::middleware(['can:do-everything'])->group(function () {
    Route::get('/things', 'ThingController@index');
    Route::get('/other-things', 'OtherThingController@index');
    ...
}

您也可以查看https://laravel.com/docs/5.7/authorization了解更多想法。

这种检查多权限的决定方法

  @php
                        $patients_menu_item=0;
                        $users_menu_item=0;
                        $roles_menu_item=0;
                            if(Auth::user() -> hasPermissionTo('Patient Add')||Auth::user() -> hasPermissionTo('Patients List')) {
                              $patients_menu_item=1;
                            }
                            if(Auth::user() -> hasPermissionTo('User Add')||Auth::user() -> hasPermissionTo('Users List')) {
                              $users_menu_item=1;
                            }
                            if(Auth::user() -> hasPermissionTo('Role Add')||Auth::user() -> hasPermissionTo('Roles List')) {
                              $roles_menu_item=1;
                            }
                    @endphp
                    @if($patients_menu_item == 1)
                        <li class="has-sub">
                            <a>
                                <i class="ft-users"></i><span class="menu-title">Patients</span>
                            </a>
                            <ul class="menu-content">
                                @can('Patient Add')
                                    <li>
                                        <a href="{{url('patients/register')}}"
                                           class="menu-item">Register Patient</a>
                                    </li>
                                @endcan
                                @can('Patients List')
                                    <li>
                                        <a href="{{url('patients/index')}}"
                                           class="menu-item">{{ trans('website.Show Patients') }}</a>
                                    </li>
                                @endcan
                            </ul>
                        </li>
                    @endif

另一种检查控制器内部权限的简单方法

use Illuminate\Http\Request; //don't forget to include on top
public function index(Request $request)
{
   if($request->user()->canDo('permission you need to check'))
      userHasPermission('users show active');
      $getUsers = $this -> users -> getAllActive();
      return Response::json($getUsers);
   }
   return Response::json(['Unaurthrorized']);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM