如果我在中间件中进行身份验证并将一些数据添加到\Illuminate\Http\Request $request
对象并通过将\Illuminate\Http\Request $request
注入控制器方法在控制器中使用该数据,那么这是明智的吗?
原因是,应用程序需要进行数据库调用以查明凭据是否有效,如果是,则返回类似我在后续数据库操作中使用的主键。
此刻,一切都在控制器中完成。如果我要使用单独的中间件进行身份验证,如果中间件检查通过,我可以将我的控制器所需的数据绑定到请求对象吗?如果是的话,我应该怎么做呢?
灵感 - Expressjs通过一堆中间件/路由在请求中绑定和传递数据的方式。
答案 0 :(得分:6)
我不明白 - 你为什么不使用Laravel身份验证器?
你说:
原因是,应用程序需要进行数据库调用以查明凭据是否有效,如果是,则返回类似我在后续数据库操作中使用的主键。
这正是Laravel Authenticator的作用吗?
然后在你的控制器中你可以做到
`auth()->user()` // gives you the user record
`auth()->id()` // user_id from the DB
`auth()->user()->name` // gives you the `name` column off the record. You can change it to anything.
编辑:同时 - 在使用旧系统进行身份验证时,您仍然可以使用Laravel Authenticator程序包。在您的中间件中,您可以执行以下操作:
if (doLegacyCheckHere()) {
Auth::loginUsingId(1);
}
这意味着您可以通过neo4j图形数据库进行检查 - 如果它返回true
用户已正确认证 - 那么您只需将它们自己登录到Laravel系统。
答案 1 :(得分:2)
是的,这可能是一种很好的方法,因为内置的Laravel身份验证系统的工作方式相同:您可以通过$request::user()
访问登录用户。见http://laravel.com/docs/5.0/authentication#retrieving-the-authenticated-user
答案 2 :(得分:1)
可以在中间件中验证auth。在我的应用程序中,我们使用相同的功能来检查用户是否发送了正确的access_code来访问API方法。甚至Laravel本身也通过Authenticate中间件处理受保护的路由。
问题是,没有关于如何或在何处存储其他数据的灵丹妙药。
一种方法是将其存储在用户的会话中。
第二种是使用public void saveSite(ISite siteObj){
Assert.notNull(siteObj);
merge((Site) siteObj);
}
类本身。您可以将其注入中间件Illuminate\Foundation\Application
并使用它来保存数据。 __constructor()
类扩展了实现ArrayAccess接口的Container类,允许您访问它的属性,就像它是一个数组一样。这样,您不仅可以从应用程序中获取变量,还可以存储它们。虽然最简单,但不是最好的方式。
Application
还有更多这样的黑客,但这些是最简单的。