Fil*_*aat 2 authentication ruby-on-rails devise rails-admin cancancan
我一直在摆弄CanCanCan gem以限制常规用户的操作,但到目前为止我只设法将授权限制为整个模型,而我真正需要的是限制对其某些属性的访问.
例如,在我的用户模型上,除了用户/密码/电子邮件之外,我有一个用于管理员的布尔值,我用它来验证登录用户的状态,在这种情况下,如果是user.admin ?,它可以访问/管理一切,否则,它应该能够读取所有内容,并且只有在user.id匹配时才能更新自己的记录.
我已经多次阅读文档,最接近的是将其添加到app/models/ability.rb中
can :update, :users, [:name, :password, :email]
Run Code Online (Sandbox Code Playgroud)
什么也没做.
所以,
问题:用户可以:更新整个模型,或者只是:读取它,我无法将其设置为:update或:读取特定属性.
我需要的是:用户能够:仅编辑特定属性.
问题:限制属性的正确语法是什么?我必须在其他一些文件上设置其他任何配置吗?
我的Ability.rb文件:
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if user.admin?
can :manage, :all
can :import, [User, Enclosure, Blade, Component]
else
can :access, :rails_admin
can :dashboard
can :read, :all
can :history, :all
# Allows user to only edit an enclosure, if it's allocated to itself, or not allocated at all
can :update, Enclosure do |enclosure|
can :update, Enclosure if (enclosure.allocated_to == user.email && enclosure.allocation == true) || enclosure.allocation == false
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
我正在使用的宝石(除了默认的Rails 4宝石):
# Administration Panel Gems
gem 'rails_admin' # Rails Administration Panel Gem
gem 'rails_admin_history_rollback' # Enables users to visualize and revert history
gem 'rails_admin_import', "~> 1.0.0" # Enables importing
gem 'devise' # Authentication Gem
gem 'cancancan' # Authorization Gem
gem 'paper_trail', '~> 4.0.0.rc' # Auditing Gem (History)
Run Code Online (Sandbox Code Playgroud)
谢谢!
我认为你应该使用强大的参数.此gem允许您选择要更新的参数.如果您使用的是Rails 4,则已安装gem,否则您可以安装它.
class UsersController < ApplicationController
load_and_authorize_resource
def update
if @user.update_attributes(update_params)
# hurray
else
render :edit
end
end
private
def update_params
if current_user.admin?
params.require(:user).permit(:user, :email, :password, :admin)
else
params.require(:user).permit(:user, :email, :password)
end
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1177 次 |
| 最近记录: |