【问题标题】:adding multiple levels of user access添加多级用户访问权限
【发布时间】:2012-06-26 03:22:50
【问题描述】:

我试图在我的应用程序中添加多个级别的用户,这是我可以想出的想法:

class ApplicationController < ActionController::Base

 before_filter :setup , :authorize
protect_from_forgery

 def setup
 @minimum_permission = "admin"
end  

def authorize
  perm = { admin: 3 , moderator: 2 ,  reader: 1 }
  perm.default = 0
  if    User.find_by_id(session[:user_id])
        unless perm[session[:user_permission].to_s.to_sym] >= perm[@minimum_permission.to_sym]
            redirect_to global_login_url, notice: "you need to have "+@minimum_permission+" privileges to access this page"
        end
  else
        redirect_to global_login_url, notice: "Please log in"
  end
end
end

在我看来,我会做类似的事情:

class FieldsController < ApplicationController
skip_before_filter :authorize
# GET /fields
# GET /fields.json
def index
@minimum_permission = "moderator"
authorize
  @fields = Field.all   
  respond_to do |format|
    format.html # index.html.erb
    format.json { render json: @fields }
  end
  end
....
end

这是我的会话控制器:

 class SessionsController < ApplicationController
 skip_before_filter :authorize
  def new
  end

 def create

user = User.find_by_cpf_no(params[:cpf_no])
if user and user.authenticate(params[:password])
  session[:user_id] = user.id
  session[:user_permission] = user.permission
  session[:user_name] = user.name
  redirect_to fields_url, alert: "successfully logged in"
else
  redirect_to fields_path, alert: "Invalid user/password combination"
end
 end

 def destroy
session[:user_id] = nil
session[:user_permission] = nil
session[:user_name] = nil
redirect_to root_path, notice: "Logged out"
 end
end

这对于已登录的人来说效果很好!但是当我尝试在尚未登录的情况下访问索引时,出现此错误:

“在此操作中多次调用渲染和/或重定向。请注意,您只能调用渲染或重定向,每个操作最多调用一次。另请注意,重定向和渲染都不会终止操作的执行,所以如果你想在重定向后退出一个动作,你需要做一些类似“redirect_to(...) and return”的事情。”

我该如何解决这个问题?还有没有更好的方法来处理多层次的用户? 谢谢你

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    那里有很棒的库,可以满足您开箱即用的需求。查看cancan 例如。在cancan 的wiki 中,您也可以在role based authorization 上找到一个条目。

    【讨论】:

      【解决方案2】:

      所以在某处你有一个前置过滤器或其他重定向让你转圈。日志应该至少为您提供了尝试重定向的行之一。我首先检查 global_login_url (不是路径?)是否正在跳过所有过滤器,并且 func 在渲染后退出并且不会在更远的地方碰到另一个。

      【讨论】:

      • 你对这个错误是正确的。事实证明,即使在我的 redirect_to() 之后,我的索引控制器也没有停止执行。根据slipp douglasstackoverflow.com/questions/820781/…这里的答案使用“return redirect_to()”解决了我的问题
      猜你喜欢
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多