我正在开发一个Laravel ACL系统。我的基本表是用户、角色、权限
,透视表是角色用户、角色权限、用户权限
。
我想使用我的自定义中间件HasPermission
检查用户权限。我试过这种方法,但效果不好。每个用户都可以访问所有具有或不具有的权限。
现在,我该如何解决这个问题。请看我的代码示例。
我的控制器。
function __construct()
{
$this->middleware('auth');
$this->middleware('HasPermission:Role_Read|Role_Update|Role_Delete');
}
我的中间件。
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
// $user = $this->auth->user();
foreach($permissions_array as $permission){
if(!$request->user()->hasPermission($permission)){
return $next($request);
}
}
return redirect()->back();
}
}
还有,我的用户
模型方法。
public function user_permissions()
{
return $this->belongsToMany(Permission::class,'user_permission');
}
public function hasPermission(string $permission)
{
if($this->user_permissions()->where('name', $permission)->first())
{
return true;
}
else
{
return false;
}
}
在我的例子中,我只是添加了一个简单的函数来从数据库获取权限,然后检查它。检查此代码:
//添加新函数以从数据库获取权限
public static function user_permissions($user) {
$permissions=DB::table('permissions')->where('user_id', $user)->first();
return $permissions;
}
//在中间件中检查您的权限
if(Auth::guest())
{
return redirect('/');
}
elseif(Functions::user_permissions(Auth::user()->id)->user_managment != 1) {
return redirect('/');
} else {
return $next($request);
}
基本上$请求-
如果您需要用户具有指定的权限之一,您需要执行以下操作:
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
foreach($permissions_array as $permission){
if ($request->user()->hasPermission($permission)){
return $next($request);
}
}
return redirect()->back();
}
}
如果您希望用户拥有所有指定的权限,您需要执行以下操作:
class HasPermission
{
public function handle($request, Closure $next,$permissions)
{
$permissions_array = explode('|', $permissions);
foreach($permissions_array as $permission){
if (!$request->user()->hasPermission($permission)){
return redirect()->back();
}
}
return $next($request);
}
}
作为补充说明,如果您想以更优雅的方式进行此操作,您可以:
class HasPermission
{
public function handle($request, Closure $next, ...$permissions_array)
{
//Function body from above without the explode part
}
}
和
function __construct()
{
$this->middleware('auth');
$this->middleware('HasPermission:Role_Read,Role_Update,Role_Delete');
}
如果您使用逗号,那么框架将为您将字符串拆分为参数。
最好的方法是,您需要引入一个新的服务提供商,这样您就可以检查授权和权限。
我做了一个db驱动权限的测试项目(去年),我使用了服务提供商。
这是实现的最佳方式。
我有一个简单的中间件,它检查用户会话中是否有密钥。 问题是我总是得到“未按请求设置会话存储”错误这是我的路线: 我在app\Http\K中添加了中间件ernel.php变量$middleware 我也试着改变我的路线: 但这不起作用。知道如何确保会话已经启动,或者在调用中间件之前启动它吗?我用的是Laravel 5.3
现在,我正在使用类似的方法来验证我的基本站点上的用户: 如何修改使用自定义列作为用户名的代码?https://laravel.com/docs/5.3/passport#password-grant-tokens
问题内容: 在将旧版应用程序迁移到Spring Security时,出现以下异常: 在旧的应用程序中,角色有“超级管理员”,“编辑者”,“帮助台”等。但是在所有Spring Security示例中,我仅看到诸如“ ROLE _”(“ ROLE_ADMIN”等)的角色。当我将“ superadmin”重命名为“ ROLE_ADMIN”并且仅在配置中使用此角色时,一切正常。 不起作用: 作品: 可以使
我已经创建了一个新的中间件名称Adminpanel 和注册中间件 和路线 }); 但当我运行时,它要求我尝试获取非对象的属性,这意味着我不能在这里访问Auth类,有人能告诉我错误是什么以及如何在中间件中访问Auth Facade吗。 这是我的身份验证码 谢谢
嗨,我对auth()有问题- 这里是一个简单的服务提供商 一条简单的路线。 我在Kernel.php注册了中间件 然后我只是在aController.php中调用_构造函数 我知道名字是愚蠢的名字,但这只是一个例子,我只是在学习。 谢谢你的回答。 PS:所有这些文件都在/vendor文件夹中 即使在_构造函数(){$This中使用,也会发生这种情况-
我有一个Laravel5.4应用程序,在其中我必须通过外部API验证我的管理员用户,当成功登录时,它会返回一个包含用户信息的JSON。 我正在创建一个自定义保护,使此: 这是我的定制提供商: 在那之后,我不知道如何继续。我读过一些教程,比如George Buckingham的教程,我创建了一个自定义用户提供程序(现在我只需要它从EloquentUserProvider扩展,最终我将覆盖一些函数以连