【问题标题】:how set the permissions for cancan gem?如何设置cancan gem的权限?
【发布时间】:2015-09-19 17:22:12
【问题描述】:

请帮助解决问题。我尝试在安装“cancan”和“cancancan”gem 后设置权限。

schema.rb:

create_table "roles", force: :cascade do |t|
  t.string   "name"
end

create_table "roles_users", id: false, force: :cascade do |t|
  t.integer "role_id"
  t.integer "user_id"
end

create_table "users", force: :cascade do |t|
  t.string   "email",                  default: "", null: false
  ................................................................
  t.datetime "created_at"
  t.datetime "updated_at"
end

型号:

class User < ActiveRecord::Base
  has_and_belongs_to_many :roles

  def role?(role)
    return !!self.roles.find_by_name(role.to_s.camelize)
  end     
end

class Role < ActiveRecord::Base
  has_and_belongs_to_many :users
end

app/models/ability.rb:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)

    if user.role? :admin
      can :manage, :all
    elsif user.role? :manager
      can :manage, :review
      cannot :manage, :user
    elsif user.role? :user
      cannot :manage, :all
    end   
  end
end

我在我的角色表中填写了以下值:

id    name  
0     user
1     manager
2     admin

我填写了我的联接表“roles_users”以下值:

role_id       user_id
2             2
1             3
0             1

但运行应用程序权限后没有效果。问题是管理员可以更改所有用户的信息。这是不对的。请帮忙解决一下

ps:

my user controller:
class UserController < ApplicationController
  load_and_authorize_resource
end

经理通过管理面板更改用户信息后,控制台输出如下:

Started GET "/admin/users/1" for 127.0.0.1 at 2015-09-19 20:53:47 +0300
Processing by Admin::UsersController#show as HTML
  Parameters: {"id"=>"1"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 1]]
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 3]]
   (0.1ms)  SELECT COUNT(*) FROM "active_admin_comments" WHERE "active_admin_comments"."resource_type" = ? AND "active_admin_comments"."resource_id" = ? AND "active_admin_comments"."namespace" = ?  [["resource_type", "User"], ["resource_id", "1"], ["namespace", "admin"]]
  CACHE (0.0ms)  SELECT COUNT(*) FROM "active_admin_comments" WHERE "active_admin_comments"."resource_type" = ? AND "active_admin_comments"."resource_id" = ? AND "active_admin_comments"."namespace" = ?  [["resource_type", "User"], ["resource_id", "1"], ["namespace", "admin"]]
  Rendered /home/kalinin/.rvm/gems/ruby-2.0.0-p598/bundler/gems/activeadmin-893b46c6530c/app/views/active_admin/resource/show.html.arb (316.7ms)
Completed 200 OK in 321ms (Views: 318.9ms | ActiveRecord: 0.3ms)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 activeadmin cancan cancancan


    【解决方案1】:

    您不需要在 role? 方法中调用 .camelize,因为您在 db 中的所有角色都以小写字母 (manager) 而不是驼峰形式 (ManagerOfTheApplication) 存储。

    您的Admin::UsersController 似乎位于active_admin。尝试启用active_admin and can_can integration

    config.authorization_adapter = ActiveAdmin::CanCanAdapter
    

    查看上面的链接了解详情。

    【讨论】:

    • 你能不能在 rails 控制台试试:User.find(2).role?(:admin) 和其他一些角色,例如,User.find(2).role?(:manager)
    • 在控制台 User.find(2).role?(:admin) 中返回 TRUE
    • 好吧,我相信你的角色检查代码应该可以正常工作。可能是控制器问题?
    • alex,我在主要问题中添加了新信息。在块“ps:”中
    • 你给我看了UserController,但你的控制台说Admin::UsersController
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多