dor*_*kon 4 ruby-on-rails cancan ruby-on-rails-3
我成功地用Devise和CanCan建立了登录系统,我有3种类型的用户.管理员,内部和全球用户.我创建了控制器和索引操作:管理员,Cpanel,报告和状态,我想限制某些用户对此控制器的访问.
管理员用户应具有访问权限:报告(全部),状态(读取),管理员(全部)
全局用户应具有访问权限:报告(仅读取),状态(读取),Cpanel(全部)
内部用户应具有访问权限:报告(全部),状态(读取)
我尝试使用ability.rs中的以下代码执行此操作:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role? :admin
can :manage, [Report, Admin]
can :read, State
elsif user.role? :global_user
can :read, [Report, State]
can :manage, Cpanel
elsif user.role? :internal_user
can :manage, Report
can :read, State
end
end
end
Run Code Online (Sandbox Code Playgroud)
这时我在这个控制器中只有索引操作,当我用内部用户登录app时,我可以访问/ admin,例如,这不是我想要的行为.我想限制访问所有控制器而不是capability.rb类中列出的控制器.
如果我要阻止访问整个控制器,我会创建一个before过滤器,如果用户没有admin角色,则会将用户重定向到拒绝访问的页面.可能看起来像:
def check_permissions
raise CanCan::AccessDenied unless @current_user.role?(:admin)
end
Run Code Online (Sandbox Code Playgroud)
如果我只是想阻止访问更新和创建,例如,我会这样做:
def update
raise CanCan::AccessDenied unless can?(:update,Thing)
...
end
def create
raise CanCan::AccessDenied unless can?(:create,Thing)
...
end
Run Code Online (Sandbox Code Playgroud)
您可以CanCan::AccessDenied在应用程序控制器中处理异常:
rescue_from CanCan::AccessDenied do |exception|
flash[:error] = exception.message
redirect_to no_access_path
end
Run Code Online (Sandbox Code Playgroud)
我在这里和这里有一些关于CanCan和Devise的相当不错的帖子
更新 我在我的应用程序控制器中使用此方法来设置我当前的用户变量:
# Make the current user object available to views
#----------------------------------------------------------------------------
def get_user
@current_user = session[:current_user]
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2597 次 |
| 最近记录: |