【发布时间】:2014-11-26 08:33:02
【问题描述】:
我的 rails 应用程序有几个出租车司机,他们有几个出租车与之关联,它们之间的关系如下:
class Operator < ActiveRecord::Base
has_many :cabs
end
我使用 Devise 作为我的身份验证 gem。它对我的应用程序中的用户、管理员和超级管理员进行身份验证。我为用户、管理员和超级管理员创建了单独的模型(并且没有为用户本身分配角色)。
我现在希望将授权功能添加到应用程序中,以便管理员(在我的情况下基本上是出租车司机)可以只对自己的出租车进行 CRUD。例如,属于 operator#2 的管理员只能访问链接:http://localhost:3000/operators/2/cabs,而不能访问链接:http://localhost:3000/operators/3/cabs。
我的管理员模型已经有一个 operator_id,当管理员注册时,它将它与操作员相关联。我尝试通过 CanCan 添加授权功能,但我无法配置 CanCan 以提供上述示例的限制。
我还尝试在 cabs_controller 中扩展我的身份验证功能,如下:
class CabsController < ApplicationController
before_action :authenticate_admin!
def index
if current_admin.operator_id != params[:operator_id]
redirect_to new_admin_session_path, notice: "Unauthorized access!"
else
@operator = Operator.find(params[:operator_id])
@cabs = Operator.find(params[:operator_id]).cabs
end
end
但这会将我重定向到 root_path,即使 current_admin 的 operator_id 等于 params[:operator_id]。我应该如何进行?
编辑: 以下是我的 routes.rb 文件:
Rails.application.routes.draw do
devise_for :super_admins
devise_for :users
resources :operators do
resources :cabs
end
scope "operators/:operator_id" do
devise_for :admins
end
end
我有三个表:users、admins 和 super_admins。我创建了这些,因为我希望我的管理员持有 operator_ids,以便可以识别与操作员相对应的管理员。另外,我希望管理员登录路径的类型为 /operators/:operator_id/admins/sign_in,因此在路由文件中进行了调整。
【问题讨论】:
-
authenticate_admin!是身份验证 gem 还是您的自定义函数的一部分?
-
设计提供authenticate_admin!顺便说一句,我已将我的路线定义为: scope "operators/:operator_id" do devise_for :admins end
-
您是否考虑过将 Rollify 添加到您的应用程序中?它与 CanCan 配合得很好,有助于您进行角色管理。我还建议使用 CanCanCan 而不是 CanCan,因为后者不再维护。
-
@ThomasO:你能通过一个例子来说明我如何在这种情况下使用 Rollify 吗?
-
如果需要我可以,但我认为本教程比我可以为您编写的任何内容都更清晰:github.com/RolifyCommunity/rolify/wiki/…
标签: ruby-on-rails ruby-on-rails-4 devise authorization cancan