Как вы перенаправляете учетную запись администратора не 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. Я так новичок на рельсах, и эта структура странная. Также, если у вас есть ресурс для начинающих, буду благодарен.
Спасибо:)