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.
Files changed (32) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +90 -31
  3. data/app/controllers/rbac_rls/permissions_controller.rb +5 -1
  4. data/app/controllers/rbac_rls/roles_controller.rb +7 -1
  5. data/app/models/concerns/manage_rls_migration_concern.rb +1 -1
  6. data/app/models/rbac_rls/group.rb +2 -5
  7. data/app/models/rbac_rls/permission.rb +26 -5
  8. data/app/models/rbac_rls/role.rb +23 -1
  9. data/app/views/rbac_rls/groups/_form.html.erb +6 -6
  10. data/app/views/rbac_rls/groups/_group.html.erb +8 -12
  11. data/app/views/rbac_rls/groups/_group_permission_fields.html.erb +2 -2
  12. data/app/views/rbac_rls/groups/_group_user_fields.html.erb +1 -1
  13. data/app/views/rbac_rls/groups/edit.html.erb +2 -2
  14. data/app/views/rbac_rls/groups/index.html.erb +12 -6
  15. data/app/views/rbac_rls/groups/new.html.erb +1 -1
  16. data/app/views/rbac_rls/groups/show.html.erb +4 -5
  17. data/app/views/rbac_rls/permissions/_form.html.erb +15 -12
  18. data/app/views/rbac_rls/permissions/_permission.html.erb +37 -54
  19. data/app/views/rbac_rls/permissions/_role_permission_fields.html.erb +2 -2
  20. data/app/views/rbac_rls/permissions/index.html.erb +12 -5
  21. data/app/views/rbac_rls/permissions/show.html.erb +7 -6
  22. data/app/views/rbac_rls/roles/_form.html.erb +13 -12
  23. data/app/views/rbac_rls/roles/_user_role_fields.html.erb +1 -1
  24. data/app/views/rbac_rls/roles/index.html.erb +1 -3
  25. data/app/views/rbac_rls/roles/new.html.erb +1 -1
  26. data/app/views/rbac_rls/roles/show.html.erb +9 -3
  27. data/app/views/rbac_rls/shared/_user.html.erb +6 -0
  28. data/lib/generators/rbac_rls/templates/group_permission_migration.rb +1 -1
  29. data/lib/generators/rbac_rls/templates/rls_migration.rb +4 -4
  30. data/lib/rbac_rls/version.rb +2 -2
  31. data/lib/rbac_rls.rb +4 -0
  32. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fb13cff5b26d29280bca5e6d39cb03d0b678b6d8a94864bba35ec1999bf432cb
4
- data.tar.gz: c4dcdbec3c7a18d50a818ba041bf0ebe48e06133548353328ef6fadc91b57daf
3
+ metadata.gz: a78283c1080582d297d67402835e23261cb3676c1083b7a11283fe983f5b6e4c
4
+ data.tar.gz: b4193df304d181c3e51c8e0a2de4229dbc11279833314bc77fa571102275a27c
5
5
  SHA512:
6
- metadata.gz: cc5662a8ca0d5f748d341d6861c7899beb512b6e306220684160b81a3e051dda3e71a4d980654406a2cc09a6d28723ad5c001c1c40bee028e5e93b334787f1cb
7
- data.tar.gz: 6f1dd91ca3746596e1451566a703a132f15fff163af006d6b5082ed1c37382e93b661f4b72c1e5f1a51912e7e40b0d88587d448f327f99ce7e0af34192044c05
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
- ## Usage
5
- How to use my plugin.
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
- ## Installation
8
- Add this line to your application's Gemfile:
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
- And then execute:
38
+ E então execute o seguinte comando:
39
+
15
40
  ```bash
16
41
  $ bundle
17
42
  ```
18
43
 
19
- Or install it yourself as:
44
+ Ou Instale você mesmo manualmente com o comando abaixo :
45
+
20
46
  ```bash
21
47
  $ gem install rbac_rls
22
48
  ```
23
- And then add in your manifest.js:
24
- ```bash
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
- And then add in your application_record.rb and application_controller.rb:
29
- ```bash
30
- include ConnectionRls
31
- include ConnectionRlsUser
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
- crie um novo everioniment para rodar as migrations
35
- por exemplo: duplique um arquivo de app/config/environments configure o deu database.yml com o env
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
- exemplo:
38
- -----------
39
- migrations:
40
- <<: *default
41
- database: main_app_development
42
- username: username
43
- password: password
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
- And then run this command:
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
- And then run this command:
53
- ```bash
54
- rake db:migrate
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
- And then run this command:
110
+
111
+ Execute na linha de comando:
112
+
57
113
  ```bash
