اذهب إلى المحتوى

السؤال

نشر

أحاول استخدام البرمجية الوسيطة password.confirm في بعض مساراتي التي أحتاج إلى تأمينها. أريد أن يؤكد المستخدم كلمة المرور الخاصة به عند استخدام طلبات, ولقد تمت إضافة البرمجية الوسيطة password.confirm في الكائن routeMiddleware $ في ملف app / Http / Kernel.php. وهذا المسار الذي احاول الوصول اليه

Route::post('fetchResult', [ReportController::class, 'fetchResult'])->name('fetchComplaintResult')->middleware('password.confirm');

لكن هذا لا يعمل. عندما أقوم بطلب المسار ، يقوم بالوصول الى الدالة fetchResult  كالمعتاد, هذه الدالة

public function fetchResult(Request $request)
{
        Model::create([
            'id' => $request->id,
            'action' => $request->action,
            'comments' => $request->comment
        ]);
       // Other Action
}

هل يمكنكم مساعدتي؟ شكرا مقدما

Recommended Posts

  • 0
نشر

إذا كنت تريد أن تتم مطالبتك بتأكيد كلمة المرور الخاصة بك في كل مرة يجب عليك كتابة مسارك على النحو التالي:

Route::post('fetchResult', [ReportController::class, 'fetchResult'])
    ->name('fetchComplaintResult')
    ->middleware('password.confirm:password.confirm,1');

لكن ما السبب؟

 الوسيط password.confirm عند وضعه في الكود يشير  إلى الكلاس التالي Illuminate\Auth\Middleware\RequirePassword وذلك هو الكود الخاص بذلك الكلاس:

use Closure;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Contracts\Routing\UrlGenerator;

class RequirePassword
{
    /**
     * The response factory instance.
     *
     * @var \Illuminate\Contracts\Routing\ResponseFactory
     */
    protected $responseFactory;

    /**
     * The URL generator instance.
     *
     * @var \Illuminate\Contracts\Routing\UrlGenerator
     */
    protected $urlGenerator;

    /**
     * The password timeout.
     *
     * @var int
     */
    protected $passwordTimeout;

    /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Routing\ResponseFactory  $responseFactory
     * @param  \Illuminate\Contracts\Routing\UrlGenerator  $urlGenerator
     * @param  int|null  $passwordTimeout
     * @return void
     */
    public function __construct(ResponseFactory $responseFactory, UrlGenerator $urlGenerator, $passwordTimeout = null)
    {
        $this->responseFactory = $responseFactory;
        $this->urlGenerator = $urlGenerator;
        $this->passwordTimeout = $passwordTimeout ?: 10800;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $redirectToRoute
     * @param  int|null  $passwordTimeoutSeconds
     * @return mixed
     */
    public function handle($request, Closure $next, $redirectToRoute = null, $passwordTimeoutSeconds = null)
    {
        if ($this->shouldConfirmPassword($request, $passwordTimeoutSeconds)) {
            if ($request->expectsJson()) {
                return $this->responseFactory->json([
                    'message' => 'Password confirmation required.',
                ], 423);
            }

            return $this->responseFactory->redirectGuest(
                $this->urlGenerator->route($redirectToRoute ?? 'password.confirm')
            );
        }

        return $next($request);
    }

    /**
     * Determine if the confirmation timeout has expired.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int|null  $passwordTimeoutSeconds
     * @return bool
     */
    protected function shouldConfirmPassword($request, $passwordTimeoutSeconds = null)
    {
        $confirmedAt = time() - $request->session()->get('auth.password_confirmed_at', 0);

        return $confirmedAt > ($passwordTimeoutSeconds ?? $this->passwordTimeout);
    }
}

الجزء الهام في الكود هنا هو  handle method:

public function handle($request, Closure $next, $redirectToRoute = null, $passwordTimeoutSeconds = null)

هنا ، $ redirectToRoute و $ passwordTimeoutSeconds عبارة عن وسيطات arguments  يمكننا تعيينها في ملف المسار.

يتم استخدام $ redirectToRoute ; كالآتي في handle method:

$this->urlGenerator->route($redirectToRoute ?? 'password.confirm')

يتم استخدام $ password TimeoutSeconds هنا في shouldConfirmPassword method الخاصة بتأكيد كلمة المرور.

return $confirmedAt > ($passwordTimeoutSeconds ?? $this->passwordTimeout);

نظرًا لأنه مضبوط على قيمة خالية null، تتم مقارنة القيمة $ VerifiedAt مع $ this-> passwordTimeout ، والتي تم تعيينها في الـ constructor على 10800.  (10800 ثانية = 180 دقيقة = 3 ساعات).

لذا باختصار ، نحتاج إلى تعيين المتغير $ passwordTimeoutSeconds. نظرًا لأنه المتغير الثاني، ونحتاج أيضًا إلى تعيين المتغير redirectToRoute $.

ويمكنك إلقاء نظرة على https://laravel.com/docs/9.x/middleware#middleware-parameters

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...