Перенаправление подтверждения электронной почты Gitlab

По умолчанию Gitlab перенаправляет пользователя на домашнюю страницу после подтверждения по электронной почте. Вместо этого я хочу перенаправить за пределы сайта.

Я не думаю, что для этого есть опция конфигурации, поэтому я спрашиваю, как ее взломать.

Я нашел confirmations_controller.rb:

# frozen_string_literal: true

class ConfirmationsController < Devise::ConfirmationsController
  include AcceptsPendingInvitations

  def almost_there
    flash[:notice] = nil
    render layout: "devise_empty"
  end

  protected

  def after_resending_confirmation_instructions_path_for(resource)
    users_almost_there_path
  end

  def after_confirmation_path_for(resource_name, resource)
    accept_pending_invitations

    # incoming resource can either be a :user or an :email
    if signed_in?(:user)
      after_sign_in(resource)
    else
      Gitlab::AppLogger.info("Email Confirmed: username=#{resource.username} email=#{resource.email} ip=#{request.remote_ip}")
      flash[:notice] = flash[:notice] + " Please sign in."
      new_session_path(:user, anchor: 'login-pane')
    end
  end

  def after_sign_in(resource)
    after_sign_in_path_for(resource)
  end
end

Как мне сделать так, чтобы он перенаправлял меня на google.com?

просто переопределите возврат для метода after_confirmation_path_for в вашем коде.

Amin Shah Gilani 08.02.2019 00:11

Каким должен быть новый путь подтверждения?

Amin Shah Gilani 08.02.2019 00:11

Я обновляю теги, потому что ваш вопрос относится к Devise. GitLab использует этот гем для аутентификации.

Amin Shah Gilani 08.02.2019 00:12

@UpvoteMe отправить его, чтобы сказать google.com?

Harry 08.02.2019 00:51

«Ранее принятый ответ больше не работает». Является ли новое поведение таким же, как исходное поведение? Ответ AFAIK Amin все еще должен работать. Любая дополнительная информация о том, что происходит, была бы полезна.

Matthew 25.01.2020 03:27

Вы должны убедиться, что указываете на контроллер с перезаписанным методом after_confirmation_path_for. Вот более полная статья по теме, если вы ее еще не видели: stackoverflow.com/a/15115558/5273239

Matthew 25.01.2020 03:29

@ Мэтью, потому что это Gitlab, а не то, что я написал сам, я не совсем понимаю, что происходит. Само подтверждение_controller.rb, похоже, не сильно изменилось. Как проверить, вызывается ли after_confirmation_path_for? Новое поведение после подтверждения, что вы просматриваете страницу входа в gitlab вместо перенаправления.

Harry 26.01.2020 17:20

Вы спрашивали автора(ов)? Как насчет того, чтобы добавить возможность в их код и отправить патч?

the Tin Man 26.01.2020 21:47
ЗАЧЕМ ранее принятый ответ больше не работает? Ваш вопрос дрейфует, если ответ перестал работать, а значит, вам нужно задать новый вопрос, а не настаивать на новых ответах. Смотрите эти обсуждения в мета: "Стратегии выхода для «вопросов-хамелеонов»" "Этикет для русских кукол Вопросы" "Разрешается ли по умолчанию изменять вопросы, и если да, то в какой степени?
the Tin Man 26.01.2020 21:50

@theTinMan Это буквально тот же вопрос, я даже никак его не редактировал и не добавлял. Просто предыдущий ответ больше не работает. Что касается того, почему я не знаю, надеясь, что кто-то на ТАК это сделает. Gitlab выпускает ежемесячно, и я обновлял патчи за 7 месяцев. Это взлом, а не официальная функция, поэтому по этому поводу нет документации или чего-либо еще.

Harry 27.01.2020 02:57
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
2
10
178
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Возврат из метода after_confirmation_path_for. Вот пример для Google.

class ConfirmationsController < Devise::ConfirmationsController
  ...

  protected


  def after_confirmation_path_for(resource_name, resource)
    ...
    'https://www.google.com' # assuming you're redirecting to Google
  end

end

