Laravel 5路线保护

时间:2016-06-15 18:47:24

标签: laravel routing

假设我们有一个具有多对多关系的用户和对话模型。

class User extends Model ... {

    public function conversations()
    {
        return $this->belongsToMany('App\Conversation');
    }

}


class Conversation extends Model {

    public function users()
    {
        return $this->belongsToMany('App\User');
    }

}

除了使用laravel开箱即用的身份验证(登录):如何为相关用户保护特定的会话路由?

哪种方法可以实现这一目标?中间件?守护?路线模型绑定? ......现在我有点失落......

1 个答案:

答案 0 :(得分:2)

好问题。在这种情况下,您最好使用Laravel的authorization功能。以下是不同之处:

  1. 中间件:用于根据路由或登录/注销状态运行逻辑。因此,如果您想完全阻止未登录用户的对话,请使用中间件。

  2. 授权(政策):不要与身份验证混淆,适用于阻止某人的规则不是基于路线而是基于路线的情况其他更具体的原因。这些原因可以是角色,团队,实体所有权等等。如果您只想将对话隐藏到对话中的对话,则可以创建一个策略,如果用户不在对话中,则会将用户踢回上一页。

  3. 这是您可能制定的快速政策:

    class ConversationPolicy {
    
        public function view(User $user, Conversation $conv) {
            return in_array($user->id, $conv->users->pluck('id'));
        }
    
    }
    

    您可以在控制器中检查您的政策,如下所示:

    if($request->user()->can('view', $conversation))
    {
       return view('conversation', ['conversation' => $conversation]);
    }
    
    return back()->withError('You are not authorized to view this conversation');
    

    请注意,您必须先将此政策绑定在AuthServiceProvider中才能使用。