6

我有一个组资源,我尝试使用适当的授权进行设置。正确用户和管理员的多个before_filter语句

我想实现授权逻辑是这样的:

  1. 只有小组成员应能查看他们的小组。
  2. 管理员可以查看任何组,并采取其他操作。

我试图与该组控制器中执行以下语句的before_filter做到这一点:

before_filter :signed_in_user 
before_filter :correct_user, only: :show 
before_filter :admin_user, only: [:show, :index, :edit, :update, :destroy] 

Correct_user工程,我已经验证了,只有组成员可以查看他们的小组。但是,我想要发生的是admin:show子句来覆盖此,以便管理员可以查看任何组。目前,这是行不通的。我猜我的过滤器订购和选项有些问题。

有人能告诉我我哪里出了问题吗?

编辑

每阿马尔的请求添加我的方法的代码:

private 

def correct_user 
    # User has to be a member to view 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? 
end 

def admin_user 
    redirect_to(root_path) unless current_user.admin? 
end 
+0

尝试admin_user在过滤器之前过滤correct_user或在show action中为管理员用户和其他人制定条件 – Amar 2012-04-14 15:27:54

+0

谢谢Amar。我试图将admin_user过滤器放在correct_user上面,但没有解决它。我可以把这个条件放在动作中,但是想看看是否有办法用before_filter来做到这一点。 – pejmanjohn 2012-04-19 00:21:49

+0

通过我上面写的方式进行进一步检查时,过滤器要求用户既是管理员又是管理员,正确的用户才能查看组。我希望它是或 – pejmanjohn 2012-04-19 17:17:40

回答

2

更新correct_user方法或创建如下定义的另一种方法,从其他过滤器除去表演,并与新的方法添加的before_filter 。

def correct_user 
    @group = Group.find(params[:id]) 
    redirect_to(root_path) if @group.members.find_by_member_id(current_user).nil? && !current_user.admin? 
end 
+0

刚刚经过测试,这很好。我需要在布尔语句之间添加一个“&&”。 – pejmanjohn 2012-04-24 16:54:43