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 +4 -4
- data/README.md +21 -37
- data/lib/can_play/controller.rb +1 -1
- data/lib/can_play/version.rb +1 -1
- data/lib/can_play.rb +10 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 118e6008d49cde4499d3473b9dff67015058ac8f
|
4
|
+
data.tar.gz: 63d21c9f2b80bea055281b7b7eaa2c7f13937d66
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
11
|
+
  运行bundle,安装完成后执行如下命令
|
25
12
|
|
26
13
|
```
|
27
14
|
rails generate can_play:install
|
28
15
|
```
|
29
16
|
|
30
|
-
|
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
|
-
|
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
|
-
|
121
|
-
|
122
|
-
|
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
|
-
|
115
|
+
  `collection`方法,可以控制某个用户对某类资源的控制权限。如list和create权限,在controller中,我们可以用`authorize!(:read, Contract)`来限制用户的访问。
|
133
116
|
|
134
|
-
|
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
|
-
|
122
|
+
### 如何使用
|
123
|
+
  对使用有不清楚的,可以查看https://github.com/happyming9527/can_play/wiki
|
data/lib/can_play/controller.rb
CHANGED
data/lib/can_play/version.rb
CHANGED
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
|
-
|
122
|
-
|
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.
|
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-
|
11
|
+
date: 2015-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|