laravel 访问级别管理(基于关系的用户权限数组)
laravel access level management (user permission array base on relations)
我的想法是不仅要有用户组,还要有权限组。以下是数据库模式的外观:
database schema
我将我的数据库关系定义为:
userModel.php
public function roles()
{
return $this->belongsToMany('App\Models\RoleModel', 'role_member', 'user_id', 'role_id');
}
roleModel.php
public function permissions(){
return $this->belongsToMany('App\Models\PermissionModel' , 'role_permission' , 'role_id' , 'permission_id');
}
我应该让我的中间件通过权限并根据请求的路由或视图决定拒绝或访问。是否有任何关于拥有 Auth::user
权限数组并拒绝重复值的想法,或者有任何想法以更好的方式做到这一点?
最后我觉得这个可以了。
有更好的解决方案吗?
public function permissions()
{
$user_permissions = [];
foreach ($this->roles as $role){
foreach ($role->permissions as $permission)
{
array_push($user_permissions , $permission->permission);
}
}
$user_permissions = array_unique($user_permissions);
return $user_permissions;
}
这是我用来检查授权用户访问级别的中间件。
public function handle($request, Closure $next , $param)
{
$user_permissions = Auth::user()->permissions();
if (in_array($param , $user_permissions))
return $next($request);
return abort(403);
}
现在将中间件定义为 AccessLevel
中间件,在任何地方使用它,例如路由并像这样发送参数。
Route::post('create_new_profile', 'AdminProfileController@create', ['middleware' => 'AccessLevel:create_new_profile']);
我的想法是不仅要有用户组,还要有权限组。以下是数据库模式的外观: database schema
我将我的数据库关系定义为:
userModel.php
public function roles()
{
return $this->belongsToMany('App\Models\RoleModel', 'role_member', 'user_id', 'role_id');
}
roleModel.php
public function permissions(){
return $this->belongsToMany('App\Models\PermissionModel' , 'role_permission' , 'role_id' , 'permission_id');
}
我应该让我的中间件通过权限并根据请求的路由或视图决定拒绝或访问。是否有任何关于拥有 Auth::user
权限数组并拒绝重复值的想法,或者有任何想法以更好的方式做到这一点?
最后我觉得这个可以了。 有更好的解决方案吗?
public function permissions()
{
$user_permissions = [];
foreach ($this->roles as $role){
foreach ($role->permissions as $permission)
{
array_push($user_permissions , $permission->permission);
}
}
$user_permissions = array_unique($user_permissions);
return $user_permissions;
}
这是我用来检查授权用户访问级别的中间件。
public function handle($request, Closure $next , $param)
{
$user_permissions = Auth::user()->permissions();
if (in_array($param , $user_permissions))
return $next($request);
return abort(403);
}
现在将中间件定义为 AccessLevel
中间件,在任何地方使用它,例如路由并像这样发送参数。
Route::post('create_new_profile', 'AdminProfileController@create', ['middleware' => 'AccessLevel:create_new_profile']);