can_play 0.2.9 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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