我正在开发一个涉及身份验证和acl文件的应用程序。
现在,我想在名为“ userCanAccess”的文件模型上编写一个方法,以检查给定的用户/用户角色是否在文件acl中。 代码将遵循以下原则:
public function userCanAccess($user = null) {
$user = is_null($user) ? auth()->user() : $user;
if($this->acl->users->contains($user)
|| $this->acl->roles->contains($user->role)) {
return true;
}
return false
}
在模型上放置这种逻辑是否正确?
答案 0 :(得分:2)
Laravel具有完善的内置功能,称为Policies。
您将创建一个适用于文件模型的FilePolicy
:
php artisan make:policy FilePolicy --model=File
,然后在生成的app/Policies/FilePolicy.php
中,您会看到一些可以随时编辑的现有策略,其中一项称为view
。将您的授权逻辑放在这里。
一旦构建了该策略,就可以通过多种方式来应用该策略,例如控制器功能,路由上的中间件,或者直接使用@can
Blade指令在视图内。
https://laravel.com/docs/5.8/authorization#authorizing-actions-using-policies
答案 1 :(得分:0)
这对我来说应该可以正常工作,但与其轰炸模型类,不如将其提取为特征。
答案 2 :(得分:0)
您可以创建角色和权限表
用户模型:
public function roles()
{
return $this->belongsToMany(Role::class);
}
角色模型:
public function users()
{
return $this->belongsToMany(User::class);
}
public function permissions()
{
return $this->belongsToMany(Permission::class);
}
权限模型:
public function roles()
{
return $this->belongsToMany(Role::class);
}
然后在app / Providers / AuthServiceProvider中,可以使Gate像这样:
public function boot()
{
$this->registerPolicies();
foreach ($this->getPermissions() as $permission) {
Gate::define($permission->name,function($user) use($permission){
return $user->hasRole($permission->roles);
});
}
}
private function getPermissions(){
return Permission::with('roles')->get();
}
最后,只需编写Gate名称,例如show-comments或access-files或...,即可在所需的任何地方使用ACL。