0

如果满足条件 X,允许登录用户仅访问某个控制器#action 的最佳方法是什么?

  • 例如,用户已停用他的帐户( user.is_deleted == true )
  • 如果用户登录我想将他重定向到 /reactivate
  • 如果用户尝试了任何其他 URL,例如 /profiles /search 它应该重定向到 /reactivate

我已经在 applicationcontroller 中尝试了 before_filters,但登录和注销方法除外,但它们无法正常工作,与其他操作混淆,所以我真的在寻找一种干净的方法来做到这一点,有人建议吗?

目前我正在使用

def after_sign_in_path_for(resource)
  @user = User.where(:id => current_user.id).first

  if @user.is_deleted == true
    "/reactivate"
  end

结尾

但是 *这仅适用于用户登录* 之后他们可以做类似 /home /search 等的事情所以我想“锁定”应用程序。我曾想过,也许需要使用 can can 之类的东西来代替自定义代码。

你知道一个工作可维护的干净的方法来做到这一点吗?

编辑:

做了这样的事情(你看到凌乱和休息)

  def welcome_redirect
    if user_signed_in?
      if not current_user.welcome == 0
        if not params[:controller] == "home" && params[:action] == "welcome"
          if not params[:controller] == "modal"
            if not params[:controller] == "profiles"
              redirect_to profiles_path
            end
          end
        end
      end
    end
  end

编辑2:

这似乎有效:

      def ensure_account_not_deleted
    if user_signed_in?
      @user = User.where(:id => current_user.id).first
      if params[:controller] != "users" && params[:action] != "reactivate" && @user.is_deleted == true
        redirect_to '/reactivate'
      end
    end
  end
  • 另一个之前的过滤器弄乱了一些值,导致我刚刚发现它不起作用!感谢所有导致此解决方案的建议*
4

3 回答 3

1

有什么问题:

#Application Controller

before_filter :ensure_account_not_deleted

def ensure_account_not_deleted
  if params[:controller] != "users" && parmas[:action] != "reactivate" && @user.is_deleted == true
    redirect_to '/reactivate'
  end
end

编辑:

我编写了代码来排除重新激活一遍又一遍的重定向。

我在这里假设两件事:

  1. 处理重新激活的控制器是 UsersController。

  2. 该动作称为“重新激活”

于 2012-09-05T11:37:59.800 回答
0

我也有类似的检查,如果用户帐户被停用,那么他不应该能够访问该应用程序。我做了

class SessionsController < Devise::SessionsController
  ....
  def create
    resource = build_resource
    #to check if user is active or the organisation he belongs to is active
    if current_user and current_user.organisation and (!current_user.is_active or !current_user.organisation.is_active)
      sign_out current_user
      flash[:notice] = "Account deactivated. Contact Admin."
      redirect_to root_path and return
    end
    super
  end
  ....
end

并添加

before_filter :authenticate_user!

对所有控制器

于 2012-09-05T11:44:48.320 回答
0

我有 'root_path 作为 root :to => "sessions#new"'。在我的应用程序中,每个用户(除了超级管理员)都属于一个组织。超级管理员可以激活/停用用户/组织。如果用户被停用,则不应允许他登录。如果组织被停用,则不应允许属于该组织的用户登录。我已经覆盖了会话控制器,因为 1) 使用 ip 地址 n 时间维护用户登录/注销时间以进行报告。2) 禁止不属于公司的用户登录。3)检查用户是否活跃或他所属的组织是否活跃

于 2012-09-05T12:55:34.397 回答