如何在 Laravel 中检查用户是否有权访问此功能
How to check if user has permission to access this function in Laravel
我有一个检查用户是否有权限的函数,它 return Boolean.
问题是
我如何检查每个功能用户是否有权限。
例如在 users controller 我有 2 个功能:
- index(): 显示所有用户
- delete($id): 删除单个用户
index():
public function index () {
if(Auth::user() -> hasPermissionTo('show all users')) {
// continue for API
} else {
// response with error for API
}
}
我知道有更好的方法来做到这一点,因为我不想在我的所有函数中重复这个 if 语句。
我尝试做的事情:
我尝试创建一个辅助函数来检查用户是否有权限,return 如果用户没有权限则返回响应错误。
并在每个函数中调用它,但它没有用。
辅助函数代码:
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);
}
但它永远不会 return 错误响应,即使用户没有权限,甚至它在我的助手中输入了 if 语句!
你的辅助函数 returns 一个新的响应,但它 returns 它给控制器而不是 HTTP 响应,所以你可以像这样获得返回值:
public function index()
{
// PERMISSIONS CHECK
$response = userHasPermission('users show active');
$getUsers = $this -> users -> getAllActive();
return Response::json($getUsers);
}
所以你需要的是检查响应是否有值
但是使用这种方法,您将遇到与第一个方法相同的问题。
解决方法:从辅助函数中抛出异常,而不是返回一些响应。
更好的解决方案 是使用 FormRequest,检查这个 link 来做,一定要检查说明授权功能的 "Authorizing Form Requests" 部分。
编辑:
您需要做的是:
创建新的 class 我们称之为 "IndexRequest" 继承自 "FormRequest" class,然后实现授权方法。
所以像这样:
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 class.
的 "authorize" 函数为您完成
有了 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
或者在您的 routes/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 以获得更多想法。
这种方式检查多权限决定sho
@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']);
}
我有一个检查用户是否有权限的函数,它 return Boolean.
问题是
我如何检查每个功能用户是否有权限。 例如在 users controller 我有 2 个功能:
- index(): 显示所有用户
- delete($id): 删除单个用户
index():
public function index () {
if(Auth::user() -> hasPermissionTo('show all users')) {
// continue for API
} else {
// response with error for API
}
}
我知道有更好的方法来做到这一点,因为我不想在我的所有函数中重复这个 if 语句。
我尝试做的事情:
我尝试创建一个辅助函数来检查用户是否有权限,return 如果用户没有权限则返回响应错误。 并在每个函数中调用它,但它没有用。
辅助函数代码:
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);
}
但它永远不会 return 错误响应,即使用户没有权限,甚至它在我的助手中输入了 if 语句!
你的辅助函数 returns 一个新的响应,但它 returns 它给控制器而不是 HTTP 响应,所以你可以像这样获得返回值:
public function index()
{
// PERMISSIONS CHECK
$response = userHasPermission('users show active');
$getUsers = $this -> users -> getAllActive();
return Response::json($getUsers);
}
所以你需要的是检查响应是否有值 但是使用这种方法,您将遇到与第一个方法相同的问题。
解决方法:从辅助函数中抛出异常,而不是返回一些响应。
更好的解决方案 是使用 FormRequest,检查这个 link 来做,一定要检查说明授权功能的 "Authorizing Form Requests" 部分。
编辑:
您需要做的是:
创建新的 class 我们称之为 "IndexRequest" 继承自 "FormRequest" class,然后实现授权方法。
所以像这样:
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 class.
的 "authorize" 函数为您完成有了 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
或者在您的 routes/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 以获得更多想法。
这种方式检查多权限决定sho
@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']);
}