Rails завершил 401 несанкционированный код с authenticate_or_request_with_http_basic - PullRequest
0 голосов
/ 11 июня 2018

В моем приложении Rails 4.2 я использую Devise 3.5.10.Как только администратор вошел в систему, я пытаюсь защитить вторым паролем доступ к определенному представлению с помощью authenticate_or_request_with_http_basic только для пользователей с правами администратора.

Вот контроллер:

class ScreensController < ApplicationController
   skip_before_action :authenticate_user!

   layout 'chat'

   def chat
     if current_user.admin?
       if params["full_chat"] == "true"
         authenticate_or_request_with_http_basic('Administration') do |username, password|
           username == "admin" && password == "your_password"
         end
      end
    end
  end
 end

Итак, впредставление ActiveAdmin У меня есть этот link_to:

link_to(I18n.t('admin.full_conversation'), root_url+'chat?full_chat=true#/conversations/'+conversation.id.to_s)

А вот маршрут:

get  '/chat' , to: 'screens#chat'

он работает, как и ожидалось, локально, отображая модальное окно с запросом имени пользователя и пароля, прежде чем датьполучает доступ к представлению, если они правы, но как только он развернут на сервере, я получаю код 401 в журналах:

Completed 401 Unauthorized in 11ms (ActiveRecord: 1.2ms)

И сервер застревает в цикле.Любая идея о том, почему поведение локально отличается от поведения на сервере, будет по-настоящему оценена.

1 Ответ

0 голосов
/ 11 июня 2018

Для начала вы можете очистить свой взгляд, используя правильный путь, который будет выглядеть примерно так: screens_chat_path с параметрами полноэкранного режима и разговорами.

get ':chat', to: 'screens#chat', as: 'chat'

Просмотр

link_to(I18n.t('admin.full_conversation'), screen_chat_path(full_chat: true, path: /conversations/'+conversation.id.to_s))

Затем кажется, что в этой логике есть проблема:

md5_password = Digest::MD5.hexdigest(password)
       username == "admin" && md5_password == 
User.where(role:2).first.randword

Как вы узнаете пароль, если он здесь случайный?Кажется, возвращается 401, потому что дайджест, который вы создаете, и случайное слово не равны.

Вы можете создать мастер-ключ и сохранить его как переменную среды и сказать, что ENV['MASTER_KEY'] == password логика работаеттебе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...