我在我的Rails应用中运行Pundit进行授权。我似乎已经掌握了所有内容,但想知道如何限制编辑或更新操作到某个字段。
例如,用户可以编辑他们的user.first_name,user.mobile或user.birthday等,但不能编辑他们的user.role。基本上我的逻辑是,让用户编辑任何化妆品,但如果它有用,则不会。
这些字段应该只能由拥有' super_admin'的用户编辑。角色(我已在user.rb上设置了以下方法)。
def super_admin?
role == "super admin"
end
def account?
role == "account"
end
def segment?
role == "segment"
end
def sales?
role == "sale"
end
def regional?
role == "regional"
end
def national?
role == "national"
end
def global?
role == "global"
end
我几乎有一个干净的slate user_policy.rb
文件,其中更新和编辑操作是默认的
def update?
false
end
def edit?
update?
end
也许我认为这完全错了,应该只包装一个user.super_admin?如果声明围绕用户显示页面上的角色字段,但如果我只是使用该策略进行安全性,则会感觉不对。
答案 0 :(得分:4)
使用Pundit的allowed_attributes帮助程序,该帮助程序在gem的README页面中描述:https://github.com/elabs/pundit
# app/policies/post_policy.rb
class PostPolicy < ApplicationPolicy
def permitted_attributes
if user.admin? || user.owner_of?(post)
[:title, :body, :tag_list]
else
[:tag_list]
end
end
end
# app/controllers/posts_controller.rb
class PostsController < ApplicationController
def update
@post = Post.find(params[:id])
if @post.update_attributes(post_params)
redirect_to @post
else
render :edit
end
end
private
def post_params
params.require(:post).permit(policy(@post).permitted_attributes)
end
end
答案 1 :(得分:3)
在您的视图中,您可以根据用户的角色限制用户可以看到的内容。
用户视图
- if current_user.super_admin?
= f.select(:role, User.roles.keys.map {|role| [role.titleize.role]})
- else
= user.role
在政策中,您可以调用用户的角色以确保他们能够进行编辑。
class UserPolicy
attr_reader :current_user, :model
def initialize(current_user, model)
@current_user = current_user
@user = model
end
def edit?
@current_user.super_admin || @current_user == @user
end
end