发布
社区首页 >问答首页 >Neo4j和Rails:如何只返回基于用户权限的节点

Neo4j和Rails:如何只返回基于用户权限的节点
EN

Stack Overflow用户
提问于 2017-01-07 17:27:35
回答 1查看 66关注 0票数 1
  1. 如何返回用户拥有权限的项目的索引?
  2. 如何返回用户所在组具有权限的项目的索引?
  3. 仅当用户拥有权限时,如何返回单个项?
  4. 仅当用户所在的组具有权限时,如何返回单个项?

注意:我知道可以查询Item.all__,然后遍历数组并只提取.has_permissions == User__中的项,但这完全忽略了在图中包含所有内容的好处,因此不是答案。

为了保持这个简单,假设有三个对象:

  • 一项
  • 用户
  • A组

典型图形情况:

代码语言:javascript
代码运行次数:0
复制
(User)<-[:HAS_PERMISSIONS]-(Item)
(Group)<-[:HAS_PERMISSIONS]-(Item)
(Group)-[:HAS_MEMBERS]->(User)

与模型:

代码语言:javascript
代码运行次数:0
复制
class Item 
  include Neo4j::ActiveNode
  property :name, type: String
  property :description, type: String

  has_many :out, :user_permission_to, type: :PERMISSION_TO, model_class: :User
  has_many :out, :group_permission_to, type: :PERMISSION_TO, model_class: :Group
end

class Identity 
  include Neo4j::ActiveNode
  property :username, type: String

  has_many :in, :permission_to, type: :PERMISSION_TO, model_class: :Item
  has_many :in, :groups, type: :GROUP_MEMBER, model_class: :Group
end

class Group 
  include Neo4j::ActiveNode
  property :group_name, type: String

  has_many :in, :permission_to, type: :PERMISSION_TO, model_class: :Item
  has_many :out, :members, type: :GROUP_MEMBER, model_class: :User
end

对于简单的控制器:

代码语言:javascript
代码运行次数:0
复制
# GET /items
def index
  @items = Item.all
  render json: @items
end

# GET /item/1
def show
  render json: @item
end
EN

回答 1

Stack Overflow用户

发布于 2017-01-08 21:53:50

首先,我建议查看这篇文章 (下半部分涉及非常类似的访问控制)。

“如何返回用户拥有权限的项目的索引?”

你可以用几种方法。更明确地:

代码语言:javascript
代码运行次数:0
复制
identity.as(:id).query.match("(id)<-[PERMISSION_TO*1..2]-(item:Item)").pluck(:item)

或者,我认为这样做是可行的:

代码语言:javascript
代码运行次数:0
复制
identity.permission_to(rel_length: 1..2)

“如何返回用户所在组具有权限的项目的索引?”

简单:

代码语言:javascript
代码运行次数:0
复制
identity.groups.permission_to

“仅当用户拥有权限时,如何返回单个项?”

对于上述两种解决办法:

代码语言:javascript
代码运行次数:0
复制
identity.as(:id).query.match("(id)<-[PERMISSION_TO*1..2]-(item:Item)").limit(1).pluck(:item)

# or

identity.permission_to(rel_length: 1..2).first

“仅当用户所在的组具有权限时,如何返回单个项?”

代码语言:javascript
代码运行次数:0
复制
identity.groups.permission_to

另外,一些反馈意见:

使用“索引”一词的方式有点混乱,因为Neo4j有允许在标签上对属性进行性能查询的索引。

我可能会像这样做我的模特:

代码语言:javascript
代码运行次数:0
复制
class Item 
  include Neo4j::ActiveNode
  property :name, type: String
  property :description, type: String

  has_many :in, :users_with_permission, type: :CAN_ACCESS, model_class: :Identity
  has_many :in, :groups_with_permission, type: :CAN_ACCESS, model_class: :Group
end

class Identity 
  include Neo4j::ActiveNode
  property :username, type: String

  has_many :out, :accessible_items, type: :CAN_ACCESS, model_class: :Item
  has_many :out, :groups, type: :IN_GROUP # Don't need `model_class: :Group` here
end

class Group 
  include Neo4j::ActiveNode
  property :group_name, type: String

  has_many :out, :accessible_items, type: :CAN_ACCESS, model_class: :Item
  has_many :in, :members, type: :IN_GROUP, model_class: :Identity
  # You could also do:
  # has_many :in, :members, model_class: :Identity, origin: :groups
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41524340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档