role_core 0.0.14 → 0.0.15

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
  SHA256:
3
- metadata.gz: 2c75876caf7676f2733564e2f0657b8625c798d29ee7de9e45a21bc66312e54d
4
- data.tar.gz: 8bfb27b3b34481cb4cf566d3ff336e9450b45020a9109a201d7ac21e1e81194f
3
+ metadata.gz: 293e6cf06bd28270f0d19f2d20f57ea8387849067b324fcfea3fb627cb11c841
4
+ data.tar.gz: d1e32d432228cc32598e0309474179d7eaea3fc9734be71fc5f3717dd27b5ebb
5
5
  SHA512:
6
- metadata.gz: 3c4d3a8e2c38049412bc12f8e048093710ee3f929d9f6cac96525de98ecd6e1f8b4851792e905f8c0c2cc7a467a04cff9512c03d435d585b1c29c3e04b4fb437
7
- data.tar.gz: fb14f0557dc1b7349b69e647297ebe3033b97138665b2c5314cccf5456933552aa6b0b6c906f258abf7a55be3f05e59e0e1a77ad26714151738e32e431da66bf
6
+ metadata.gz: 8c6d27326c402fe05183bd06840c84621093905efb98beafc9969c1d8847e9268f26e990ffaec62436ae9bc8316d10afe4080dac7eda9abe6e374de6edc1042e
7
+ data.tar.gz: 74385a5cce46f0202ea498916fa7471added4ad6185b13f19d2dcd7eac1d2810c9d159a0f535bf691d80fe6c5ffdc0dfcd06d59260e582c48c824396c346a4aa
data/README.md CHANGED
@@ -3,12 +3,93 @@ RoleCore
3
3
 
4
4
  RoleCore is a Rails engine which could provide essential industry of Role-based access control.
5
5
 
6
- <img width="550" alt="2018-03-12 10 12 21" src="https://user-images.githubusercontent.com/5518/37262401-e6c9d604-25dd-11e8-849d-7f7d923d5f18.png">
6
+ ## Demo
7
+
8
+ The dummy app shows a simple multiple roles with CanCanCan integration including a management UI.
9
+
10
+ <img width="550" alt="RoleCore dummy preview" src="https://user-images.githubusercontent.com/5518/37262401-e6c9d604-25dd-11e8-849d-7f7d923d5f18.png">
11
+
12
+ Clone the repository.
13
+
14
+ ```sh
15
+ $ git clone https://github.com/rails-engine/role_core.git
16
+ ```
17
+
18
+ Change directory
19
+
20
+ ```sh
21
+ $ cd role_core
22
+ ```
23
+
24
+ Run bundler
25
+
26
+ ```sh
27
+ $ bundle install
28
+ ```
7
29
 
8
- It's only provides the ability to define permissions and pre-made Role model.
30
+ Preparing database
9
31
 
