Authlogic: как определить, не был ли пользователь авторизован, потому что пользователь не был авторизован

#authlogic #ruby-on-rails

#authlogic #ruby-on-rails

Вопрос:

Я использую authlogic с приложением rails для аутентификации. Скоропортящийся токен сбрасывается после того, как пользователь сбрасывает свой пароль. Рассмотрим этот случай. Пользователь регистрируется, он забывает активировать учетную запись, а также забывает пароли. Таким образом, он сбрасывает пароль. Из-за этого его ссылка на активацию больше не остается действительной. Таким образом, он не может активировать свою учетную запись. При попытке входа в систему он получает сообщение об ошибке, что учетная запись не активирована. Пользователь застрял!.

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

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

С уважением, Панкадж

Комментарии:

1. пожалуйста, обратите внимание: тема должна быть: Authlogic: как определить, не был ли пользователь авторизован, потому что пользователь ввел неверные учетные данные или потому что он не был активен.

Ответ №1:

Вместо того, чтобы проверять фактическую ошибку, я смог проверить условия, которые ее вызывают, используя @user_session.attempted_record amp;amp; !@user_session.invalid_password? amp;amp;
!@user_session.attempted_record.active?

Вот мое полное решение для повторной отправки электронных писем с активацией (после настройки активации с помощью руководства matthook):

 # /app/controllers/users_sessions_controler.rb
def create
  @user_session = UserSession.new(params[:user_session])
  if @user_session.save
    redirect_back_or_default root_path
  elsif @user_session.attempted_record amp;amp;
    !@user_session.invalid_password? amp;amp;
    !@user_session.attempted_record.active?
    flash[:notice] = render_to_string(:partial => 'user_sessions/not_active.erb', :locals => { :user => @user_session.attempted_record })
    redirect_to :action => :new
  else
    render :action => :new
  end
end

# /app/views/user_sessions/_not_active.erb
Sorry, before you can sign in you need to confirm your email address. <%= link_to('Resend confirmation email', resend_activation_users_path(:login => user.login)) %>

# /app/controllers/users_controller.rb
def resend_activation
  if params[:login]
    @user = User.find_by_login params[:login]
    if @user amp;amp; !@user.active?
      @user.deliver_activation_instructions!
      flash[:notice] = "Please check your e-mail for your account activation instructions!"
      redirect_to root_path
    end
  end
end

# /config/routes.rb
map.resources :users, :collection => { :resend_activation => :get }
  

Ответ №2:

Используйте свою базу данных для записи регистрации, активации, сброса и других деталей. Чтобы вы знали, какие действия необходимо предпринять.

Ответ №3:

Майк:

Вместо добавления нового фильтра вам следует пропустить фильтр, который у вас уже есть в вашем приложении.rb

Способ сделать это:

 skip_before_filter :require_user
  

Я надеюсь, что это будет кому-то полезно