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 +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
|
-

|
4
|
-
|
5
|
-
其中角色表在通过RoleResources这样的中间表和资源管理的权限进行关联。
|
6
|
-

|
7
|
-
|
8
|
-
使用Resource表做权限,字段可以有action、resource这样的字段,action表示行为,例如'create',resouce表示资源,可以是Order这样的类名。这样做当然够简单,但是主要问题是,你没法对权限做更详细的限制,例如你对供应商都赋予查看合同的权限,但是不同的供应商只能查看自己的合同,这在数据库层面是难以表示的。当然,你也可以在controller里面加入限制,但这就是将权限控制的逻辑分散开了,其实完全可以将他们集中写到一个文件中。将Resources变成一张伪表,将具体的权限限制写入一个叫resources.rb的文件,并将资源名称和具体权限名称释放出来。
|
9
|
-
|
10
|
-

|
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
|