10
- In addition, it's not handle the authentication or authorization,
11
- you should integrate with CanCanCan, Pundit or other solutions by yourself.
32
+ ```sh
33
+ $ bin/rails db:migrate
34
+ ```
35
+
36
+ Start the Rails server
37
+
38
+ ```sh
39
+ $ bin/rails s
40
+ ```
41
+
42
+ Open your browser, and visit `http://localhost:3000`
43
+
44
+ ## What's does the RoleCore do
45
+
46
+ ### The role model
47
+
48
+ The essence of RBAC is the role, despite your application, there are many possibilities: single-role, multi-roles, extendable-role and the role may associate to different kinds of resources (e.g: users and groups)
49
+
50
+ RoleCore provides a essential definition of Role,
51
+ you have to add association to adapt to your application,
52
+ for example:
53
+
54
+ - single-role: adding `one-to-many` association between Role and User
55
+ - multi-roles: adding `many-to-many` association between Role and User
56
+ - extendable-role: adding a self-association to Role
57
+ - polymorphic-asscociated-role: consider using polymorphic association technique
58
+
59
+ Although it's not out-of-box, but it will give you fully flexibility to suit your needs.
60
+
61
+ ### Permissions definition
62
+
63
+ RoleCore provides a DSL (which inspired by [Redmine](https://github.com/redmine/redmine/blob/master/lib/redmine.rb#L76-L186)) that allows you define permissions for your application.
64
+
65
+ Empowered by virtual model technique,
66
+ these permissions your defined can be persisted through serialization,
67
+ and can be used with OO-style, for example: `role.permissions.project.create?`
68
+
69
+ There also support permission groups, and groups support nesting.
70
+
71
+ I18n is supported too.
72
+
73
+ In fact, the essence of permissions is Hash, keys are permissions, and values are booleans. so computing of permissions with many roles, can be understood as computing of Hashes.
74
+
75
+ ### Management UI
76
+
77
+ Building a management UI is difficult,
78
+ but virtual model technique will translates permissions to a virtual model's (a class that conforms to ActiveModel) attributes,
79
+ and groups will translates to nested virtual models,
80
+ that means you can use all Rails view helpers including the mighty form builder,
81
+ and can benefit to Strong Parameter.
82
+
83
+ The dummy app shows that rendering a permission list [only about 20 lines](https://github.com/rails-engine/role_core/blob/master/test/dummy/app/views/roles/_permissions.html.erb).
84
+
85
+ If your application is API-only, you can simply dumping the role's permissions to JSON, and can still be benefit to StrongParameter.
86
+
87
+ ### Checking permission
88
+
89
+ RoleCore **DOES NOT** handle the authentication or authorization directly,
90
+ you have to integrate with CanCanCan, Pundit or other solutions by yourself.
91
+
92
+ RoleCore can be working with CanCanCan, Pundit easily and happily.
12
93
 
13
94
  ## Installation
14
95
 
@@ -48,7 +129,7 @@ Run model generator
48
129
  $ bin/rails g role_core:model
49
130
  ```
50
131
 
51
- ## Getting Start
132
+ ## Getting start
52
133
 
53
134
  ### Define permissions
54
135
 
@@ -57,11 +138,15 @@ checking it to know how to define permissions.
57
138
 
58
139
  In addition, there also includes a directive about how to integrate with CanCanCan.
59
140
 
60
- ### Hook up to application
141
+ #### I18n
61
142
 
62
- In order to obtain maximum customability, you need to hooking up role(s) to your user model by yourself.
143
+ Check `config/locales/role_core.en.yml`
63
144
 
64
- #### For User who has single role
145
+ ### Hook application
146
+
147
+ In order to obtain maximum customizability, you need to hooking up role(s) to your user model by yourself.
148
+
149
+ #### User who has single role
65
150
 
66
151
  ##### Create `one-to-many` relationship between Role and User
67
152
 
@@ -77,7 +162,7 @@ Then do migrate
77
162
  $ bin/rails db:migrate
78
163
  ```
79
164
 
80
- Declare `a User belongs to a Role`
165
+ Declare `a User belongs to a Role` association
81
166
 
82
167
  ```ruby
83
168
  class User < ApplicationRecord
@@ -87,7 +172,7 @@ class User < ApplicationRecord
87
172
  end
88
173
  ```
89
174
 
90
- Declare `a Role has many Users`
175
+ Declare `a Role has many Users` association
91
176
 
92
177
  ```ruby
93
178
  class Role < RoleCore::Role
@@ -95,9 +180,9 @@ class Role < RoleCore::Role
95
180
  end
96
181
  ```
97
182
 
98
- ##### Check permission
183
+ ##### Checking permission
99
184
 
100
- Permssions you've defined will translate to a virtual model (a Class which implemented ActiveModel interface),
185
+ Permissions you've defined will translate to a virtual model (a Class which implemented ActiveModel interface),
101
186
  `permission` would be an attribute, `group` would be a nested virtual model (like ActiveRecord's `has_one` association).
102
187
 
103
188
  So you can simply check permission like:
@@ -128,7 +213,7 @@ user.permissions.project.read?
128
213
 
129
214
  _Keep in mind: fetching `role` will made a SQL query, you may need eager loading to avoid N+1 problem in some cases._
130
215
 
131
- #### For User who has multiple roles
216
+ #### User who has multiple roles
132
217
 
133
218
  ##### Create `many-to-many` relationship between Role and User
134
219
 
@@ -144,7 +229,7 @@ Then do migrate
144
229
  $ bin/rails db:migrate
145
230
  ```
146
231
 
147
- Declare `a User has many Roles through RoleAssignments`
232
+ Declare `a User has many Roles through RoleAssignments` association
148
233
 
149
234
  ```ruby
150
235
  class User < ApplicationRecord
@@ -155,7 +240,7 @@ class User < ApplicationRecord
155
240
  end
156
241
  ```
157
242
 
158
- Declare `a Role has many Users through RoleAssignments`
243
+ Declare `a Role has many Users through RoleAssignments` association
159
244
 
160
245
  ```ruby
161
246
  class Role < RoleCore::Role
@@ -166,7 +251,7 @@ end
166
251
 
167
252
  ##### Check permission
168
253
 
169
- Permssions you've defined will translate to a virtual model (a Class which implemented ActiveModel interface),
254
+ Permissions you've defined will translate to a virtual model (a Class which implemented ActiveModel interface),
170
255
  `permission` would be an attribute, `group` would be a nested virtual model (like ActiveRecord's `has_one` association).
171
256
 
172
257
  So you can simply check permission like:
@@ -211,63 +296,27 @@ Open your User model:
211
296
  Add a delegate to User model:
212
297
 
213
298
  ```ruby
214
- delegate :permitted_permissions, to: :role
299
+ delegate :computed_permissions, to: :role
215
300
  ```
216
301
 
217
302
  - For a user who has multiple roles:
218
303
 
219
- Add a `permitted_permissions` public method to User model:
304
+ Add a `computed_permissions` public method to User model:
220
305
 
221
306
  ```ruby
222
- def permitted_permissions
223
- roles.map(&:permitted_permissions).reduce(RoleCore::ComputedPermissions.new, &:concat)
307
+ def computed_permissions
308
+ roles.map(&:computed_permissions).reduce(RoleCore::ComputedPermissions.new, &:concat)
224
309
  end
225
310
  ```
226
311
 
227
- Open `app/models/ability.rb`, add `user.permitted_permissions.call(self, user)` to `initialize` method.
312
+ Open `app/models/ability.rb`, add `user.computed_permissions.call(self, user)` to `initialize` method.
228
313
 
229
- You can check RoleCore's Demo (see below) for better understanding.
314
+ You can check dummy app for better understanding.
230
315
 
231
316
  ### Management UI
232
317
 
233
318
  See [RolesController in dummy app](https://github.com/rails-engine/role_core/blob/master/test/dummy/app/controllers/roles_controller.rb)
234
- and relates [view](https://github.com/rails-engine/role_core/blob/master/test/dummy/app/views/roles/_form.html.erb).
235
-
236
- ## Demo
237
-
238
- The dummy app shows a simple multiple roles with CanCanCan integration includes management UI.
239
-
240
- Clone the repository.
241
-
242
- ```sh
243
- $ git clone https://github.com/rails-engine/role_core.git
244
- ```
245
-
246
- Change directory
247
-
248
- ```sh
249
- $ cd role_core
250
- ```
251
-
252
- Run bundler
253
-
254
- ```sh
255
- $ bundle install
256
- ```
257
-
258
- Preparing database
259
-
260
- ```sh
261
- $ bin/rails db:migrate
262
- ```
263
-
264
- Start the Rails server
265
-
266
- ```sh
267
- $ bin/rails s
268
- ```
269
-
270
- Open your browser, and visit `http://localhost:3000`
319
+ and relates [view](https://github.com/rails-engine/role_core/blob/master/test/dummy/app/views/roles/_form.html.erb) for details.
271
320
 
272
321
  ## Contributing
273
322
 
@@ -286,3 +335,5 @@ Please write unit test with your code if necessary.
286
335
  ## License
287
336
 
288
337
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
338
+
339
+
@@ -9,7 +9,7 @@ module RoleCore::Concerns
9
9
  validates :name,
10
10
  presence: true
11
11
 
12
- delegate :permitted_permissions, to: :permissions
12
+ delegate :computed_permissions, to: :permissions
13
13
 
14
14
  serialize :permissions, RoleCore.permission_set_class
15
15
  end
@@ -6,10 +6,10 @@ module RoleCore
6
6
  attributes.select { |_, v| v }.keys
7
7
  end
8
8
 
9
- def permitted_permissions(include_nested: true)
9
+ def computed_permissions(include_nesting: true)
10
10
  permissions = self.class.registered_permissions.slice(*permitted_permission_names).values
11
- if include_nested && nested_attributes.any?
12
- permissions.concat nested_attributes.values.map(&:permitted_permissions).flatten!
11
+ if include_nesting && nested_attributes.any?
12
+ permissions.concat nested_attributes.values.map(&:computed_permissions).flatten!
13
13
  end
14
14
 
15
15
  ComputedPermissions.new(permissions)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RoleCore
4
- VERSION = "0.0.14"
4
+ VERSION = "0.0.15"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: role_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.14
4
+ version: 0.0.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - jasl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-04-25 00:00:00.000000000 Z
11
+ date: 2018-04-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails