使用CanCan进行授权并设计用于身份验证。我有三个角色。管理员角色可以访问所有操作。但是当我以管理员身份登录时,我仍然会拒绝访问。我究竟做错了什么??我也一直关注this wiki for implementation
这是我的控制器代码
class LocationController < ApplicationController
#before_filter :authenticate, :only => [:title_clearing]
before_filter :authenticate_user!
load_and_authorize_resource
def show
@data = []
if params[:Date].match(/^(19|20)\d\d[- \/.](0[1-9]|1[012])[- \/.](0[1-9]|[12][0-9]|3[01])$/).nil? == true
@message = "Wrong Date Format"
else
@data = Location.show(params[:Date])
if @data.size == 0
@message = "No data exists for "+ params[:Date]
else
@message = "Data loaded successfully for "+ params[:Date]
end
end
if params[:Date] == "all"
@message = "All records loaded"
@data = Location.show("all")
end
end
end
在ability.rb
中if user.is? :admin
can :all, :location
end
if user.is? :titleclearing
can :title_clearing, :location
end
if user.is? :acquisitions
cannot :title_clearing, :location
end
在用户模型中
def role?(role)
roles.include? role.to_s
end
答案 0 :(得分:1)
用户正确的CanCan约定:
if user.is? :admin
can :manage, Location
end
或者,您可以管理所有:
can :manage, :all
答案 1 :(得分:1)
也许这是因为Ability Precedence。根据您在ability.rb
中的定义,我认为:
acquisitions
继承的用户具有角色titleclearing
和admin
的能力。titleclearing
继承的用户具有角色admin
的能力。所以,正如你所说,"now everyone's being let through"
,因为所有用户现在都具有admin
的能力。尝试改变这样的能力顺序:
if user.is? :titleclearing
can :title_clearing, :location
end
if user.is? :acquisitions
cannot :title_clearing, :location
end
if user.is? :admin
can :all, :location
end
并检查它是否像你想要的那样工作。
答案 2 :(得分:0)