当前位置: 首页 > 后端技术 > PHP

9个LaravelAuth脚手架相关技巧

时间:2023-03-29 19:54:02 PHP

转载自Laravel论坛:https://learnku.com/laravel/t...Laravel有现成的很棒的用户认证系统,当然我们还需要在一个某些地方自定义一些配置。对于一些自定义的配置,我们不需要找扩展包,也不需要写很多代码。让我们来看看这个身份验证系统背后隐藏着哪些有趣的功能。Tips1.Auth::routes()参数我们应该都知道方法Auth::routes()来自于LaravelUI包(在Laravel7之前,它被包含在核心中)。但是你知道它可以接受一个数组来启用/禁用特定的身份验证路由吗?对于Laravel7,以下参数可用及其默认值:Auth::routes(['login'=>true,'logout'=>true,'register'=>true,'reset'=>true,//用于密码重置'confirm'=>false,//用于额外的密码确认'verify'=>false,//用于电子邮件身份验证]);这些参数仅启用或禁用某些路由。要了解它们是如何工作的,您可以查看LaravelUI中的AuthRouteMethods文件:returnfunction($options=[]){//Loginroute...if($options['login']??true){$this->get('登录','Auth\LoginController@showLoginForm')->name('登录');$this->post('登录','Auth\LoginController@login');}//注销路由...if($options['logout']??true){$this->post('logout','Auth\LoginController@logout')->name('logout');}//注册路由。..if($options['register']??true){$this->get('register','Auth\RegisterController@showRegistrationForm')->name('register');$this->post('注册','Auth\RegisterController@register');}//密码重置路由...if($options['reset']??true){$this->resetPassword();}//密码确认路由...if($options['confirm']??class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))){$this->confirmPassword();}//邮箱验证路由...if($options['ver证明']??false){$this->emailVerification();}};Tip2.LaravelUI:Onlygeneratecontrollers官方文档详细说明了使用LaravelUI的主要方法:phpartisanuivue--auth然而,如果你不需要可视化UI,你会怎么做?如果您在框架中创建一个没有任何前端的纯API项目怎么办?您仍然可以通过安装LaravelUI并运行此命令来使用LaravelAuth及其控制器:phpartisanui:controllers它只会生成app/Http/Controllers/Auth,因此您不需要Blade或Vue文件来使用它们。在Github存储库中查看此Artisan命令的实现。技巧3.为敏感操作重新验证密码您是否曾经维护过Github存储库并尝试更改其访问设置?Github然后要求您再次输入密码以确保是您本人。从Laravel6.2开始,这个功能也被集成到框架中。您只需要将一个名为password.confirm的中间件添加到您要保护的路由。Route::get('/secrets','SecretsController@show')->middleware('password.confirm');DriesVints引用官方功能发布文章:如果你尝试访问路由,会提示你确认密码,和在GitHub等其他应用上看到的一样。确认密码后,默认情况下会在用户会话中存储一个时间戳。时间戳持续3小时,因此用户在此期间无需再次输入密码。您可以使用auth配置文件中的password_timeout配置选项自定义此持续时间。技巧4.注销其他设备从Laravel5.6开始,我们提供了一个单独的方法来自动注销使用我们帐户登录的任何其他设备或浏览器:Auth::logoutOtherDevices($password);典型的用法是在当前设备登录成功后,其他设备退出。为此,我们覆盖了TraitAuthenticatesUsers.php中的方法authenticated()并将其放在app/Http/Controllers/Auth/LoginController.php中:('password'));}另外别忘了激活app/Http/Kernel.php文件中的中间件AuthenticateSession,默认注释为:protected$middlewareGroups=['web'=>[\App\Http\Middleware\EncryptCookies::class,\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,\Illuminate\Session\Middleware\StartSession::class,//\Illuminate\Session\Middleware\AuthenticateSession::类,\Illuminate\View\Middleware\ShareErrorsFromSession::class,\App\Http\Middleware\VerifyCsrfToken::class,\Illuminate\Routing\Middleware\SubstituteBindings::class,],登录/注册后的重定向:自定义逻辑默认Laravel的LoginController和RegisterController具有相同的属性:classRegisterControllerextendsController{protected$redirectTo=RouteServiceProvider::HOME;因此,您可以指定成功登录/注册后重定向到的URL默认值在app/Providers/RouteServiceProvider.php中:classRouteServiceProviderextendsServiceProvider{publicconstHOME='/home';如何定制?首先,您可以分别为登录和注册控制器的$redirectTo属性指定附加值。但是如果你有更复杂的动态重定向逻辑,例如基于用户角色?您可以在身份验证控制器中创建一个redirectTo()方法,然后在其中指定条件。此方法将覆盖$redirectTo属性的任何值。参见示例:classRegisterControllerextendsController{protected$redirectTo=RouteServiceProvider::HOME;protectedfunctionredirectTo(){if(auth()->user()->role_id==1){return'/admin';}返回'/home';}技巧5.快速创建新用户如果您需要创建新用户,但还没有准备好注册页面怎么办?只需在您的终端中打开LaravelTinker:phpartisantinker如果您是Tinker的新手,您需要知道它是一个能够执行任何Laravel/PHP代码的命令行工具。因此,您可以在其中轻松创建用户,键入Eloquent命令并按Enter:\App\User::create(['name'=>'Admin','email'=>'admin@admin.com','密码'=>bcrypt('somesecurepassword')]);但是,如果您需要创建许多用户进行测试,比如10、100或1000,该怎么办?没问题,我们可以在database/factories/UserFactory.php中使用Laravel默认提供的Factory类:$factory->define(User::class,function(Faker$faker){return['name'=>$faker->name,'email'=>$faker->unique()->safeEmail,'email_verified_at'=>now(),'password'=>'$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi',//密码'remember_token'=>Str::random(10),];});这些是我们创建的“假”用户的默认值。为此,我们将生成一个Seeder文件:phpartisanmake:seederUsersSeeder然后,我们打开生成的文件database/seeds/UsersSeeder.php并使用以下代码填充run()方法:publicfunctionrun(){//This将创建100个用户factory(App\User::class,100)->create();要运行它,我们需要执行以下命令:phpartisandb:seed--class=UsersSeeder您可以在Laravel官方文档中了解更多关于数据库种子的信息。技巧6.使用电子邮件和/或用户名登录默认情况下,Laravel用户使用电子邮件和密码进行身份验证。但是,如果您的用户ID不使用邮箱怎么办?例如,使用用户名作为ID。您可以通过覆盖traitAuthenticatesUsers.php中的方法轻松更改此设置。这是默认值:traitAuthenticatesUsers{//...其他方法publicfunctionusername(){return'email';您可以将其复制到您的LoginController.php中,只需更改值:classLoginControllerextendsController{useAuthenticatesUsers;//...其他方法publicfunctionusername(){return'username';让我们更进一步。如果您希望用户能够使用他们的电子邮件地址或用户名登录怎么办?这样,用户就可以选择其中一个来填写“Email/Username”字段。让我们对上面的username()方法添加一个检查。我们检查输入的字符串是否是电子邮件,如果不是,我们将其视为用户名。这是一个PHP函数,甚至不是Laravel函数。classLoginControllerextendsController{//...publicfunctionusername(){returnfilter_var(request('email'),FILTER_VALIDATE_EMAIL)?'电子邮件':'用户名';}}注意:不要忘记将登录表单的输入类型更改为type="text"提示7.频繁登录请求:自定义参数如果您尝试使用无效凭据登录超过五次在同一分钟内,请求将被阻止,并显示一条消息,说明您尝试登录的次数过多。请在X秒后重试。此阻止操作将持续1分钟,并且对用户的用户名/电子邮件及其IP地址是唯一的。您可以自定义这些参数:一分钟内的无效尝试次数(默认为五次尝试)阻止登录的分钟数(默认为1分钟)这两个参数在TraitThrottlesLogins内部:traitThrottlesLogins{//...其他方法/***获取允许的最大尝试次数。**@returnint*/publicfunctionmaxAttempts(){returnproperty_exists($this,'maxAttempts')?$this->maxAttempts:5;}/***获取限制的分钟数。**@returnint*/publicfunctiondecayMinutes(){returnproperty_exists($this,'decayMinutes')?$this->decayMinutes:1;}}因此,要覆盖这些属性,可以在LoginController中指定属性:classLoginControllerextendsController{protected$maxAttempts=3;//默认为5protected$decayMinutes=2;//Defaultis1//...}Tip8.注册:默认禁用自动登录接下来,新注册的用户将自动登录并重定向到主页。如果您需要禁用此功能并显示注册成功页面而不是自动登录,您可以执行以下操作。原来的注册方法在TraitRegistersUsers里面:traitRegistersUsers{publicfunctionregister(Request$request){$this->validator($request->all())->validate();事件(新注册($user=$this->create($request->all())));$this->guard()->login($user);如果($response=$this->registered($request,$user)){return$response;返回$request->wantsJson()?newResponse('',201):redirect($this->redirectPath());所以你的目标是在RegisterController中覆盖它,然后重定向到新页面而不是登录:classRegisterControllerextendsController{useRegistersUsers;publicfunctionregister(Request$request){$this->validator($request->all())->validate();事件(新注册($user=$this->create($request->all())));returnredirect()->route('your_success_page_route_name');}Tip9.Login:additionalcheckbyemail/passwordifotherthandefault除了您的电子邮件和密码,其他检查了怎么办?例如,如果您想检查用户是否处于活动状态或未被禁止,您可以向AuthenticatesUsers特征中定义的身份验证数组添加一个额外的字段credentials:traitAuthenticatesUsers{//...protectedfunctioncredentials(Request$request){返回$request->only($this->username(),'password');}然后重写LoginController:>1];注意:这是一个有趣的便捷提示,但我建议在单独的中间件中进行此额外检查,然后向用户提供更明确的错误消息,而不是默认的凭证错误。就是这样,方便的提示,但还有很多与自定义代码和外部扩展有关的事情。请继续关注有关此主题的更多文章!讨论请到专业的Laravel论坛:https://learnku.com/laravel/t...