58
- yarn install
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
- redirect_to permissions_url, notice: "Permission was successfully destroyed."
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
- redirect_to roles_url, notice: "Role was successfully destroyed."
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
- def self.all_tables(schema = :public)
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
@@ -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-sm') %>
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: 'Add new User to this Group User',
39
- link_classes: 'btn-primary btn-sm') %>
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
- <div id="<%= dom_id group %>">
2
- <p>
3
- <strong>Name:</strong>
4
- <%= group.name %>
5
- </p>
6
-
7
- <p>
8
- <strong>Comments:</strong>
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-sm') %>
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-sm') %>
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>
@@ -5,6 +5,6 @@
5
5
  <br>
6
6
 
7
7
  <div>
8
- <%= link_to "Show this group", @group %> |
9
- <%= link_to "Back to groups", groups_path %>
8
+ <%= link_to "Show this group", @group, class: "btn btn-secondary" %> |
9
+ <%= link_to "Back to groups", groups_path, class: "btn btn-secondary" %>
10
10
  </div>
@@ -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
- <%= render group %>
8
- <p>
9
- <%= link_to "Show this group", group %>
10
- </p>
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
- <%= link_to "New group", new_group_path %>
18
+ <div class="mt-3">
19
+ <%= link_to "New group", new_group_path, class: "btn btn-primary" %>
20
+ </div>
@@ -5,5 +5,5 @@
5
5
  <br>
6
6
 
7
7
  <div>
8
- <%= link_to "Back to groups", groups_path %>
8
+ <%= link_to "Back to groups", groups_path, class: "btn btn-secondary" %>
9
9
  </div>
@@ -2,9 +2,8 @@
2
2
 
3
3
  <%= render @group %>
4
4
 
5
- <div>
6
- <%= link_to "Edit this group", edit_group_path(@group) %> |
7
- <%= link_to "Back to groups", groups_path %>
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
- <%= 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
- <div class="m-2">
64
- <%= link_to_add_nested(form, :role_permissions, '#roles_permission',
65
- partial: 'rbac_rls/permissions/role_permission_fields',
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.submit %>
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 id="<%= dom_id permission %>">
2
- <p>
3
- <strong>Name:</strong>
4
- <%= permission.name %>
5
- </p>
6
-
7
- <p>
8
- <strong>Table name:</strong>
9
- <%= permission.table_name %>
10
- </p>
11
-
12
- <p>
13
- <strong>Read:</strong>
14
- <%= permission.read %>
15
- </p>
16
-
17
- <p>
18
- <strong>Write:</strong>
19
- <%= permission.write %>
20
- </p>
21
-
22
- <p>
23
- <strong>Update:</strong>
24
- <%= permission.change %>
25
- </p>
26
-
27
- <p>
28
- <strong>Delete:</strong>
29
- <%= permission.remove %>
30
- </p>
31
-
32
- <p>
33
- <strong>Permission:</strong>
34
- <%= permission.permission_id %>
35
- </p>
36
- <p>
37
- <strong>
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 => "...", include_blank: true }, class: 'form-control') %>
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
- <%= render permission %>
14
- <p>
15
- <%= link_to "Show this permission", permission,class: 'btn btn-secondary'%>
16
- </p>
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
- <%= render @permission %>
4
-
5
- <div>
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
- <%= button_to "Destroy this permission", @permission, method: :delete %>
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
- <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-primary btn-sm') %>
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-danger btn-sm' %>
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>
@@ -0,0 +1,6 @@
1
+ <div class="container">
2
+ <div class="w-75 m-2">
3
+ <div><b>User:</b> <%= obj.user.email %></div>
4
+ </div>
5
+
6
+ </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 owner_id = NULLIF(current_setting('rls.user_id', TRUE), '')::bigint )
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 = 'products'
37
- ) and owner_id = NULLIF(current_setting('rls.user_id', TRUE), '')::bigint )
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 = 'products'
50
+ AND p.table_name = '#{gen_table_name}'
51
51
  )
52
52
  #{owner_rls_policy[type]}
53
53
  "
@@ -1,3 +1,3 @@
1
1
  module RbacRls
2
- VERSION = "0.1.3"
3
- end
2
+ VERSION = "0.1.5"
3
+ end
data/lib/rbac_rls.rb CHANGED
@@ -11,6 +11,10 @@ module RbacRls
11
11
  "rake db:migrate:down VERSION=#{version} RAILS_ENV=migrations"
12
12
  end
13
13
 
14
+ def self.owner_column_name
15
+ "owner_id"
16
+ end
17
+
14
18
  def self.application_db_user
15
19
  "app_user"
16
20
  end
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.3
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-13 00:00:00.000000000 Z
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