#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
Я надеюсь, что это будет кому-то полезно