Laravel中的“直接”资源授权非常简单明了。您需要创建策略,在其中实现方法,注册策略并使用User::can
方法检查授权:
class PostPolicy
{
/**
* Checks whether a user can view a post
*/
public function view(User $user, Post $post)
{
return $user->id === $post->author_id || $user->group_id === $post->group_id;
}
}
if (!$user->can('view', $post)) {
abort(403);
}
但是“反向”授权呢?说“反向授权”是指获取用户被授权的资源。至于上面的示例,它正在获取用户可以查看的帖子:
function getPostsUserCanView(User $user)
{
return Post::where('author_id', $user->id)->orWhere('group_id', $user->group_id)->get();
}
$posts = getPostsUserCanView($user);
将getPostsUserCanView
函数的逻辑放在Laravel应用程序中的适当或最佳位置是什么?你如何在你的应用程序中解决这个问题?
答案 0 :(得分:2)
为此,您可以直接使用Relationships。
在Post
模型中:
...
public function posts()
{
return $this->hasMany('App\Models\Post', 'employee_id','user_id');
}
...
然后你可以这样做:
public function getPostsUserCanView()
{
$posts = auth()->user()->posts;
return $posts;
}
auth()->user()
为您提供登录用户,然后posts
方法(定义{{1}}和User
模型之间的关系)将收集所有帖子Post
等于$author_id
的{{1}}(在我的示例中为$primaryKey
)。
如果它是一个小应用程序,您可以将该逻辑直接存储在控制器中,但如果您想要解耦更多代码,您可以执行以下操作:
1 - 用户存储库:进行与数据库的所有交互。基本的CRUD功能。这会隔离应用程序使用的驱动程序以保留数据 2 - 用户服务:其中包含与用户相关的所有操作。此类可以调用存储库来修改数据,但也可以使用其他功能,如管理关系等。这可以避免控制器与模型交互 3 - 用户控制器:控制器基本上是应用程序的粘合剂,它调用不同服务(模型)的方法相互交互。
这样你的类只有一个目的。正如SOLID所述。