使用Laravel 5.8版
因此,我对Laravel仍然不满意。我花了一天的大部分时间来了解它的工作原理。虽然我仍然不确定100%,但我想我已经提出了一些半基础的问题。
关于我的应用程序:我主要使用LDAP进行身份验证和初始用户数据(名字,姓氏和电子邮件地址)。在本地,我有一个“用户”数据库表。该表没有完全遵循雄辩的命名约定,但是我确实为其定义了一个“用户”模型(有效)。这个用户表基本上跟踪了LDAP中不存在(也不存在)的一堆特殊用户标志和权限。
我实际上尚未实现auth例程。但是首先,让我看看我是否理解正确:
我应该创建一个扩展默认(Illuminate \ Auth \ Guard)类的Guard,对吗?如果给定的一组凭据(用户名/密码)是“正确的”,则Guard负责“询问”“ UserProvider”,并要求“保持登录状态”之类的“用户信息”?
我还应该创建一个自定义的“ UserProvider”吗?我不确定这是干什么的。为什么防护程序不直接与用户模型(数据库表模型)对话? “ UserProvider”是否还必须实现身份验证检查例程?我以为Guard在调用UserProvider:PerformSomeKindOfAuthCheck(),这使Guard看起来几乎是多余的,除了它还处理会话存储。
我认为流程将像这样:
1)我的自定义防护人员将调用我的自定义LDAP库,以询问给定的用户名/电子邮件和密码是否正确。如果正确,我要求输入名字和姓氏。
2)接下来,我的自定义防护人员需要使用给定的电子邮件地址/名字/姓氏致电自定义用户提供程序。
3)UserProvider在本地数据库中查找给定的电子邮件。如果找到,它将确保更新名字和姓氏。如果找不到,它将插入一条新记录。无论哪种情况... UserProvider都必须向防护员返回某种用户ID-这样防护员才知道如何启动某种唯一的会话ID-对吗?
我假设在正常情况下,UserProvider会调用普通的有说服力的用户模型?
我对100%的其他方面尚不清楚:
1)我是否需要对AuthServiceProvider进行Auth :: extend扩展,还是通过在config / auth.php中定义Guard和UserProvider来完成同一件事?这本质上是两种基本完成同一件事的方法吗?
2)在config / auth.php中,每个警卫都有一个“密码”键。我以为“密码”是由UserProvider提取的?
3)如果我像这样在config / auth.php中定义了一个Guard:
'MyGuard' => [ 'driver' => 'session', 'provider' => 'MyUsers' ]
然后,我需要将以下内容添加到提供程序中:
'MyUsers' => [ 'driver' => ??, 'model' => App\?? ]
驱动程序..这应该是什么?模型...模型是否在UserProvider实例中?还是这可以是必须实现固定方法列表的任意类?必须静态调用这些方法,还是必须使用依赖注入将它们作为对象?和男人..如果“模型”应该抽象出细节,我仍然不理解“驱动程序”!
4)如果执行了上述操作,将使用默认的Guard(不是我的自定义)-对吗?并且默认情况下将期望我的自定义UserProvider同时处理LDAP详细信息和DB例程-对吗?
5)如果我创建了上述“ MyGuard”,则可以保护这样的一组路由:(?)
Route::get('/My/Url','MyController@Foo')
->middleware('auth:MyGuard');
或...(??)
Route::group(['middleware'=>'auth:MyGuard'],function(){
-- routes go here --
});
每个人都有一个链接,它可以给我一些实际的例子,其中有人做了类似的事情?同样,我没有使用脚手架代码,我的表是非标准的,并且我使用LDAP进行密码检查。
老实说,我曾想过只编写自己的简单中间件,该中间件仅适用于表示“如果未设置session ['user_id']且url不以“ / login”开头的Web请求,然后重定向到登录,因为这样非常容易。我迫切需要重置丢失的密码,“记住我的登录名”等。一个带有电子邮件/密码的ajax请求发送到普通的/ Login / Validate控制器。该控制器询问我的LDAP库如果用户良好,则运行插入操作,并使用onplicate键更新子句,然后获取用户ID并将其粘贴在会话中;在客户端,如果返回0,则登录不好,如果大于0,必须是有效的用户ID,并且登录成功,然后重定向到信息中心。
我已经编写了LDAP例程,因为这些例程正在编写的整个公司的其他项目中使用。
Laravel文档似乎都假设几乎每个人都在使用预先打包的用户表,并且我们将始终希望使用其脚手架登录视图。它并没有真正探讨如何用自己的组件替换每个组件,为每个组件实现的基本方法以及期望的返回值。至少不在一个连贯的位置。它还假定对身份验证凭证的验证以及用户信息的存储是原子的-所有这些都包含在一个逻辑组件中。我在这里错了吗?