Спасибо за это, это работало на момент вашего ответа, а после обновления до 12.6, к сожалению, больше не работает. Есть идеи, как это исправить?

Harry 11.01.2020 03:15

После обновления вашего кода было бы несправедливо убрать выбранный ответ. Если что-то изменилось, вопрос изменился, и это не вина отвечающего. Вместо этого необходимо создать новый вопрос со всей новой информацией. Смотрите связанные страницы в моем комментарии выше.

the Tin Man 26.01.2020 21:55

Проголосовали за то, чтобы Амин получил как минимум половину награды, несмотря на то, что этот ответ следует принять. (и, таким образом, предоставил всю награду)

anothermh 28.01.2020 04:14

@theTinMan Я думал, что SO должен был быть хранилищем настоящей документации. Если я приму это, кто-то, пришедший сюда из Google, не получит правильного ответа, несмотря на то, что в то время он работал.

Harry 29.01.2020 00:32

@ Гарри Нет, это не так. Предполагается, что вы должны задать вопрос один, который относится к вам, и получить ответы на основе этого вопроса. Это определенно не о том, чтобы задать вопрос, получить точный и правильный ответ, а затем изменить кодовую базу таким образом, чтобы сделать ответ недействительным. Единственная проблема с этим ответом заключается в том, что вы переместили стойки ворот ПОСЛЕ того, как задали свой вопрос и получили ответ.

anothermh 29.01.2020 02:31

@ Гарри "настоящая документация"? В то время это было правдой. Истина может меняться по мере развития программного обеспечения, но это не означает, что мы сводим на нет все предыдущие верные ответы, когда это происходит. В то время это было правильно. Вы пошли дальше, но ваш вопрос должен остался прежним, а значит и правильность ответа осталась.

the Tin Man 29.01.2020 02:53

@anothermh не моя кодовая база, у всех изменилась кодовая база. Каждый, кто придет сюда, увидит неправильный ответ, который потратит их время и вызовет разочарование, если он все еще будет принят. Это не тот пользовательский опыт, который SO хочет предоставить.

Harry 29.01.2020 14:06

@theTinMan вопрос не изменился, как вы можете видеть из вопроса, который я никогда не редактировал. Ответ больше не работает, потому что сейчас 2020 год, и соответствующие API или что-то другое. Это происходит ВСЕ ВРЕМЯ, и ожидается, что ответы будут поддерживаться или станут новыми. Если бы я задал другой вопрос, он был бы помечен как дубликат.

Harry 29.01.2020 14:09

Это настраиваемый контроллер подтверждения? Если нет, создайте новый confirms_controller.rb в каталоге app/controllers:

class ConfirmationsController < Devise::ConfirmationsController
  def show
    self.resource = resource_class.confirm_by_token(params[:confirmation_token])

    if resource.errors.empty?
      set_flash_message(:notice, :confirmed) if is_navigational_format?
      sign_in(resource_name, resource)
      respond_with_navigational(resource){ redirect_to your_desired_redirect_path }
    else
      respond_with_navigational(resource.errors, status: :unprocessable_entity){ render_with_scope :new }
    end
  end
end

В config/routes.rb добавьте эту строку, чтобы Devise использовал ваш собственный ConfirmationsController. Это предполагает, что Devise работает с таблицей пользователей (вы можете отредактировать ее, чтобы она соответствовала вашей).

devise_for :users, controllers: { confirmations: 'confirmations' }

Ссылка на ответ: Как сделать перенаправление Devise после подтверждения

Спасибо, в config/routes.rb, похоже, есть 2 новые строки: # Sign up get 'users/sign_up/welcome' => 'registrations#welcome' patch 'users/sign_up/update_registration' => 'registrations#update_registration' Я не знаю, является ли ConfirmationsController пользовательским. Я только что отредактировал тот, который нашел на app/controllers/confirmations_controller.rb. Может быть, эти 2 новые строки перезаписывают его?

Harry 29.01.2020 19:31

Если вы хотите переопределить, вы можете сделать это.

Amal 30.01.2020 07:15

Другие вопросы по теме