Rub*_*tic 4 ruby-on-rails devise cancan ruby-on-rails-3
你如何阻止其他用户编辑一个对象,比如一个不属于他们自己的个人资料对象呢?
大多数在线示例都是具有多个用户角色的复合体,我无法使其工作,但必须简单:
def initialize(user)
can :update, Profile do |profile|
profile.try(:user) == current_user
end
end
Run Code Online (Sandbox Code Playgroud)
在我的ProfilesController#edit中
authorize! :update, @profile
Run Code Online (Sandbox Code Playgroud)
Lea*_*RoR 12
第一个问题是,你有没有为自己的角色做过User
?
应用程序/模型/ user.rb
class User < ActiveRecord::Base
attr_accessible :email, :password, :remember_me
devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable, # regular devise stuff
before_create :setup_default_role_for_new_users
ROLES = %w[admin default banned]
private
def setup_default_role_for_new_users
if self.role.blank?
self.role = "default"
end
end
end
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我在这里有3个不同的角色,当创建新用户时,他们始终是default
用户.现在有了CanCan设置,让我们说你想要admin
能够做所有事情,default
用户可以用他们自己的配置文件做所有事情,banned
用户无法做任何事情,访客用户能够看到配置文件:
class Ability
include CanCan::Ability
# Remember that CanCan is for a resource, meaning it must have a class(model).
def initialize(user)
user ||= User.new # guest user (not logged in)
if user.role == "admin"
can :manage, :all
elsif user.role == "default"
can :manage, Profile, :user_id => user.id
elsif user.role == "banned"
cannot :manage, :all
else
can :read, Profile # guest user
end
end
end
Run Code Online (Sandbox Code Playgroud)
这就是你如何让用户只编辑他们自己的个人资料和没人.
其他一些方便的注意事项:确保表格中有一user_id
列Profile
.此外,如果您可能需要让猜测用户看到如下配置文件:
class ProfileController < ApplicationController
before_filter :authenticate_user!, :except => :show
load_and_authorize_resource
end
Run Code Online (Sandbox Code Playgroud)
他们将无法使用任何其他操作,CanCan仍会检查除其他所有内容之外的身份验证show
.
祝好运!
更新:制作:用户的角色属性
我所做的是运行一个迁移,将role
列添加到Devise users
表中:
rails generate migration add_role_to_users role:string
Run Code Online (Sandbox Code Playgroud)
然后rake db:migrate
.新的迁移文件应如下所示,并检查您的db/schema.rb文件,以确保正确区分其用户表.如果不是那么rake db:drop
,rake db:create
那么rake db:migrate
又一次.
class AddRoleToUsers < ActiveRecord::Migration
def self.up
add_column :users, :role, :string
end
def self.down
remove_column :users, :role
end
end
Run Code Online (Sandbox Code Playgroud)
这就是您成功完成user.role
工作的方式.
注意:确保您保留该行:can :manage, Profile, :user_id => user.id
没有任何更改.添加role
列后应该可以正常工作user
.
重要!如果您使用的Rails 3,DO NOT MAKE role
attr_accessible
或每个人都可以编辑自己的角色!Rails 4 默认使用强参数,不受此问题的影响,因为您可以选择允许的参数.
归档时间: |
|
查看次数: |
4331 次 |
最近记录: |