can_play 0.2.9 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0c1f7997bbed17c25f1f156b38fd113640be01ad
4
- data.tar.gz: c139d5995062503127339e8782eff3d6dc240886
3
+ metadata.gz: 118e6008d49cde4499d3473b9dff67015058ac8f
4
+ data.tar.gz: 63d21c9f2b80bea055281b7b7eaa2c7f13937d66
5
5
  SHA512:
6
- metadata.gz: 654b4a8da4423dcec5682e55ca730c039db7cc53133bbdb15f9db2b8e58cd44159e01b21080fd7ff86f2d8880561e3cd4cb8862a7e241f092510534f334e106f
7
- data.tar.gz: a0f172eacf693264c03e16c4ea7786f6b0b1c8b553bb7ecf6c72282f3c979c2a8d34c06aedc5fe4421c19ab5182f3ebd08e3c9a5129bf5831f852eed118194e5
6
+ metadata.gz: a9a0ca283d060284017e0ef76c5b5c8eaea02e08fbc3da71595eb7768e4bd52b1d9c5261d4e5a24d60803c04f1652060f3bafe4e75bbbeb816807f605cf348a6
7
+ data.tar.gz: 044b3026d16fe494b15c90e0a04c1b7f005a9bbd924d45d6e5da41cd8f65049c1cb465a2532c6f50f8bb01995a8596a51661ad84a519bcb2a9dad7d6d7470f4a
data/README.md CHANGED
@@ -1,35 +1,22 @@
1
- can_plan集成了cancancan和consul的功能,使用简单的DSL描述用户对单个资源或某类资源的操作权限,可以完整控制用户对任何资源的访问权限。如要使用它,系统必须有用户模型,推荐使用角色模型,用户可以有多个角色,然后在角色上设置权限,让单个用户,根据角色不同获取不同权限,以下示例都会基于用户和角色的模型。
2
-
3
- ![](http://7xn1q4.com1.z0.glb.clouddn.com/gem_can_play_role.png)
4
-
5
- 其中角色表在通过RoleResources这样的中间表和资源管理的权限进行关联。
6
- ![](http://7xn1q4.com1.z0.glb.clouddn.com/gem_can_play_role_resources.png)
7
-
8
- 使用Resource表做权限,字段可以有action、resource这样的字段,action表示行为,例如'create',resouce表示资源,可以是Order这样的类名。这样做当然够简单,但是主要问题是,你没法对权限做更详细的限制,例如你对供应商都赋予查看合同的权限,但是不同的供应商只能查看自己的合同,这在数据库层面是难以表示的。当然,你也可以在controller里面加入限制,但这就是将权限控制的逻辑分散开了,其实完全可以将他们集中写到一个文件中。将Resources变成一张伪表,将具体的权限限制写入一个叫resources.rb的文件,并将资源名称和具体权限名称释放出来。
9
-
10
- ![](http://7xn1q4.com1.z0.glb.clouddn.com/gem_can_play_role_real.png)
11
-
1
+   can_plan集成了cancancan和consul这两个gem的功能,使用简单的DSL描述某个角色对单个资源或某类资源的操作权限,可以完整控制用户对资源的访问权限。如要使用它,系统必须有用户模型和角色模型。用户可以有多个角色,然后在角色上设置权限,让用户,根据角色不同获取不同权限,以下示例都会基于用户和角色的模型。
12
2
 
13
3
  ## 安装方式
14
4
 
15
-
16
- can_play在内部集成了cancancan和consul两个gem,所以没必要再安装这两个gem。
17
- ### can_play安装
18
- 在gemfile中加入can_play。
5
+   在gemfile中加入can_play。
19
6
 
20
7
  ```
21
8
  gem 'can_play'
22
9
  ```
23
10
 
24
- 运行bundle,安装完成后执行如下命令
11
+   运行bundle,安装完成后执行如下命令
25
12
 
26
13
  ```
27
14
  rails generate can_play:install
28
15
  ```
29
16
 
30
- 执行该命令会在initializer和locales文件夹下生成配置文件。
17
+   执行该命令会在initializer和locales文件夹下生成配置文件。
31
18
  initializer文件夹下的can_play.rb是can_play的基本配置文件。
32
- locales下的can_play.zh-Cn.yml文件用于描述权限名称。
19
+ locales下的can_play.zh-Cn.yml文件用于描述权限中文名称。
33
20
 
34
21
  # path_to_config/initializers/can_play.rb
35
22
  CanPlay::Config.setup do |config|
@@ -37,10 +24,13 @@ locales下的can_play.zh-Cn.yml文件用于描述权限名称。
37
24
  config.role_class_name = 'Role'
38
25
  config.role_resources_relation_name = 'role_resources'
39
26
  config.super_roles = ['超级管理员']
27
+ self.role_judge_method = 'role_is?'
40
28
  end
41
29
 
42
- can_play.rb配置文件中,可以传入用户类名(默认User)、角色类名(默认Role)、以及角色和权限的关联的名称(默认role_resources),role_resources_relation_name是角色类和操作权限资源之间的关联。
30
+   can_play.rb配置文件中,可以传入用户类名(默认User)、角色类名(默认Role)、以及角色和权限的关联的名称(默认role_resources),role_resources_relation_name是角色类和操作权限资源之间的关联,以及判断当前用户角色的方法(默认role_is?)。
31
+
43
32
 
33
+ # path_to_config/config/locales/can_play.zh-Cn.yml
44
34
  ---
45
35
  zh-CN:
46
36
  can_play:
@@ -63,13 +53,13 @@ can_play.rb配置文件中,可以传入用户类名(默认User)、角色
63
53
  purchaser_confirm: 采购人确认
64
54
  supplier_confirm: 供应商确认
65
55
 
66
- can_play.zh-CN.yml是中文翻译文件,在这里写下权限的英文和中文名称的对应,在前端就可以获取到权限的中文描述,其中common是一些常用权限名称,特别的权限名称,可以单独写,如contract下的terminate权限是合同独有的权限名称,必须单独写,而class_name也可以写上资源名称,如contract,如果不写,会默认去ActiveRecord的翻译文件下去取中文翻译。
56
+   can_play.zh-CN.yml是中文翻译文件,在这里写下权限的英文和中文名称的对应,在前端就可以获取到权限的中文描述,其中common是一些常用权限名称,特别的权限名称,可以单独写,如contract下的terminate权限是合同独有的权限名称,必须单独写,而class_name也可以写上资源名称,如contract,如果不写,会默认去ActiveRecord的翻译文件下去取中文翻译。
67
57
 
68
58
 
69
59
  ### DSL文件描述权限的方法
70
- dsl文件写法如下:
60
+   dsl文件写法如下:
71
61
 
72
- #用哪个类用来描写权限,可在intializer下的can_play.rb文件下描写。
62
+ # 类名,或文件名叫什么并不要紧,关键是要'include CanPlay'
73
63
  class Resource
74
64
  include CanPlay
75
65
  self.module_name = '核心模块'
@@ -117,23 +107,17 @@ dsl文件写法如下:
117
107
 
118
108
  end
119
109
 
120
- `limit`方法用于控制某个用户可以查看的资源的额列表,如Contract类下的limit限制了管理员可以查看所有合同,供应商和采购人只能查看和自己相关的合同。limit方法会让在controller中生成一个动态方法,`current_power.contracts`,这个方法返回的是是我们再limit中写如的对象,这样就能根据用户的信息返回不同的资源数组。
121
-
122
- `collection`方法,可以控制某个用户对某类资源的控制权限。如list和create权限,在controller中,我们可以用`authorize!(:read, Contract)`来限制用户的访问。
123
-
124
- `member`方法,可以控制用户对某个资源的控制权限,如read权限,在controller中我们可以用authorize!(:read, @contract)来限制用户的访问。
125
-
126
- `self.module_name = '核心模块'`是用来处理在多模块开发的环境下,各个模块可能有自己的resource文件,并可能出现中文的重名,权限最终要集中管理,module_name可以做个简单的分隔,让用户清楚某个权限属于哪个模块。
127
-
128
- 这些在controller中需要使用的current_power方法和authorize!方法分别是consul和cancancan中既有的方法。
129
-
130
- ### 和角色类之间建立关联
110
+
111
+   `group`是一个用于对资源做分组的宏。group方法可以只接一个类或模型,在其后再接一个代码块,并把刚才传给group的类或模型,传给这个代码块。他是limit、collection、member方法的容器。
112
+
113
+   `limit`方法用于控制某个用户可以查看的资源的额列表,如Contract类下的limit限制了管理员可以查看所有合同,供应商和采购人只能查看和自己相关的合同。limit方法会让在controller中生成一个动态方法,`current_power.contracts`,这个方法返回的是是我们再limit中写如的对象,这样就能根据用户的信息返回不同的资源数组。
131
114
 
132
- 此处的resouce文件相当于在数据库中的resouces表,以动态的语言记录了所有的权限。我们需要通过role_resources这样的中间表,建立角色和权限之间的关联。可以在数据库建立中间表role_resources。
115
+   `collection`方法,可以控制某个用户对某类资源的控制权限。如list和create权限,在controller中,我们可以用`authorize!(:read, Contract)`来限制用户的访问。
133
116
 
134
- controller或view中只要调用 CanPlay.splat_grouped_resources_with_chinese_desc就能返回所有的权限hash,并按资源进行了分组。如果调用CanPlay.grouped_resources_with_chinese_desc则返回按module_name分组后,再按资源名称分组的权限hash。我们用这个hash在表单中呈现,让用户勾选,然后在controller中保存角色和资源权限的关联。
117
+   `member`方法,可以控制用户对某个资源的控制权限,如read权限,在controller中我们可以用authorize!(:read, @contract)来限制用户的访问。
135
118
 
119
+   `self.module_name = '核心模块'`是用来处理在多模块开发的环境下,各个模块可能有自己的resource文件,并可能出现中文的重名,权限最终要集中管理,module_name可以做个简单的分隔,让用户清楚某个权限属于哪个模块。
136
120
 
137
- 其中roles_resources的表结构,至少要有role_id、resource_name字段,其中role_id关联角色,而 resource_name用于关联resource类(伪关联,实际不用加belongs_to这类关联)。
138
121
 
139
- 有了这个关联,加载页面,就可以自动执行权限的限制了,当然前提是你在controller的每个action加入了cancancan的权限限制语句authorize!。
122
+ ### 如何使用
123
+   对使用有不清楚的,可以查看https://github.com/happyming9527/can_play/wiki
@@ -3,7 +3,7 @@ class ActionController::Base
3
3
  current_power do
4
4
  CanPlay::Power.new(current_user)
5
5
  end
6
-
6
+ helper_method :play_resources
7
7
  # 对current_power采用动态方法调用的装饰者。
8
8
  class PlayResourceObject < BasicObject
9
9
  def initialize(obj, klass)
@@ -1,3 +1,3 @@
1
1
  module CanPlay
2
- VERSION = "0.2.9"
2
+ VERSION = "0.3.0"
3
3
  end
data/lib/can_play.rb CHANGED
@@ -103,7 +103,7 @@ module CanPlay
103
103
  if clazz.is_a?(Module)
104
104
  name = clazz.try(:table_name).presence || clazz.to_s.underscore.gsub('/', '_').pluralize
105
105
  group = NameImportantOpenStruct.new(name: name, klass: clazz)
106
- elsif clazz.blank? && opts.key?(:name)
106
+ elsif clazz.blank? && opts.key?(:name) && opts.key?(:klass)
107
107
  opts = opts.with_indifferent_access
108
108
  group = NameImportantOpenStruct.new(name: opts.delete(:name).to_s, klass: opts.delete(:klass))
109
109
  else
@@ -118,8 +118,15 @@ module CanPlay
118
118
  end
119
119
 
120
120
  def limit(name=nil, &block)
121
- raise "Need define group first" if current_group.nil?
122
- CanPlay::Power.power(name||current_group.name, &block)
121
+ if current_group.present?
122
+ CanPlay::Power.power(name||current_group.name, &block)
123
+ else
124
+ if name.present?
125
+ CanPlay::Power.power(name, &block)
126
+ else
127
+ raise 'limit name need set'
128
+ end
129
+ end
123
130
  end
124
131
 
125
132
  def collection(verb_or_verbs, opts={}, &block)
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: can_play
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - happyming9527
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-09-28 00:00:00.000000000 Z
11
+ date: 2015-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler