我应该在模型上放置关于身份验证的逻辑吗?

时间:2019-04-03 20:27:48

标签: laravel

我正在开发一个涉及身份验证和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
}

在模型上放置这种逻辑是否正确?

3 个答案:

答案 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。