right_on 0.2.0 → 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/CHANGELOG.md +10 -0
- data/lib/right_on.rb +0 -4
- data/lib/right_on/by_group.rb +47 -0
- data/lib/right_on/rails.rb +1 -0
- data/lib/right_on/right.rb +1 -62
- data/lib/right_on/role_model.rb +0 -13
- data/lib/right_on/version.rb +1 -1
- data/right_on.gemspec +0 -1
- data/spec/permission_defnied_spec.rb +66 -0
- data/spec/right_on_spec.rb +1 -17
- data/spec/role_model_spec.rb +0 -17
- data/spec/spec_helper.rb +0 -1
- data/spec/support/coverage_loader.rb +1 -1
- metadata +5 -17
- data/lib/right_on/restricted_by_right.rb +0 -56
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47a774795b314e80b1177664e0cd976febaa14c1
|
4
|
+
data.tar.gz: cf508fd4630a43d912fd91a9d9b1efa3b7167fdf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d43bab3c7da9f1b0828b15f1ec2e1c8101d2dfa9d39e36cc2915fbb09af250a8cd86582e940bf743ff06a4b20ccbd3347f1d7f528da5cc6b21f21a1741794478
|
7
|
+
data.tar.gz: abb42ecc1c3d731988a07b007a87d2bb7088550cab5627835b5426bc806e239b068b04c1bd91dc53e07562f463c671c2b78c8edf7e50d9fd825a79549d5eb419
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
4
4
|
This changelog adheres to [Keep a CHANGELOG](http://keepachangelog.com/).
|
5
5
|
|
6
|
+
## Unreleased
|
7
|
+
|
8
|
+
## 0.3.0
|
9
|
+
|
10
|
+
### Fixed
|
11
|
+
- Caching of rights in memory (causing tenant issues)
|
12
|
+
|
13
|
+
### Removed
|
14
|
+
- restricted_by_right no longer supported
|
15
|
+
|
6
16
|
## 0.2.0
|
7
17
|
|
8
18
|
### Added
|
data/lib/right_on.rb
CHANGED
@@ -0,0 +1,47 @@
|
|
1
|
+
module RightOn
|
2
|
+
class ByGroup
|
3
|
+
def initialize
|
4
|
+
@rights_by_name = Hash[Right.all.map{|r| [r.name, r]}]
|
5
|
+
end
|
6
|
+
|
7
|
+
def by_groups
|
8
|
+
rights = regular_rights_with_group
|
9
|
+
rights += (Right.all - rights)
|
10
|
+
rights.group_by(&:group)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def regular_rights_with_group
|
16
|
+
RightOn::Right.yaml_rights.each_pair.flat_map do |group, right_names|
|
17
|
+
right_names
|
18
|
+
.flat_map { |right_name| right_name_to_rights(right_name) }
|
19
|
+
.each { |r| r.group = group }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def right_name_to_rights(right_name)
|
24
|
+
case right_name
|
25
|
+
when String # controller
|
26
|
+
[rights_by_name!(right_name)]
|
27
|
+
when Hash # controller + actions
|
28
|
+
controller, actions = right_name.first
|
29
|
+
controller_rights(controller) + action_rights(controller, actions)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def controller_rights(controller)
|
34
|
+
r = @rights_by_name[controller]
|
35
|
+
return [] unless r
|
36
|
+
[r]
|
37
|
+
end
|
38
|
+
|
39
|
+
def action_rights(controller, actions)
|
40
|
+
actions.map { |action| rights_by_name!("#{controller}##{action}") }
|
41
|
+
end
|
42
|
+
|
43
|
+
def rights_by_name!(name)
|
44
|
+
@rights_by_name[name] or fail name.inspect
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/lib/right_on/rails.rb
CHANGED
data/lib/right_on/right.rb
CHANGED
@@ -16,78 +16,17 @@ module RightOn
|
|
16
16
|
attr_accessor :group
|
17
17
|
|
18
18
|
class << self
|
19
|
-
@@restricted_by_right_classes = []
|
20
|
-
|
21
|
-
def associate_group(klass, group)
|
22
|
-
# Prevent issues when reloading class using restricted_by_right
|
23
|
-
unless @@restricted_by_right_classes.include?(klass)
|
24
|
-
@@restricted_by_right_classes << klass
|
25
|
-
end
|
26
|
-
has_one klass.table_name.singularize.to_sym, dependent: :restrict_with_exception
|
27
|
-
end
|
28
|
-
|
29
19
|
def rights_yaml(file_path)
|
30
20
|
@@rights_yaml = file_path
|
31
21
|
end
|
32
22
|
|
33
23
|
def by_groups
|
34
|
-
|
35
|
-
rights += (Right.all - rights)
|
36
|
-
rights.group_by(&:group)
|
37
|
-
end
|
38
|
-
|
39
|
-
def regular_rights_with_group
|
40
|
-
yaml_rights.each_pair.flat_map do |group, right_names|
|
41
|
-
right_names
|
42
|
-
.flat_map { |right_name| right_name_to_rights(right_name) }
|
43
|
-
.each { |r| r.group = group }
|
44
|
-
end
|
24
|
+
RightOn::ByGroup.new.by_groups
|
45
25
|
end
|
46
26
|
|
47
27
|
def yaml_rights
|
48
28
|
YAML::load_file(@@rights_yaml)['rights']
|
49
29
|
end
|
50
|
-
|
51
|
-
def right_name_to_rights(right_name)
|
52
|
-
case right_name
|
53
|
-
when String # controller
|
54
|
-
[rights_by_name!(right_name)]
|
55
|
-
when Hash # controller + actions
|
56
|
-
controller, actions = right_name.first
|
57
|
-
controller_rights(controller) + action_rights(controller, actions)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def controller_rights(controller)
|
62
|
-
r = rights_by_name[controller]
|
63
|
-
return [] unless r
|
64
|
-
[r]
|
65
|
-
end
|
66
|
-
|
67
|
-
def action_rights(controller, actions)
|
68
|
-
actions.map { |action| rights_by_name!("#{controller}##{action}") }
|
69
|
-
end
|
70
|
-
|
71
|
-
def rights_by_name
|
72
|
-
@rights_by_name ||= Hash[Right.all.map{|r| [r.name, r]}]
|
73
|
-
end
|
74
|
-
|
75
|
-
def rights_by_name!(name)
|
76
|
-
rights_by_name[name] or fail name.inspect
|
77
|
-
end
|
78
|
-
|
79
|
-
def restricted_rights_with_group
|
80
|
-
@@restricted_by_right_classes.flat_map do |klass|
|
81
|
-
group = klass.restricted_by_right_group
|
82
|
-
all_rights(klass).map(&:right).sort_by(&:name).each do |right|
|
83
|
-
right.group = group
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
def all_rights(klass)
|
89
|
-
klass.includes(:right).all
|
90
|
-
end
|
91
30
|
end
|
92
31
|
|
93
32
|
# Is this right allowed for the given context?
|
data/lib/right_on/role_model.rb
CHANGED
@@ -5,10 +5,6 @@ module RightOn
|
|
5
5
|
Role.module_eval "has_and_belongs_to_many :#{base.table_name}"
|
6
6
|
end
|
7
7
|
|
8
|
-
def roles_allowed_to_assign
|
9
|
-
Role.accessible_to(self)
|
10
|
-
end
|
11
|
-
|
12
8
|
def rights
|
13
9
|
@rights ||=
|
14
10
|
Right
|
@@ -17,15 +13,6 @@ module RightOn
|
|
17
13
|
.where('rights_roles.role_id IN (?)', role_ids)
|
18
14
|
end
|
19
15
|
|
20
|
-
def has_access_to?(client_type)
|
21
|
-
has_right?(client_type.right)
|
22
|
-
end
|
23
|
-
|
24
|
-
def has_right?(right_or_string)
|
25
|
-
right = right_or_string.is_a?(Right) ? right_or_string : Right.find_by_name(right_or_string)
|
26
|
-
rights.include?(right)
|
27
|
-
end
|
28
|
-
|
29
16
|
def has_privileges_of?(other_user)
|
30
17
|
(other_user.rights - rights).empty?
|
31
18
|
end
|
data/lib/right_on/version.rb
CHANGED
data/right_on.gemspec
CHANGED
@@ -20,7 +20,6 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_dependency 'activerecord', '>= 3.2.0'
|
22
22
|
spec.add_dependency 'activesupport', '>= 3.2.0'
|
23
|
-
spec.add_dependency 'dependent_restrict', '>= 0.2.3'
|
24
23
|
spec.add_dependency 'input_reader', '~> 0.0'
|
25
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
26
25
|
spec.add_development_dependency 'rake'
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RightOn::PermissionDeniedResponse do
|
4
|
+
let(:controller_action_options) { { controller: 'users', action: 'destroy' } }
|
5
|
+
let(:params) { { controller: 'users' } }
|
6
|
+
subject { RightOn::PermissionDeniedResponse.new(params, controller_action_options) }
|
7
|
+
|
8
|
+
let(:allowed) {
|
9
|
+
double(name: 'create_user', allowed?: true, roles: [double(title: 'Users')])
|
10
|
+
}
|
11
|
+
let(:denied) { double(allowed?: false) }
|
12
|
+
|
13
|
+
let(:no_right_for_page) {
|
14
|
+
'No right is defined for this page: users. '\
|
15
|
+
'Contact your system manager to notify this problem.'
|
16
|
+
}
|
17
|
+
let(:no_roles_for_page) { 'N/A (as no right is assigned for this action)' }
|
18
|
+
|
19
|
+
before do
|
20
|
+
stub_const 'RightOn::Right', double(all: [right])
|
21
|
+
end
|
22
|
+
|
23
|
+
context '#text_message' do
|
24
|
+
context 'when right exists' do
|
25
|
+
let(:right) { allowed }
|
26
|
+
|
27
|
+
specify {
|
28
|
+
expect(subject.text_message).to eq(
|
29
|
+
"You are not authorised to perform the requested operation.\n"\
|
30
|
+
"Right required: #[Double (anonymous)]\n"\
|
31
|
+
"This right is given to the following roles: Users.\n"\
|
32
|
+
"Contact your system manager to be given this right.\n"
|
33
|
+
)
|
34
|
+
}
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'when right not allowed' do
|
38
|
+
let(:right) { denied }
|
39
|
+
specify { expect(subject.text_message).to eq no_right_for_page }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
context '#to_json' do
|
44
|
+
context 'when right exists' do
|
45
|
+
let(:right) { allowed }
|
46
|
+
specify {
|
47
|
+
expect(subject.to_json).to eq(
|
48
|
+
error: 'Permission Denied',
|
49
|
+
right_allowed: 'create_user',
|
50
|
+
roles_for_right: ['Users']
|
51
|
+
)
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'when right allowed' do
|
56
|
+
let(:right) { denied }
|
57
|
+
specify {
|
58
|
+
expect(subject.to_json).to eq(
|
59
|
+
error: 'Permission Denied',
|
60
|
+
right_allowed: no_right_for_page,
|
61
|
+
roles_for_right: no_roles_for_page
|
62
|
+
)
|
63
|
+
}
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/spec/right_on_spec.rb
CHANGED
@@ -29,31 +29,17 @@ describe RightOn::Right do
|
|
29
29
|
end
|
30
30
|
|
31
31
|
it 'should display nicely with sensible_name and to_s' do
|
32
|
-
expect(@model.right.to_s).to eq 'Model: Test'
|
33
32
|
expect(@other.to_s).to eq 'models'
|
34
33
|
expect(@index.to_s).to eq 'models#index'
|
35
34
|
|
36
|
-
expect(@model.right.sensible_name).to eq 'Model: Test'
|
37
35
|
expect(@other.sensible_name).to eq 'Models'
|
38
36
|
expect(@index.sensible_name).to eq 'Models - Index'
|
39
37
|
end
|
40
38
|
|
41
|
-
it 'should create right for restricted right' do
|
42
|
-
right = @model.right
|
43
|
-
expect(right).to_not be_nil
|
44
|
-
expect(right.name).to eq 'Model: Test'
|
45
|
-
expect{right.destroy}.to raise_error(ActiveRecord::DetailedDeleteRestrictionError)
|
46
|
-
end
|
47
|
-
|
48
39
|
it 'should identify correct groups' do
|
49
|
-
rights = RightOn::Right.regular_rights_with_group.sort_by{|r| r.name} # Sort for ruby 1.9 compatibility
|
50
|
-
expect(rights.map(&:name)).to eq %w(models models#change models#index models#view users)
|
51
|
-
expect(rights.map(&:group)).to eq %w(general general general general admin)
|
52
|
-
|
53
40
|
expect(RightOn::Right.by_groups).to eq(
|
54
41
|
'general' => [@other, @index, @view, @change],
|
55
|
-
'admin' => [@users]
|
56
|
-
'other' => [@model.right]
|
42
|
+
'admin' => [@users]
|
57
43
|
)
|
58
44
|
end
|
59
45
|
|
@@ -62,8 +48,6 @@ describe RightOn::Right do
|
|
62
48
|
edit_action = {:controller => 'models', :action => 'edit'}
|
63
49
|
hello_action = {:controller => 'models', :action => 'hello'}
|
64
50
|
|
65
|
-
expect(@model.right.allowed?(index_action)).to eq false
|
66
|
-
|
67
51
|
expect(@users.allowed?(:controller => 'users', :action => 'index')).to eq true
|
68
52
|
expect(@users.allowed?(:controller => 'users', :action => 'edit' )).to eq true
|
69
53
|
expect(@users.allowed?(:controller => 'users', :action => 'hello')).to eq true
|
data/spec/role_model_spec.rb
CHANGED
@@ -15,31 +15,14 @@ describe RightOn::RoleModel do
|
|
15
15
|
|
16
16
|
it 'basic user should have no access' do
|
17
17
|
expect(basic_user.rights).to be_empty
|
18
|
-
expect(basic_user.has_right?('Products')).to be false
|
19
|
-
expect(basic_user.has_right?(product_right)).to be false
|
20
18
|
end
|
21
19
|
|
22
20
|
it 'admin user should have full access' do
|
23
21
|
expect(admin.rights.size).to eq 1
|
24
|
-
expect(admin.has_right?('Products')).to be true
|
25
|
-
expect(admin.has_right?(product_right)).to be true
|
26
22
|
end
|
27
23
|
|
28
24
|
it '#has_privileges_of?' do
|
29
25
|
expect(admin.has_privileges_of?(basic_user)).to be true
|
30
26
|
expect(basic_user.has_privileges_of?(admin)).to be false
|
31
27
|
end
|
32
|
-
|
33
|
-
context 'when associating rights of other objects' do
|
34
|
-
let(:model1) { Model.create! }
|
35
|
-
|
36
|
-
before do
|
37
|
-
admin_role.rights << model1.right
|
38
|
-
end
|
39
|
-
|
40
|
-
it '#has_access_to?' do
|
41
|
-
expect(admin.has_access_to?(model1)).to be true
|
42
|
-
expect(basic_user.has_access_to?(model1)).to be false
|
43
|
-
end
|
44
|
-
end
|
45
28
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: right_on
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Noack
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-
|
12
|
+
date: 2017-08-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -39,20 +39,6 @@ dependencies:
|
|
39
39
|
- - ">="
|
40
40
|
- !ruby/object:Gem::Version
|
41
41
|
version: 3.2.0
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: dependent_restrict
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - ">="
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: 0.2.3
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - ">="
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 0.2.3
|
56
42
|
- !ruby/object:Gem::Dependency
|
57
43
|
name: input_reader
|
58
44
|
requirement: !ruby/object:Gem::Requirement
|
@@ -200,13 +186,13 @@ files:
|
|
200
186
|
- gemfiles/rails5.gemfile
|
201
187
|
- lib/right_on.rb
|
202
188
|
- lib/right_on/action_controller_extensions.rb
|
189
|
+
- lib/right_on/by_group.rb
|
203
190
|
- lib/right_on/generators/USAGE
|
204
191
|
- lib/right_on/generators/right_migration_generator.rb
|
205
192
|
- lib/right_on/generators/templates/right_migration.rb
|
206
193
|
- lib/right_on/permission_denied_response.rb
|
207
194
|
- lib/right_on/rails.rb
|
208
195
|
- lib/right_on/railtie.rb
|
209
|
-
- lib/right_on/restricted_by_right.rb
|
210
196
|
- lib/right_on/right.rb
|
211
197
|
- lib/right_on/rights_manager.rb
|
212
198
|
- lib/right_on/role.rb
|
@@ -216,6 +202,7 @@ files:
|
|
216
202
|
- lib/right_on/version.rb
|
217
203
|
- right_on.gemspec
|
218
204
|
- spec/action_controller_extensions_spec.rb
|
205
|
+
- spec/permission_defnied_spec.rb
|
219
206
|
- spec/right_on_spec.rb
|
220
207
|
- spec/role_model_spec.rb
|
221
208
|
- spec/schema.rb
|
@@ -250,6 +237,7 @@ specification_version: 4
|
|
250
237
|
summary: Set of extensions to core rails to give rights and roles.
|
251
238
|
test_files:
|
252
239
|
- spec/action_controller_extensions_spec.rb
|
240
|
+
- spec/permission_defnied_spec.rb
|
253
241
|
- spec/right_on_spec.rb
|
254
242
|
- spec/role_model_spec.rb
|
255
243
|
- spec/schema.rb
|
@@ -1,56 +0,0 @@
|
|
1
|
-
module RightOn
|
2
|
-
module RestrictedByRight
|
3
|
-
|
4
|
-
def self.included(base)
|
5
|
-
base.extend(ClassMethods)
|
6
|
-
end
|
7
|
-
|
8
|
-
module ClassMethods
|
9
|
-
def restricted_by_right(options = {})
|
10
|
-
options ||= {}
|
11
|
-
group = options.fetch(:group, 'other')
|
12
|
-
|
13
|
-
@right_on_config ||= {}
|
14
|
-
@right_on_config[:restricted_by_right_group] = group
|
15
|
-
|
16
|
-
Right.associate_group(self, group)
|
17
|
-
|
18
|
-
class << self
|
19
|
-
def accessible_to(user)
|
20
|
-
all.select{|o| user.rights.include?(o.right)}
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
include InstanceMethods
|
25
|
-
|
26
|
-
belongs_to :right, :class_name => 'RightOn::Right'
|
27
|
-
before_create :create_access_right!
|
28
|
-
after_destroy :destroy_access_right!
|
29
|
-
end
|
30
|
-
|
31
|
-
def restricted_by_right_group
|
32
|
-
(@right_on_config || {})[:restricted_by_right_group]
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
module InstanceMethods
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
def create_access_right!
|
41
|
-
right_name = "#{self.class.name.titleize}: #{name}"
|
42
|
-
self.right = find_right(right_name) || Right.create!(:name => right_name)
|
43
|
-
end
|
44
|
-
|
45
|
-
def find_right(name)
|
46
|
-
Right.find_by(:name => name)
|
47
|
-
end
|
48
|
-
|
49
|
-
def destroy_access_right!
|
50
|
-
self.right.try(:destroy)
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|
56
|
-
end
|