【发布时间】:2014-10-19 20:54:11
【问题描述】:
我的应用程序有 3 种不同的场景:
- 只有授权用户才能访问控制器操作
- 控制器操作仅供非授权用户访问
- 任何用户都可以访问控制器操作,但已完成身份验证检查
前两个场景由简单的过滤器处理,由于所有场景在逻辑上都相似,看来其余场景也应该由过滤器处理。
所以,我想做的是:
当用户访问某些特定的控制器操作(即HomeController@getIndex)时,过滤器应检查用户是否被授权,将控制器的$user 属性设置为Auth::user() 值并在所有视图之间共享此值。这是我想出的代码:
Router::filter('auth', function() {
$route = Str::parseCallback(Route::currentRouteAction(), null); // 0 - controller name, 1 - controller action name
$controller = App::make($route[0]);
$user = Auth::user();
$controller->user = $user;
View::share('user', $user);
return $controller->{$route[1]}();
});
此代码有效,但是控制器被调用了两次(即当控制器操作没有 return 构造时),并且 auth 过滤器在调用任何其他 'before' 过滤器之前调用控制器。
第二种解决方案:
创建AuthController,并使用它的构造函数设置$user 属性,但是将为每个子控制器操作调用构造函数(我只想在特定操作上运行它,所以我认为过滤器是要走的路)。
第三种解决方案:
创建UserRepository 并编写一个方法,该方法将执行所有身份验证内容,并从需要身份验证的操作中调用它(不设置$user 属性)。对于几行代码,这种解决方案似乎有点过头了。
第四个解决方案:
将Auth::user() 值直接传递给控制器操作(作为参数),但我还没有找到任何方便的方法。
是否有任何一种“最佳实践”解决方案来以所述方式处理身份验证? 有没有其他方法可以解决这个问题?
【问题讨论】:
-
当您使用
App::make()实例化您的控制器时,您是否设置了服务提供商?您是否有理由不能在控制器中使用自动依赖注入?如果您只想将经过身份验证的用户模型传递给您的所有视图,为什么不直接使用View::share('user', Auth::user()); -
@user3158900 不,我没有任何控制器的自定义服务提供商。 “有没有理由你不能在你的控制器中使用自动依赖注入” - 这部分我不清楚。你能举个例子吗?是的,我想在视图之间共享变量并且(设置控制器属性或以任何其他方式将变量传递给特定(不是每个)控制器操作)
标签: php authentication laravel filter controller