我试图在我的应用程序中添加多个级别的用户,这是我想出的想法:
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(...)并返回”的事情。“
我该如何解决这个问题?还有什么更好的方法来处理多个级别的用户? 谢谢
答案 0 :(得分:0)
那里有很棒的图书馆,应该可以开箱即用。看看cancan例如..在cancan的wiki中,你也可以在role based authorization找到一个条目。
答案 1 :(得分:0)
所以在某个地方你有一个前过滤器或其他重定向发送你的圆圈。该日志应该至少为您提供了一条尝试重定向的行。我首先检查global_login_url(不是路径?)是否正在跳过所有过滤器,并且func在渲染后退出并且在下一步没有击中另一个过滤器。