Как остановить софт удаленного входа пользователя с помощью Devise - PullRequest
6 голосов
/ 23 июня 2011

В настоящее время я использую Devise для регистрации / аутентификации пользователей в проекте Rails.Когда пользователь хочет удалить свою учетную запись, пользовательский объект удаляется программным способом следующим образом:

Как «мягко удалить» пользователя с помощью Devise

MyТаким образом, имплментация имеет небольшую разницу.Модель пользователя имеет атрибут «Удаленный_флаг».И, метод soft_delete выполняет "update_attribtue (: dele_flag, true)"

Но я должен выполнить действие sign_in.В моем понимании следующее.

class SessionsController < Devise::SessionsController
  def create
    resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")    

    if resource.deleted_flag
      p "deleted account : " + resource.deleted_flag.to_s
      sign_out(resource)
      render :controller => :users, :action => :index
    else
      if is_navigational_format?
        if resource.sign_in_count == 1
          set_flash_message(:notice, :signed_in_first_time)
        else
          set_flash_message(:notice, :signed_in)
        end
      end
      sign_in(resource_name, resource)
      respond_with resource, :location => redirect_location(resource_name, resource)
    end
  end
end

Я думаю, что этот код имеет странные моменты.

Если удаленный пользователь пытается войти, система разрешает входить в систему и сразу же выходить из нее.И система не может отображать flash [: alert] message ...

Я хочу знать две точки.

  1. Как мне реализовать запрет запретить вход в систему удаленным пользователям?
  2. Как реализовать отображение [: alert], когда удаленный пользователь пытается войти в систему?

Ответы [ 3 ]

10 голосов
/ 23 июня 2011

Чтобы остановить пользователя, который был «мягко удален», лучше всего переписать метод класса find_for_authentication в модели пользователя. Такие как:

Class User < ActiveRecord::Base
  def self.find_for_authentication(conditions)
    super(conditions.merge(:deleted_flag => false))
  end

Это сгенерирует недействительное флеш-сообщение электронной почты или пароля от devise (потому что не может найти пользователя для аутентификации)

Что касается вашего второго вопроса, вам понадобится метод for в вашем контроллере, чтобы добавить определенное флэш-сообщение. Однако, по моему мнению, вы должны относиться к пользователям, которые «мягко» удалены, так же, как если бы их вообще не было в базе данных. Таким образом, если они пытаются войти в систему, они должны просто получить действительное сообщение электронной почты или пароль.

1 голос
/ 23 июня 2014

Смотрите мое решение здесь: https://stackoverflow.com/a/24365051/556388 В основном вам нужно переопределить active_for_authentication?метод на модели разработки (Пользователь).

0 голосов
/ 23 июня 2011

Я не пробовал ничего подобного, но, похоже, если вы хотите поймать пользователя перед аутентификацией, вам придется либо написать стратегию аутентификации Devise, либо before_filter, которая будет выполняться до authenticate_user!. Что-то вроде:

before_filter :no_deleted_users

def no_deleted_users
  if User.find(params[:email]).deleted?
    redirect_to root_path, :flash => { :error => "Your user was deleted.  You cannot log in." } 
  end
end

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

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