Перенаправить, если вход в систему завершился неудачно и был удален '/ spree / запрещено / маршрут - PullRequest
0 голосов
/ 12 апреля 2019

Как вы перенаправляете учетную запись администратора не spree, которая пытается войти на сервер? Я прочитал эту ветку Переадресация веселья после входа в систему , но мне не повезло.

Вот что я сделал. в моем user_session_controller.rb файле у меня есть эти классы с этими методами.

     # changes: add user.membership.deactivated check

          class Spree::UserSessionsController < 
          Devise::SessionsController
            helper 'spree/base', 'spree/store', Spree::Api::ApiHelpers

            if Spree::Auth::Engine.dash_available?
             helper 'spree/analytics'
             end

            include Spree::Core::ControllerHelpers::Auth
            include Spree::Core::ControllerHelpers::Common
            include Spree::Core::ControllerHelpers::Order
          # include Spree::Core::ControllerHelpers::SSL
            include Spree::Core::ControllerHelpers::Store

  protect_from_forgery with: :null_session, if: -> { request.format.json? }

  prepend_before_action :allow_params_authentication!, only: :create

  # ssl_required :new, :create, :destroy, :update
  # ssl_allowed :login_bar

  def create
    # Warden authentication
    self.resource = warden.authenticate!(auth_options)
    if spree_user_signed_in?
      if is_active?


        respond_to do |format|
          format.html {
            # flash[:success] = Spree.t(:logged_in_succesfully)
            # after_sign_in_path_for(spree_current_user)
            redirect_back_or_default(after_sign_in_path_for(spree_current_user))
          }        
          format.json {
            @user = spree_current_user
            @order = current_order({create_order_if_necessary: true})
            @current_user_roles = @user.spree_roles

            render json: @user,
                  root: false,
                  scope: @user,
                  serializer: LiteUserSerializer
          }
        end
      else
        respond_to do |format|
          format.html {
            flash.now[:error] = "Current user is deactivated"
            render :new
          }        
          format.json {
            render json: { error: "Current user is deactivated" }, status: :unprocessable_entity, layout: false
          }
        end
      end
    else
      respond_to do |format|
        format.html {
          flash.now[:error] = t('devise.failure.invalid')
          render :new
        }        
        format.json {
          render json: { error: t('devise.failure.invalid') }, status: :unprocessable_entity, layout: false
        }
      end
    end
  end

  def auth_options
    # This is to login spree_user(Spree::User)
    { :scope => :spree_user }
  end

  def destroy
    redirect_path = after_sign_out_path_for(resource_name)
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    set_flash_message :notice, :signed_out if signed_out && is_flashing_format?
    yield resource if block_given?

    # We actually need to hardcode this as Rails default responder doesn't
    # support returning empty response on GET request
    respond_to do |format|
      format.json { render json: {} }
      format.all { head :no_content }
      format.any(*navigational_formats) { redirect_to redirect_path }
    end
  end

  # def authorization_failure
  #   redirect_to root_path
  # end

  private
    def accurate_title
      Spree.t(:login)
    end

    def redirect_back_or_default(default)
      if !spree_current_user.has_spree_role?("admin") && spree_current_user.respond_to?(:has_spree_role?)
        # redirect_to admin_login_path
        redirect_to new_spree_user_session_path
      else
        redirect_to(session["spree_user_return_to"] || default)
        session["spree_user_return_to"] = nil
      end
    end

    def is_active?
      if spree_current_user.active
        return true
      else
        Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
        return false
      end
    end


  def after_sign_in_path_for(resource)
    if !spree_current_user.has_spree_role?("admin") && spree_current_user.respond_to?(:has_spree_role?)
      # render :new
      login_path
    else
      root_path
    end
  end

end

по какой-то причине, когда я запускаю метод after_sign_in_path_for и оцениваю условие с помощью render :new, он перенаправляет меня по правильному пути, но когда я пытаюсь войти снова, он перенаправляет на маршрут spree/forbidden. Кроме того, если я перенаправлен на запрещенный маршрут, мне нужно удалить куки, чтобы я мог вернуться к login_path. Я так новичок на рельсах, и эта структура странная. Также, если у вас есть ресурс для начинающих, буду благодарен.

Спасибо:)

...