设计:干净的方式只允许在X条件下单个控制器#动作?

时间:2012-09-05 11:02:47

标签: ruby-on-rails ruby-on-rails-3 devise cancan

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

  • 例如,用户已停用其帐户(user.is_deleted == true)
  • 如果用户登录我想将他重定向到/重新激活
  • 如果用户尝试了/ profiles / search之类的任何其他网址,则应重定向到/重新启动

我在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等一样做 所以我想"锁定"该应用程序。我想也许不是自定义代码,而是需要用类似的东西来做这个。

你知道一种可行的清洁方法吗?

编辑:

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

  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
  • 另一个在过滤器之前弄乱了一些值导致这不能正常工作我刚发现!对于导致此解决方案的建议而言,所有这些*

3 个答案:

答案 0 :(得分: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. 该操作称为“重新激活”

答案 1 :(得分: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!

到所有控制器

答案 2 :(得分:0)

我将'root_path作为root:to =&gt; “会话#新的””。在我的应用程序中,每个用户(超级管理员除外)都属于某个组织。超级管理员可以激活/停用用户/组织。如果用户被停用,那么他就不应该登录了。如果组织已停用,则不应允许属于该组织的用户登录。我已经覆盖了Session控制器,因为 1)使用ip地址n时间维护用户登录/注销时间以进行报告。 2)禁止不属于公司的用户登录。 3)检查用户是否处于活动状态或他所属的组织是否处于活动状态