سؤال

أنا أتجاوز استجابة الفشل في Inpise حتى أتمكن من تعيين رمز الحالة 401. ومع ذلك ، عندما يفشل المستخدم في تسجيل الدخول ، يتم إعادة توجيهه إلى صفحة مع رابط "يتم إعادة توجيهك". إذا قمت بإزالة هذا :status => 401 من إعادة التوجيه يعمل بشكل جيد.

class CustomFailure < Devise::FailureApp
    def redirect_url
      new_user_session_url(:subdomain => 'secure')
    end

    def respond
        if http_auth?
           http_auth
        else
           store_location!
           flash[:alert] = i18n_message unless flash[:notice]
           redirect_to redirect_url, :status => 401
        end
    end
end

تعديل

بدلاً من ذلك ، أود أن أعرض رسالة الفلاش والبقاء على نفس الصفحة ولكن إضافة هذا السطر من التعليمات البرمجية:

render :text => "unauthorized", :status => 401

يسبب روبي للشكوى:

undefined method `render' for #<CustomFailure:0x00000103367f28>

ماذا يحصل هنا؟

هل كانت مفيدة؟

المحلول

تكون حالات HTTP المناسبة لإعادة التوجيه في شكل 30x (301 و 302 كونها الأكثر استخدامًا). بشكل افتراضي ، يقوم المساعد Redirect_to بتعيين رأس حالة 302 على استجابة HTTP. إذا قمت بتجاوز ذلك وقمت بتعيين ذلك على 401 ، فستفترض متصفح الويب الخاص بك أن الاستجابة عبارة عن صفحة ويب عادية وستجعل هيئة الاستجابة -والتي ، في إعادة التوجيه ، هي نص Boilerplate "يتم إعادة توجيهك".

نصائح أخرى

كنت فعليًا في هذه المشكلة على خادم QA الخاص بنا ، ولكن ليس محليًا. اتضح أن memcache الخاص بنا كان يعترض الرسالة ويجعلها على أنها 200 ، وتسبب في ظهور هذه الرسالة. كان هذا يرجع بشكل غير مباشر إلى إعدادات Memcache الخاصة بنا والتي لم تتوقع إعادة توجيه من GET.

From: 
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @memcached

To:
$document_root/cache/$uri.html /cache/$uri /cache/$uri.html $uri @rails

كما قال pantulis سيعرض المتصفح هذه الرسالة القياسية إذا لم يكن رمز الاستجابة 3xx

لتتغير هذا ، يمكنك إجراء إعادة توجيه JavaScript:

# example with status 500:
render text: "<script>window.location = '#{url}';</script>", status: 500

هذا أمر صالح خارج الدورة فقط إذا كنت متأكدًا من أن جميع المستخدمين يستخدمون JavaScript. إذا كان من الممكن تصفح التطبيق الخاص بك من قبل المستخدمين الذين قد يكون لديهم تعطيل JavaScript ، فيجب عليك أيضًا تضمين أ noscript علامة ورد في رسالة "أنت إعادة توجيه" القياسية

عندما أواجه هذه المشكلة ، فإن ما فعلته في الماضي هو شيء من هذا القبيل:

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  after_filter :check_page_content
  ...
  private
  def check_page_content
    if response.body.include? "You are being"
      html_doc = Nokogiri::HTML(response.body)
      uri = html_doc.css('a').map { |link| link['href'] }.first
      response.body = "<script>
                         window.location.replace('#{uri}');
                       </script>"
    end
  end
end

ما أقوم به هو التحقق من معرفة ما إذا كان محتوى الصفحة هو "أنت". إذا كان هذا صحيحًا ، فأنا أعلم أنني لست حيث أريد أن أكون. وأنا فقط أقوم بتحديث الصفحة إلى حيث أريد حقًا أن أكون ببعض المساعدة من JavaScript. أعلم أنه ليس الحل الأكثر أناقة ولكنه يساعد حقًا

اختراق سعيد

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top