Wai*_*ein 6 laravel laravel-controller laravel-authentication
我正在开发Laravel应用程序。我的应用程序使用Laravel内置的身份验证功能。当用户注册时,在Laravel身份验证中,将发送验证电子邮件。当用户验证电子邮件时,请单击电子邮件中的链接,如果用户尚未登录,则该用户必须再次登录以确认电子邮件。
验证控制器
class VerificationController extends Controller
{
use VerifiesEmails, RedirectsUsersBasedOnRoles;
/**
* Create a new controller instance.
* @return void
*/
public function __construct()
{
$this->middleware('auth');
$this->middleware('signed')->only('verify');
$this->middleware('throttle:6,1')->only('verify', 'resend');
}
public function redirectPath()
{
return $this->getRedirectTo(Auth::guard()->user());
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试在此行发表评论。
$this->middleware('auth');
Run Code Online (Sandbox Code Playgroud)
但这不起作用,而是抛出一个错误。即使用户未登录,如何使Laravel能够验证电子邮件?
首先,$this->middleware('auth');像您一样删除该行。
接下来,将verify方法从VerifiesEmails特征复制到您的特征VerificationController并进行一些更改。该方法应如下所示:
public function verify(Request $request)
{
$user = User::find($request->route('id'));
if ($user->markEmailAsVerified())
event(new Verified($user));
return redirect($this->redirectPath())->with('verified', true);
}
Run Code Online (Sandbox Code Playgroud)
这将覆盖特征中的方法VerifiesUsers并删除授权检查。
安全性(如果我输入错误,请纠正我!)
由于请求已签名并验证,因此它仍然是安全的。如果某人可以某种方式访问验证电子邮件,则可以验证另一个用户的电子邮件地址,但是在99%的情况下,这根本没有风险。
这是针对该问题的更面向未来的解决方案:
\n\nclass VerificationController extends Controller\n{\n\n // \xe2\x80\xa6\n\n use VerifiesEmails {\n verify as originalVerify;\n }\n\n /**\n * Create a new controller instance.\n *\n * @return void\n */\n public function __construct()\n {\n $this->middleware(\'auth\'); // DON\'T REMOVE THIS\n $this->middleware(\'signed\')->only(\'verify\');\n $this->middleware(\'throttle:6,1\')->only(\'verify\', \'resend\');\n }\n\n /**\n * Mark the authenticated user\'s email address as verified.\n *\n * @param Request $request\n * @return Response\n *\n * @throws AuthorizationException\n */\n public function verify(Request $request)\n {\n $request->setUserResolver(function () use ($request) {\n return User::findOrFail($request->route(\'id\'));\n });\n return $this->originalVerify($request);\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n因此,当未经身份验证的用户单击电子邮件确认链接时,将会发生以下情况:
\n\n1此时电子邮件不会被标记为已确认。
\n\n2用户可能多次输入错误的凭据。一旦他输入正确的凭据,他就会被重定向到预期的电子邮件确认 URL。
\n| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |