我有三个模型:用户,组织和项目。
组织has_many用户(具有不同的角色)和用户属于组织。
用户has_many项目,项目属于用户和组织(通过将@project.organization_id = current_user.organization_id
放在控制器的def create
方法中)。
我将此位放在projects_controller.rb
文件中,以确保登录的用户只能查看与其组织关联的项目。
def index
@projects = Project.where(organization_id:current_user.organization_id)
end
但是,所有这一切都是隐藏current_user中的其他项目。如果他输入http://localhost:3000/projects/3(属于另一个组织的另一个用户的项目),他仍然可以访问它。
我应该在projects_controller的def show
部分放置什么来阻止这种情况发生?我已经破解了几件事,但我没有任何错误就无法做到。如果可能的话,我也不想使用CanCan。
我尝试了
before_filter :require_project_belong_to_organization, :only => [:show]
def require_project_belong_to_organization
@project = current_user.projects.find(params[:id])
end
但是如果是创建它的用户,则只返回结果。我需要其他用户也可以查看它,只要他们在同一个组织中。
答案 0 :(得分:1)
尝试cancan。
答案 1 :(得分:0)
在您的控制器中使用before_filter并检查项目的用户是否与current_user相同
答案 2 :(得分:0)
我将首先在项目模型中创建一个函数 authorized?
。确保 current_user
可用于模型。
authorized?
self.organization_id == current_user.organization_id
end
然后在控制器中:
def show
@project = Project.find(params[:id])
if @project
unless @project.authorized?
flash[:danger] = 'not authorized'
redirect_to....
end
else
flash.now[:danger] = 'Project was not found'
end
end