rbac_rls 0.1.3 → 0.1.5
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 +90 -31
- data/app/controllers/rbac_rls/permissions_controller.rb +5 -1
- data/app/controllers/rbac_rls/roles_controller.rb +7 -1
- data/app/models/concerns/manage_rls_migration_concern.rb +1 -1
- data/app/models/rbac_rls/group.rb +2 -5
- data/app/models/rbac_rls/permission.rb +26 -5
- data/app/models/rbac_rls/role.rb +23 -1
- data/app/views/rbac_rls/groups/_form.html.erb +6 -6
- data/app/views/rbac_rls/groups/_group.html.erb +8 -12
- data/app/views/rbac_rls/groups/_group_permission_fields.html.erb +2 -2
- data/app/views/rbac_rls/groups/_group_user_fields.html.erb +1 -1
- data/app/views/rbac_rls/groups/edit.html.erb +2 -2
- data/app/views/rbac_rls/groups/index.html.erb +12 -6
- data/app/views/rbac_rls/groups/new.html.erb +1 -1
- data/app/views/rbac_rls/groups/show.html.erb +4 -5
- data/app/views/rbac_rls/permissions/_form.html.erb +15 -12
- data/app/views/rbac_rls/permissions/_permission.html.erb +37 -54
- data/app/views/rbac_rls/permissions/_role_permission_fields.html.erb +2 -2
- data/app/views/rbac_rls/permissions/index.html.erb +12 -5
- data/app/views/rbac_rls/permissions/show.html.erb +7 -6
- data/app/views/rbac_rls/roles/_form.html.erb +13 -12
- data/app/views/rbac_rls/roles/_user_role_fields.html.erb +1 -1
- data/app/views/rbac_rls/roles/index.html.erb +1 -3
- data/app/views/rbac_rls/roles/new.html.erb +1 -1
- data/app/views/rbac_rls/roles/show.html.erb +9 -3
- data/app/views/rbac_rls/shared/_user.html.erb +6 -0
- data/lib/generators/rbac_rls/templates/group_permission_migration.rb +1 -1
- data/lib/generators/rbac_rls/templates/rls_migration.rb +4 -4
- data/lib/rbac_rls/version.rb +2 -2
- data/lib/rbac_rls.rb +4 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a78283c1080582d297d67402835e23261cb3676c1083b7a11283fe983f5b6e4c
|
4
|
+
data.tar.gz: b4193df304d181c3e51c8e0a2de4229dbc11279833314bc77fa571102275a27c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80ce3e50e315e100fc31febcb62c8f4e8f1068d0d87933c6a45b0fd609eba6f42b4898a0aae8f12549249a21d433fddc21bbbdef93dcaea9a58a156898c85e71
|
7
|
+
data.tar.gz: beb7a1969bd9bad2f70e460a51e403e9fc2798ccf2edbe7dc1d3894d05f2c87927dc8bc133d325160d06af524a360da36ac61acdb9b317c5345ea60173386b52
|
data/README.md
CHANGED
@@ -1,66 +1,125 @@
|
|
1
1
|
# RbacRls
|
2
|
-
Short description and motivation.
|
3
2
|
|
4
|
-
|
5
|
-
|
3
|
+
Esta biblioteca tem por finalidade prover a funcionalidade de controle de acesso granular aos
|
4
|
+
dados, contribuindo para a segurança através de verificações de acesso a informação. Este
|
5
|
+
modelo tem como base os conceitos do recurso de controle de acesso RBAC(Role-Based
|
6
|
+
Access Control ) aplicados juntamente aos métodos de RLS(Row-Level Security).
|
6
7
|
|
7
|
-
|
8
|
-
|
8
|
+
O framework proposto tem por objetivo facilitar a implantação da funcionalidade
|
9
|
+
de segurança, auxiliando o programador na implementação das políticas de restrições no
|
10
|
+
banco de dados.
|
11
|
+
|
12
|
+
## RLS:
|
13
|
+
|
14
|
+
A segurança em nível de linha permite que você use um contexto de execução para controlar o acesso a
|
15
|
+
linhas em uma tabela de banco de dados, simplificando o design e a codificação de
|
16
|
+
segurança da sua aplicação.
|
17
|
+
|
18
|
+
## RBAC:
|
19
|
+
|
20
|
+
O controle de acesso baseado em função (RBAC) é um modelo de restrição de que tem como base as funções de usuários
|
21
|
+
individuais em um contexto hierárquico. O RBAC garante que os usuários acessem apenas as informações de que precisam
|
22
|
+
para realizar suas rotina e os impede de acessar informações que não pertencem a eles.
|
23
|
+
|
24
|
+
# Como utilizar esta Gem ?.
|
25
|
+
|
26
|
+
###
|
27
|
+
Caso queira Apenas Testar há essa aplicação principal com um Scaffold básico "produtos" de exemplo: https://gitlab.com/FilipeBeserraMaia/example_to_test
|
28
|
+
|
29
|
+
|
30
|
+
### Instalação:
|
31
|
+
|
32
|
+
Adicione esta linha no arquivo da sua aplicação Gemfile
|
9
33
|
|
10
34
|
```ruby
|
11
35
|
gem "rbac_rls"
|
12
36
|
```
|
13
37
|
|
14
|
-
|
38
|
+
E então execute o seguinte comando:
|
39
|
+
|
15
40
|
```bash
|
16
41
|
$ bundle
|
17
42
|
```
|
18
43
|
|
19
|
-
|
44
|
+
Ou Instale você mesmo manualmente com o comando abaixo :
|
45
|
+
|
20
46
|
```bash
|
21
47
|
$ gem install rbac_rls
|
22
48
|
```
|
23
|
-
|
24
|
-
|
49
|
+
|
50
|
+
Adicione no seu arquivo manifest.js:
|
51
|
+
|
52
|
+
```javascript
|
25
53
|
//= link rbac_rls/application.css
|
26
54
|
//= link rbac_rls/application.js
|
27
55
|
```
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
56
|
+
|
57
|
+
##### Adicione no seu arquivo application_record.rb:
|
58
|
+
|
59
|
+
```ruby
|
60
|
+
#Em application_record.rb
|
61
|
+
include ConnectionRlsConcern
|
62
|
+
```
|
63
|
+
|
64
|
+
##### Adicione no seu arquivo application_controller.rb:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
#Em application_controller.rb"
|
68
|
+
include ConnectionRlsUserConcern
|
32
69
|
```
|
70
|
+
|
33
71
|
```bash
|
34
|
-
|
35
|
-
|
72
|
+
Para fazer o uso desta biblioteca é necessário que a aplicação principal, acesse o banco de dados apartir de um
|
73
|
+
usuário que não é o dono do banco de dados pois, as regras de Segurança em nivél de linha não podem ser aplicadas a
|
74
|
+
este tipo de usuário do banco de dados.
|
75
|
+
Então: apenas para casos onde seja necessario rodar migrates como administrador utilize um novo Environment ou um método
|
76
|
+
diferente de conexão com o banco que não seja como da aplicação principal
|
77
|
+
Por exemplo:
|
78
|
+
a aplicação por padrão utilizará um usuário "app_user" para suas consultas.
|
79
|
+
para rodar as migrates da aplicação o usuário padrão será "data_base_admin"
|
80
|
+
logo no environment "development" o usuário do banco de dados será :app_user
|
81
|
+
e no environment "migrations" o usuário do banco de dados será :data_base_admin
|
36
82
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
83
|
+
Passos para criar um environment :
|
84
|
+
1º duplique um arquivo de app/config/environments
|
85
|
+
2º configure o deu database.yml como no exemplo abaixo:
|
86
|
+
exemplo:
|
87
|
+
-----------
|
88
|
+
migrations:
|
89
|
+
<<: *default
|
90
|
+
database: main_app_development
|
91
|
+
username: username
|
92
|
+
password: password
|
93
|
+
-----------
|
94
|
+
3º para rodar as migrates usando este environment use um comando análogo a "rake db:migrate RAILS_ENV=migrations"
|
95
|
+
|
45
96
|
```
|
46
97
|
|
47
|
-
|
98
|
+
Logo após estes passos, na linha de comando execute:
|
99
|
+
|
48
100
|
```bash
|
49
101
|
rake rbac_rls:install:migrations
|
50
102
|
```
|
51
103
|
|
52
|
-
|
53
|
-
|
54
|
-
|
104
|
+
##### Adicione na sua aplicação em config/routes.rb
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
# Em config/routes.rb adicione
|
108
|
+
mount RbacRls::Engine => :rbac_rls
|
55
109
|
```
|
56
|
-
|
110
|
+
|
111
|
+
Execute na linha de comando:
|
112
|
+
|
57
113
|
```bash
|
58
|
-
|
114
|
+
rake db:migrate
|
115
|
+
|
116
|
+
yarn install
|
59
117
|
```
|
60
118
|
|
119
|
+
### após isso a bibilioteca está instalada, e pode ser acessada em /rbac_rls
|
61
120
|
|
62
|
-
## Contributing
|
63
|
-
Contribution directions go here.
|
121
|
+
[//]: # (## Contributing)
|
64
122
|
|
65
123
|
## License
|
124
|
+
|
66
125
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
@@ -43,8 +43,12 @@ module RbacRls
|
|
43
43
|
|
44
44
|
# DELETE /permissions/1
|
45
45
|
def destroy
|
46
|
+
notice_msg = "Permission was successfully destroyed."
|
46
47
|
@permission.destroy
|
47
|
-
|
48
|
+
if @permission.errors.size > 0
|
49
|
+
notice_msg = @permission.errors&.messages&.first&.last&.last
|
50
|
+
end
|
51
|
+
redirect_to permissions_url, notice: notice_msg
|
48
52
|
end
|
49
53
|
|
50
54
|
private
|
@@ -42,8 +42,14 @@ module RbacRls
|
|
42
42
|
|
43
43
|
# DELETE /roles/1
|
44
44
|
def destroy
|
45
|
+
notice_msg = "Role was successfully destroyed."
|
46
|
+
|
45
47
|
@role.destroy
|
46
|
-
|
48
|
+
if @role.errors.size > 0
|
49
|
+
notice_msg = @role.errors&.messages&.first&.last&.last
|
50
|
+
end
|
51
|
+
redirect_to roles_url, notice: notice_msg
|
52
|
+
|
47
53
|
end
|
48
54
|
|
49
55
|
private
|
@@ -11,7 +11,7 @@ module ManageRlsMigrationConcern
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def down_migrate(file_version = migration_version)
|
14
|
-
return true if system(Settings.down_migrate_command(file_version))
|
14
|
+
return true if system(RbacRls::Settings.down_migrate_command(file_version))
|
15
15
|
false
|
16
16
|
end
|
17
17
|
|
@@ -1,14 +1,11 @@
|
|
1
1
|
class RbacRls::Group < ApplicationRecord
|
2
2
|
|
3
3
|
self.table_name = :groups
|
4
|
-
has_many :group_permissions, :class_name => 'RbacRls::GroupPermission'
|
5
|
-
has_many :group_users, :class_name => 'RbacRls::GroupUser'
|
4
|
+
has_many :group_permissions, :class_name => 'RbacRls::GroupPermission', dependent: :delete_all
|
5
|
+
has_many :group_users, :class_name => 'RbacRls::GroupUser', dependent: :delete_all
|
6
6
|
accepts_nested_attributes_for :group_permissions, reject_if: :all_blank, allow_destroy: true
|
7
7
|
accepts_nested_attributes_for :group_users, reject_if: :all_blank, allow_destroy: true
|
8
8
|
|
9
|
-
|
10
9
|
private
|
11
10
|
|
12
|
-
|
13
|
-
|
14
11
|
end
|
@@ -2,7 +2,8 @@ class RbacRls::Permission < ApplicationRecord
|
|
2
2
|
include ManageRlsMigrationConcern
|
3
3
|
self.table_name = :permissions
|
4
4
|
belongs_to :permission, :class_name => 'RbacRls::Permission', optional: true
|
5
|
-
has_many :role_permissions, :class_name => 'RbacRls::RolePermission'
|
5
|
+
has_many :role_permissions, :class_name => 'RbacRls::RolePermission', dependent: :delete_all
|
6
|
+
has_many :group_permissions, :class_name => 'RbacRls::GroupPermission'
|
6
7
|
accepts_nested_attributes_for :role_permissions, reject_if: :all_blank, allow_destroy: true
|
7
8
|
|
8
9
|
#validations
|
@@ -11,12 +12,15 @@ class RbacRls::Permission < ApplicationRecord
|
|
11
12
|
validates_presence_of :table_name
|
12
13
|
before_validation :set_permission_name
|
13
14
|
after_validation :create_rls_policy
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
before_destroy :validate_destroy, prepend: true do
|
16
|
+
throw(:abort) if errors.present?
|
17
|
+
end
|
18
|
+
def self.all_tables(schema = :public, except = [])
|
19
|
+
removed = [:permissions, :roles, :user_roles, :schema_migrations, :ar_internal_metadata, :users,
|
20
|
+
:groups, :group_permissions, :group_users, :role_permissions] + except
|
17
21
|
sql = "SELECT table_name FROM information_schema.tables #{where_schema(schema)} "
|
18
22
|
result = ActiveRecord::Base.connection.select_all(sql)
|
19
|
-
tables = result.map { |k| k['table_name'] }
|
23
|
+
tables = result.map { |k| k['table_name'] }.select { |t| removed.exclude?(t.to_sym) }
|
20
24
|
tables
|
21
25
|
end
|
22
26
|
|
@@ -61,4 +65,21 @@ class RbacRls::Permission < ApplicationRecord
|
|
61
65
|
def has_role_permission?() end
|
62
66
|
|
63
67
|
|
68
|
+
def validate_destroy
|
69
|
+
if not can_destroy?
|
70
|
+
self.errors.add(:base, @error)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
def can_destroy?
|
77
|
+
out = true
|
78
|
+
if group_permissions.count > 0
|
79
|
+
@error = "Can't be destroyed because of Has associations With Groups"
|
80
|
+
out = false
|
81
|
+
end
|
82
|
+
out
|
83
|
+
end
|
84
|
+
|
64
85
|
end
|
data/app/models/rbac_rls/role.rb
CHANGED
@@ -3,8 +3,30 @@ class RbacRls::Role < ApplicationRecord
|
|
3
3
|
|
4
4
|
# has_many :permissions, :class_name => 'RbacRls::Permission'
|
5
5
|
|
6
|
-
has_many :user_roles, :class_name => 'RbacRls::UserRole'
|
6
|
+
has_many :user_roles, :class_name => 'RbacRls::UserRole', dependent: :delete_all
|
7
|
+
has_many :user_permissions, :class_name => 'RbacRls::RolePermission'
|
7
8
|
accepts_nested_attributes_for :user_roles, reject_if: :all_blank, allow_destroy: true
|
8
9
|
|
10
|
+
before_destroy :validate_destroy, prepend: true do
|
11
|
+
throw(:abort) if errors.present?
|
12
|
+
end
|
13
|
+
|
14
|
+
def validate_destroy
|
15
|
+
if not can_destroy?
|
16
|
+
self.errors.add(:base, @error)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def can_destroy?
|
23
|
+
out = true
|
24
|
+
if user_permissions.count > 0
|
25
|
+
@error = "Can't be destroyed because of Has associations With permissions"
|
26
|
+
out = false
|
27
|
+
end
|
28
|
+
out
|
29
|
+
end
|
30
|
+
|
9
31
|
end
|
10
32
|
|
@@ -13,18 +13,18 @@
|
|
13
13
|
|
14
14
|
<div>
|
15
15
|
<%= form.label :name, style: "display: block" %>
|
16
|
-
<%= form.text_field :name %>
|
16
|
+
<%= form.text_field :name, class: "form-control" %>
|
17
17
|
</div>
|
18
18
|
|
19
19
|
<div>
|
20
20
|
<%= form.label :comments, style: "display: block" %>
|
21
|
-
<%= form.text_field :comments %>
|
21
|
+
<%= form.text_field :comments, class: "form-control" %>
|
22
22
|
</div>
|
23
23
|
<div class="m-2">
|
24
24
|
<%= link_to_add_nested(form, :group_permissions, '#group_permissions',
|
25
25
|
partial: 'rbac_rls/groups/group_permission_fields',
|
26
26
|
link_text: 'Add new Permission to this Group Permission',
|
27
|
-
link_classes: 'btn-primary btn
|
27
|
+
link_classes: 'btn-primary btn') %>
|
28
28
|
</div>
|
29
29
|
<div id='group_permissions'>
|
30
30
|
<%= form.fields_for :group_permissions do |p| %>
|
@@ -35,8 +35,8 @@
|
|
35
35
|
<div class="m-2">
|
36
36
|
<%= link_to_add_nested(form, :group_users, '#group_users',
|
37
37
|
partial: 'rbac_rls/groups/group_user_fields',
|
38
|
-
link_text: '
|
39
|
-
link_classes: 'btn-primary btn
|
38
|
+
link_text: 'Associate User to this Group',
|
39
|
+
link_classes: 'btn-primary btn') %>
|
40
40
|
</div>
|
41
41
|
<div id='group_users'>
|
42
42
|
<%= form.fields_for :group_users do |p| %>
|
@@ -45,7 +45,7 @@
|
|
45
45
|
</div>
|
46
46
|
|
47
47
|
<div>
|
48
|
-
<%= form.submit %>
|
48
|
+
<%= form.submit "Save", class: "btn btn-success" %>
|
49
49
|
</div>
|
50
50
|
|
51
51
|
<% end %>
|
@@ -1,12 +1,8 @@
|
|
1
|
-
<
|
2
|
-
<
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
<%= group.comments %>
|
10
|
-
</p>
|
11
|
-
|
12
|
-
</div>
|
1
|
+
<ul class="list-group">
|
2
|
+
<li class="list-group-item">
|
3
|
+
<b>name:</b> <%= group.name %>
|
4
|
+
</li>
|
5
|
+
<li class="list-group-item">
|
6
|
+
<b>comments:</b> <%= group.comments %>
|
7
|
+
</li>
|
8
|
+
</ul>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<% utc = Time.now.utc.to_formatted_s(:number) %>
|
2
2
|
<div class="wrapper-div m-2">
|
3
3
|
<div class="">
|
4
|
-
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn
|
4
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn') %>
|
5
5
|
</div>
|
6
6
|
<div class="">
|
7
7
|
<%= form.label :permission_id %> <br>
|
@@ -13,6 +13,6 @@
|
|
13
13
|
</div>
|
14
14
|
<div class="">
|
15
15
|
<%= form.label :table_value %> <br>
|
16
|
-
<%= form.text_field :table_value %>
|
16
|
+
<%= form.text_field :table_value,class:"form-control" %>
|
17
17
|
</div>
|
18
18
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="wrapper-div m-2">
|
2
2
|
<div class="">
|
3
|
-
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn') %>
|
4
4
|
</div>
|
5
5
|
<div class="">
|
6
6
|
<%= form.label :user_id %> <br>
|
@@ -2,13 +2,19 @@
|
|
2
2
|
|
3
3
|
<h1>Groups</h1>
|
4
4
|
|
5
|
-
<div id="groups">
|
5
|
+
<div id="groups" class="mt-3">
|
6
6
|
<% @groups.each do |group| %>
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
<div class="mt-3">
|
8
|
+
<%= render group %>
|
9
|
+
</div>
|
10
|
+
<div class="mt-3 row">
|
11
|
+
<div class="col"><%= link_to "Edit this group", edit_group_path(group), class: "btn btn-warning" %></div>
|
12
|
+
<div class="col"> <%= link_to "Show this group", group, class: "btn btn-secondary" %></div>
|
13
|
+
<div class="col"><%= button_to "Destroy this group", group, method: :delete, class: "btn btn-danger" %></div>
|
14
|
+
</div>
|
11
15
|
<% end %>
|
12
16
|
</div>
|
13
17
|
|
14
|
-
|
18
|
+
<div class="mt-3">
|
19
|
+
<%= link_to "New group", new_group_path, class: "btn btn-primary" %>
|
20
|
+
</div>
|
@@ -2,9 +2,8 @@
|
|
2
2
|
|
3
3
|
<%= render @group %>
|
4
4
|
|
5
|
-
<div>
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
<%= button_to "Destroy this group", @group, method: :delete %>
|
5
|
+
<div class="row mt-3">
|
6
|
+
<div class="col"><%= link_to "Edit this group", edit_group_path(@group), class: "btn btn-warning" %></div>
|
7
|
+
<div class="col"><%= link_to "Back to groups", groups_path, class: "btn btn-secondary" %></div>
|
8
|
+
<div class="col"><%= button_to "Destroy this group", @group, method: :delete, class: "btn btn-danger" %></div>
|
10
9
|
</div>
|
@@ -56,23 +56,26 @@
|
|
56
56
|
</div>
|
57
57
|
</div>
|
58
58
|
|
59
|
-
<div class=""
|
60
|
-
|
61
|
-
|
62
|
-
</div
|
63
|
-
<
|
64
|
-
|
65
|
-
|
66
|
-
link_text: 'Add new User to this Role Permission',
|
67
|
-
link_classes: 'btn-primary btn-sm') %>
|
68
|
-
</div>
|
69
|
-
<div id='roles_permission'>
|
59
|
+
<!-- <div class="">-->
|
60
|
+
<!-- <%#= form.label :permission_id %> <br>-->
|
61
|
+
<%#= form.select(:permission_id, permission_options_for_select(form), { :prompt => "...", include_blank: true }, class: 'form-control') %>
|
62
|
+
<!-- </div>-->
|
63
|
+
<hr>
|
64
|
+
<div id='roles_permission' class="m-3">
|
65
|
+
<hr>
|
70
66
|
<%= form.fields_for :role_permissions do |p| %>
|
71
67
|
<% render 'rbac_rls/permissions/role_permission_fields', form: p %>
|
72
68
|
<% end %>
|
69
|
+
|
73
70
|
</div>
|
74
71
|
<div class="m-2">
|
75
|
-
<%= form
|
72
|
+
<%= link_to_add_nested(form, :role_permissions, '#roles_permission',
|
73
|
+
partial: 'rbac_rls/permissions/role_permission_fields',
|
74
|
+
link_text: 'Associate Role to this Permission',
|
75
|
+
link_classes: 'btn btn-primary btn-sm') %>
|
76
|
+
</div>
|
77
|
+
<div class="m-5">
|
78
|
+
<%= form.submit "Save", class: 'btn btn-primary' %>
|
76
79
|
</div>
|
77
80
|
<% end %>
|
78
81
|
</div>
|
@@ -1,54 +1,37 @@
|
|
1
|
-
<div
|
2
|
-
<
|
3
|
-
<
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
owner_read
|
39
|
-
</strong>
|
40
|
-
<%= permission.owner_read %>
|
41
|
-
</p>
|
42
|
-
<p>
|
43
|
-
<strong>
|
44
|
-
owner_change
|
45
|
-
</strong>
|
46
|
-
<%= permission.owner_change %>
|
47
|
-
</p>
|
48
|
-
<p>
|
49
|
-
<strong>
|
50
|
-
owner_remove
|
51
|
-
</strong>
|
52
|
-
<%= permission.owner_remove %>
|
53
|
-
</p>
|
54
|
-
</div>
|
1
|
+
<div class="row">
|
2
|
+
<div class="col">
|
3
|
+
<ul class="list-group">
|
4
|
+
<li class="list-group-item">
|
5
|
+
<b>name:</b> <%= permission.name %>
|
6
|
+
</li>
|
7
|
+
<li class="list-group-item">
|
8
|
+
<b>table name:</b> <%= permission.table_name %>
|
9
|
+
</li>
|
10
|
+
<li class="list-group-item">
|
11
|
+
<b>read:</b> <%= permission.read %>
|
12
|
+
</li>
|
13
|
+
<li class="list-group-item">
|
14
|
+
<b>write:</b> <%= permission.write %>
|
15
|
+
</li>
|
16
|
+
<li class="list-group-item">
|
17
|
+
<b>change:</b> <%= permission.change %>
|
18
|
+
</li>
|
19
|
+
<li class="list-group-item">
|
20
|
+
<b>remove:</b> <%= permission.remove %>
|
21
|
+
</li>
|
22
|
+
</ul>
|
23
|
+
</div>
|
24
|
+
<div class="col">
|
25
|
+
<ul class="list-group">
|
26
|
+
<li class="list-group-item">
|
27
|
+
<b>owner read:</b> <%= permission.owner_read %>
|
28
|
+
</li>
|
29
|
+
<li class="list-group-item">
|
30
|
+
<b>owner change:</b> <%= permission.owner_change %>
|
31
|
+
</li>
|
32
|
+
<li class="list-group-item">
|
33
|
+
<b>owner remove:</b> <%= permission.owner_remove %>
|
34
|
+
</li>
|
35
|
+
</ul>
|
36
|
+
</div>
|
37
|
+
</div>
|
@@ -1,9 +1,9 @@
|
|
1
1
|
<div class="wrapper-div m-2">
|
2
2
|
<div class="">
|
3
|
-
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn btn-danger btn-sm') %>
|
4
4
|
</div>
|
5
5
|
<div class="">
|
6
6
|
<%= form.label :role_id %> <br>
|
7
|
-
<%= form.select(:role_id, role_options_for_select(form), { :prompt => "..."
|
7
|
+
<%= form.select(:role_id, role_options_for_select(form), { :prompt => "..."}, class: 'form-control') %>
|
8
8
|
</div>
|
9
9
|
</div>
|
@@ -3,16 +3,23 @@
|
|
3
3
|
<h1 class="display-3">Permissions</h1>
|
4
4
|
|
5
5
|
<div class="">
|
6
|
-
<%= link_to new_permission_path, class: 'btn-primary btn-sm' do %>
|
6
|
+
<%= link_to new_permission_path, class: 'btn btn-primary btn-sm' do %>
|
7
7
|
New permission
|
8
8
|
<% end %>
|
9
9
|
</div>
|
10
10
|
|
11
11
|
<div id="permissions">
|
12
12
|
<% @permissions.each do |permission| %>
|
13
|
-
|
14
|
-
<
|
15
|
-
<%=
|
16
|
-
</
|
13
|
+
|
14
|
+
<div class="m-3">
|
15
|
+
<%= render permission %>
|
16
|
+
</div>
|
17
|
+
<div class="m-3">
|
18
|
+
<div class="row">
|
19
|
+
<div class="col"><%= link_to "Edit this permission", edit_permission_path(permission), class: "btn btn-warning" %></div>
|
20
|
+
<div class="col"><%= button_to "Destroy this permission", permission, method: :delete, class: "btn btn-danger" %></div>
|
21
|
+
<div class="col"><%= link_to "Show this permission", permission, class: 'btn btn-secondary' %></div>
|
22
|
+
</div>
|
23
|
+
</div>
|
17
24
|
<% end %>
|
18
25
|
</div>
|
@@ -1,10 +1,11 @@
|
|
1
1
|
<p style="color: green"><%= notice %></p>
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
<%= link_to "Edit this permission", edit_permission_path(@permission) %> |
|
7
|
-
<%= link_to "Back to permissions", permissions_path %>
|
3
|
+
<div class="m-3">
|
4
|
+
<%= render @permission %>
|
5
|
+
</div>
|
8
6
|
|
9
|
-
|
7
|
+
<div class="row">
|
8
|
+
<div class="col"><%= link_to "Edit this permission", edit_permission_path(@permission), class: "btn btn-warning" %></div>
|
9
|
+
<div class="col"><%= link_to "Back to permissions", permissions_path, class: "btn btn-secondary" %></div>
|
10
|
+
<div class="col"><%= button_to "Destroy this permission", @permission, method: :delete, class: "btn btn-danger" %></div>
|
10
11
|
</div>
|
@@ -22,21 +22,22 @@
|
|
22
22
|
<%= form.text_area :comments, class: 'form-control' %>
|
23
23
|
</div>
|
24
24
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
25
|
+
<div class="container">
|
26
|
+
<div id='user_roles'>
|
27
|
+
<%= form.fields_for :user_roles do |p| %>
|
28
|
+
<% render 'rbac_rls/roles/user_role_fields', form: p %>
|
29
|
+
<% end %>
|
30
|
+
</div>
|
31
|
+
<div class="m-2">
|
32
|
+
<%= link_to_add_nested(form, :user_roles, '#user_roles',
|
33
|
+
partial: 'rbac_rls/roles/user_role_fields',
|
34
|
+
link_text: 'Add new User to role',
|
35
|
+
link_classes: 'btn btn-primary btn-sm') %>
|
36
|
+
</div>
|
36
37
|
</div>
|
37
38
|
|
38
39
|
<div class="m-2">
|
39
|
-
<%= form.submit "Create Role", class: 'btn-primary btn-sm' %>
|
40
|
+
<%= form.submit "Create Role", class: 'btn btn-primary btn-sm' %>
|
40
41
|
</div>
|
41
42
|
<% end %>
|
42
43
|
</div>
|
@@ -1,6 +1,6 @@
|
|
1
1
|
<div class="wrapper-div m-2">
|
2
2
|
<div class="">
|
3
|
-
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn-danger btn-sm') %>
|
3
|
+
<%= link_to_remove_nested(form, fields_wrapper_selector: '.wrapper-div', link_classes: 'btn btn-danger btn-sm') %>
|
4
4
|
</div>
|
5
5
|
<div class="">
|
6
6
|
<%= form.label :user_id %> <br>
|
@@ -1,10 +1,8 @@
|
|
1
1
|
<div class="container">
|
2
2
|
<p style="color: green"><%= notice %></p>
|
3
|
-
|
4
3
|
<h1 class="display-3">Roles</h1>
|
5
|
-
|
6
4
|
<div class="">
|
7
|
-
<%= link_to new_role_path, class: 'btn-primary btn-sm' do %>
|
5
|
+
<%= link_to new_role_path, class: 'btn btn-primary btn-sm' do %>
|
8
6
|
New Role
|
9
7
|
<% end %>
|
10
8
|
</div>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
<div class="container">
|
2
2
|
<h1 class="display-3">New role</h1>
|
3
3
|
<div>
|
4
|
-
<%= link_to "Back to roles", roles_path, class: 'btn-
|
4
|
+
<%= link_to "Back to roles", roles_path, class: 'btn btn-sm btn-danger' %>
|
5
5
|
</div>
|
6
6
|
|
7
7
|
<%= render "form", role: @role %>
|
@@ -1,12 +1,18 @@
|
|
1
1
|
<div class="container">
|
2
2
|
<p style="color: green"><%= notice %></p>
|
3
|
-
<%= link_to "Edit this role", edit_role_path(@role), class: 'btn-primary btn-sm' %>
|
4
|
-
<%= link_to "Back to roles", roles_path, class: 'btn-danger btn-sm' %>
|
3
|
+
<%= link_to "Edit this role", edit_role_path(@role), class: 'btn btn-primary btn-sm' %>
|
4
|
+
<%= link_to "Back to roles", roles_path, class: 'btn btn-danger btn-sm' %>
|
5
5
|
|
6
6
|
|
7
7
|
<div class="w-75 m-2">
|
8
8
|
<%= render @role %>
|
9
|
+
<div class="m-3">
|
10
|
+
<div><h5>Associated Users</h5></div>
|
11
|
+
<% @role.user_roles.each do |user| %>
|
12
|
+
<%= render 'rbac_rls/shared/user', obj: user %>
|
13
|
+
<% end %>
|
14
|
+
</div>
|
9
15
|
</div>
|
10
16
|
|
11
|
-
<%= button_to "Destroy this role", @role, method: :delete, class: 'btn-danger btn-sm', data: { confirm: "Are you sure?" } %>
|
17
|
+
<%= button_to "Destroy this role", @role, method: :delete, class: 'btn btn-danger btn-sm', data: { confirm: "Are you sure?" } %>
|
12
18
|
</div>
|
@@ -37,7 +37,7 @@ def change
|
|
37
37
|
INNER JOIN group_users gu on gu.group_id = gp.group_id
|
38
38
|
WHERE (p.\"#{type_polices[type.to_sym]}\")
|
39
39
|
AND p.table_name = '#{gen_table_name}'
|
40
|
-
) and
|
40
|
+
) and #{RbacRls::Settings.owner_column_name} = NULLIF(current_setting('rls.user_id', TRUE), '')::bigint )
|
41
41
|
"
|
42
42
|
end
|
43
43
|
}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
# rails generate rbac_rls:custom_migration table_name
|
3
3
|
time_now = Time.now.getutc.to_i
|
4
4
|
attrs = attributes.map { |i| i.name.camelize }
|
5
|
-
|
5
|
+
gen_table_name = name.underscore
|
6
6
|
limit_policy_name = 63
|
7
7
|
type_polices = {insert: :write,
|
8
8
|
select: :read,
|
@@ -33,8 +33,8 @@ def change
|
|
33
33
|
INNER JOIN role_permissions rp on rp.permission_id = p.id
|
34
34
|
INNER JOIN user_roles ur on rp.role_id = ur.role_id
|
35
35
|
WHERE (p.\"#{type_polices_owner[type.to_sym]}\")
|
36
|
-
AND p.table_name = '
|
37
|
-
) and
|
36
|
+
AND p.table_name = '#{gen_table_name}'
|
37
|
+
) and #{RbacRls::Settings.owner_column_name} = NULLIF(current_setting('rls.user_id', TRUE), '')::bigint )
|
38
38
|
"
|
39
39
|
end
|
40
40
|
}
|
@@ -47,7 +47,7 @@ def change
|
|
47
47
|
INNER JOIN role_permissions rp on rp.permission_id = p.id
|
48
48
|
INNER JOIN user_roles ur on rp.role_id = ur.role_id
|
49
49
|
WHERE (p.\"#{type_polices[type.to_sym]}\")
|
50
|
-
AND p.table_name = '
|
50
|
+
AND p.table_name = '#{gen_table_name}'
|
51
51
|
)
|
52
52
|
#{owner_rls_policy[type]}
|
53
53
|
"
|
data/lib/rbac_rls/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
module RbacRls
|
2
|
-
VERSION = "0.1.
|
3
|
-
end
|
2
|
+
VERSION = "0.1.5"
|
3
|
+
end
|
data/lib/rbac_rls.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbac_rls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- FilipeBeserraMaia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-10-
|
11
|
+
date: 2022-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -128,6 +128,7 @@ files:
|
|
128
128
|
- app/views/rbac_rls/roles/index.html.erb
|
129
129
|
- app/views/rbac_rls/roles/new.html.erb
|
130
130
|
- app/views/rbac_rls/roles/show.html.erb
|
131
|
+
- app/views/rbac_rls/shared/_user.html.erb
|
131
132
|
- config/assets.rb
|
132
133
|
- config/importmap.rb
|
133
134
|
- config/routes.rb
|