rls_multi_tenant 0.2.1 → 0.2.3
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 +62 -62
- data/lib/rls_multi_tenant/concerns/multi_tenant.rb +7 -6
- data/lib/rls_multi_tenant/concerns/tenant_context.rb +14 -17
- data/lib/rls_multi_tenant/generators/install/install_generator.rb +13 -30
- data/lib/rls_multi_tenant/generators/install/templates/rls_multi_tenant.rb +5 -8
- data/lib/rls_multi_tenant/generators/migration/migration_generator.rb +21 -64
- data/lib/rls_multi_tenant/generators/migration/templates/enable_rls.rb +4 -4
- data/lib/rls_multi_tenant/generators/model/model_generator.rb +13 -18
- data/lib/rls_multi_tenant/generators/model/templates/migration.rb +4 -5
- data/lib/rls_multi_tenant/generators/setup/setup_generator.rb +28 -92
- data/lib/rls_multi_tenant/generators/shared/template_helper.rb +1 -1
- data/lib/rls_multi_tenant/middleware/subdomain_tenant_selector.rb +19 -14
- data/lib/rls_multi_tenant/railtie.rb +13 -18
- data/lib/rls_multi_tenant/rls_helper.rb +14 -28
- data/lib/rls_multi_tenant/rls_multi_tenant.rb +19 -13
- data/lib/rls_multi_tenant/security_validator.rb +8 -38
- data/lib/rls_multi_tenant/version.rb +1 -1
- data/lib/rls_multi_tenant.rb +12 -16
- data/rls_multi_tenant.gemspec +26 -26
- metadata +32 -48
- data/lib/rls_multi_tenant/generators/shared/templates/create_app_user.rb +0 -49
- data/lib/rls_multi_tenant/generators/shared/templates/db_admin.rake +0 -27
- data/lib/rls_multi_tenant/generators/task/task_generator.rb +0 -34
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: rls_multi_tenant
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.2.
|
|
4
|
+
version: 0.2.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Coding Ways
|
|
@@ -9,26 +9,6 @@ bindir: exe
|
|
|
9
9
|
cert_chain: []
|
|
10
10
|
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
11
|
dependencies:
|
|
12
|
-
- !ruby/object:Gem::Dependency
|
|
13
|
-
name: rails
|
|
14
|
-
requirement: !ruby/object:Gem::Requirement
|
|
15
|
-
requirements:
|
|
16
|
-
- - ">="
|
|
17
|
-
- !ruby/object:Gem::Version
|
|
18
|
-
version: '6.0'
|
|
19
|
-
- - "<"
|
|
20
|
-
- !ruby/object:Gem::Version
|
|
21
|
-
version: '9.0'
|
|
22
|
-
type: :runtime
|
|
23
|
-
prerelease: false
|
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
25
|
-
requirements:
|
|
26
|
-
- - ">="
|
|
27
|
-
- !ruby/object:Gem::Version
|
|
28
|
-
version: '6.0'
|
|
29
|
-
- - "<"
|
|
30
|
-
- !ruby/object:Gem::Version
|
|
31
|
-
version: '9.0'
|
|
32
12
|
- !ruby/object:Gem::Dependency
|
|
33
13
|
name: pg
|
|
34
14
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -50,117 +30,123 @@ dependencies:
|
|
|
50
30
|
- !ruby/object:Gem::Version
|
|
51
31
|
version: '3.0'
|
|
52
32
|
- !ruby/object:Gem::Dependency
|
|
53
|
-
name:
|
|
33
|
+
name: rails
|
|
54
34
|
requirement: !ruby/object:Gem::Requirement
|
|
55
35
|
requirements:
|
|
56
36
|
- - ">="
|
|
57
37
|
- !ruby/object:Gem::Version
|
|
58
|
-
version:
|
|
38
|
+
version: '6.0'
|
|
39
|
+
- - "<"
|
|
40
|
+
- !ruby/object:Gem::Version
|
|
41
|
+
version: '9.0'
|
|
59
42
|
type: :runtime
|
|
60
43
|
prerelease: false
|
|
61
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
62
45
|
requirements:
|
|
63
46
|
- - ">="
|
|
64
47
|
- !ruby/object:Gem::Version
|
|
65
|
-
version:
|
|
48
|
+
version: '6.0'
|
|
49
|
+
- - "<"
|
|
50
|
+
- !ruby/object:Gem::Version
|
|
51
|
+
version: '9.0'
|
|
66
52
|
- !ruby/object:Gem::Dependency
|
|
67
|
-
name:
|
|
53
|
+
name: bundler-audit
|
|
68
54
|
requirement: !ruby/object:Gem::Requirement
|
|
69
55
|
requirements:
|
|
70
56
|
- - "~>"
|
|
71
57
|
- !ruby/object:Gem::Version
|
|
72
|
-
version: '
|
|
58
|
+
version: '0.9'
|
|
73
59
|
type: :development
|
|
74
60
|
prerelease: false
|
|
75
61
|
version_requirements: !ruby/object:Gem::Requirement
|
|
76
62
|
requirements:
|
|
77
63
|
- - "~>"
|
|
78
64
|
- !ruby/object:Gem::Version
|
|
79
|
-
version: '
|
|
65
|
+
version: '0.9'
|
|
80
66
|
- !ruby/object:Gem::Dependency
|
|
81
|
-
name:
|
|
67
|
+
name: generator_spec
|
|
82
68
|
requirement: !ruby/object:Gem::Requirement
|
|
83
69
|
requirements:
|
|
84
70
|
- - "~>"
|
|
85
71
|
- !ruby/object:Gem::Version
|
|
86
|
-
version: '
|
|
72
|
+
version: '0.9'
|
|
87
73
|
type: :development
|
|
88
74
|
prerelease: false
|
|
89
75
|
version_requirements: !ruby/object:Gem::Requirement
|
|
90
76
|
requirements:
|
|
91
77
|
- - "~>"
|
|
92
78
|
- !ruby/object:Gem::Version
|
|
93
|
-
version: '
|
|
79
|
+
version: '0.9'
|
|
94
80
|
- !ruby/object:Gem::Dependency
|
|
95
|
-
name:
|
|
81
|
+
name: rspec-rails
|
|
96
82
|
requirement: !ruby/object:Gem::Requirement
|
|
97
83
|
requirements:
|
|
98
84
|
- - "~>"
|
|
99
85
|
- !ruby/object:Gem::Version
|
|
100
|
-
version:
|
|
86
|
+
version: 6.1.0
|
|
101
87
|
type: :development
|
|
102
88
|
prerelease: false
|
|
103
89
|
version_requirements: !ruby/object:Gem::Requirement
|
|
104
90
|
requirements:
|
|
105
91
|
- - "~>"
|
|
106
92
|
- !ruby/object:Gem::Version
|
|
107
|
-
version:
|
|
93
|
+
version: 6.1.0
|
|
108
94
|
- !ruby/object:Gem::Dependency
|
|
109
|
-
name: rubocop
|
|
95
|
+
name: rubocop
|
|
110
96
|
requirement: !ruby/object:Gem::Requirement
|
|
111
97
|
requirements:
|
|
112
98
|
- - "~>"
|
|
113
99
|
- !ruby/object:Gem::Version
|
|
114
|
-
version:
|
|
100
|
+
version: 1.80.0
|
|
115
101
|
type: :development
|
|
116
102
|
prerelease: false
|
|
117
103
|
version_requirements: !ruby/object:Gem::Requirement
|
|
118
104
|
requirements:
|
|
119
105
|
- - "~>"
|
|
120
106
|
- !ruby/object:Gem::Version
|
|
121
|
-
version:
|
|
107
|
+
version: 1.80.0
|
|
122
108
|
- !ruby/object:Gem::Dependency
|
|
123
|
-
name:
|
|
109
|
+
name: rubocop-rails
|
|
124
110
|
requirement: !ruby/object:Gem::Requirement
|
|
125
111
|
requirements:
|
|
126
112
|
- - "~>"
|
|
127
113
|
- !ruby/object:Gem::Version
|
|
128
|
-
version: '
|
|
114
|
+
version: '2.33'
|
|
129
115
|
type: :development
|
|
130
116
|
prerelease: false
|
|
131
117
|
version_requirements: !ruby/object:Gem::Requirement
|
|
132
118
|
requirements:
|
|
133
119
|
- - "~>"
|
|
134
120
|
- !ruby/object:Gem::Version
|
|
135
|
-
version: '
|
|
121
|
+
version: '2.33'
|
|
136
122
|
- !ruby/object:Gem::Dependency
|
|
137
|
-
name:
|
|
123
|
+
name: rubocop-rspec
|
|
138
124
|
requirement: !ruby/object:Gem::Requirement
|
|
139
125
|
requirements:
|
|
140
126
|
- - "~>"
|
|
141
127
|
- !ruby/object:Gem::Version
|
|
142
|
-
version: '
|
|
128
|
+
version: '3.7'
|
|
143
129
|
type: :development
|
|
144
130
|
prerelease: false
|
|
145
131
|
version_requirements: !ruby/object:Gem::Requirement
|
|
146
132
|
requirements:
|
|
147
133
|
- - "~>"
|
|
148
134
|
- !ruby/object:Gem::Version
|
|
149
|
-
version: '
|
|
135
|
+
version: '3.7'
|
|
150
136
|
- !ruby/object:Gem::Dependency
|
|
151
|
-
name:
|
|
137
|
+
name: simplecov
|
|
152
138
|
requirement: !ruby/object:Gem::Requirement
|
|
153
139
|
requirements:
|
|
154
140
|
- - "~>"
|
|
155
141
|
- !ruby/object:Gem::Version
|
|
156
|
-
version: '0.
|
|
142
|
+
version: '0.22'
|
|
157
143
|
type: :development
|
|
158
144
|
prerelease: false
|
|
159
145
|
version_requirements: !ruby/object:Gem::Requirement
|
|
160
146
|
requirements:
|
|
161
147
|
- - "~>"
|
|
162
148
|
- !ruby/object:Gem::Version
|
|
163
|
-
version: '0.
|
|
149
|
+
version: '0.22'
|
|
164
150
|
description: A comprehensive gem that provides RLS-based multi-tenancy for Rails applications
|
|
165
151
|
using PostgreSQL, including automatic tenant context switching, security validations,
|
|
166
152
|
and migration helpers.
|
|
@@ -186,11 +172,8 @@ files:
|
|
|
186
172
|
- lib/rls_multi_tenant/generators/setup/setup_generator.rb
|
|
187
173
|
- lib/rls_multi_tenant/generators/setup/templates/tenant_model.rb
|
|
188
174
|
- lib/rls_multi_tenant/generators/shared/template_helper.rb
|
|
189
|
-
- lib/rls_multi_tenant/generators/shared/templates/create_app_user.rb
|
|
190
175
|
- lib/rls_multi_tenant/generators/shared/templates/create_tenant.rb
|
|
191
|
-
- lib/rls_multi_tenant/generators/shared/templates/db_admin.rake
|
|
192
176
|
- lib/rls_multi_tenant/generators/shared/templates/enable_uuid_extension.rb
|
|
193
|
-
- lib/rls_multi_tenant/generators/task/task_generator.rb
|
|
194
177
|
- lib/rls_multi_tenant/middleware/subdomain_tenant_selector.rb
|
|
195
178
|
- lib/rls_multi_tenant/railtie.rb
|
|
196
179
|
- lib/rls_multi_tenant/rls_helper.rb
|
|
@@ -207,6 +190,7 @@ metadata:
|
|
|
207
190
|
changelog_uri: https://github.com/codingways/rls_multi_tenant/blob/main/CHANGELOG.md
|
|
208
191
|
bug_tracker_uri: https://github.com/codingways/rls_multi_tenant/issues
|
|
209
192
|
documentation_uri: https://github.com/codingways/rls_multi_tenant#readme
|
|
193
|
+
rubygems_mfa_required: 'true'
|
|
210
194
|
rdoc_options: []
|
|
211
195
|
require_paths:
|
|
212
196
|
- lib
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
class CreateAppUser < ActiveRecord::Migration[<%= Rails.version.to_f %>]
|
|
2
|
-
def up
|
|
3
|
-
app_user = ENV['<%= RlsMultiTenant.app_user_env_var %>']
|
|
4
|
-
app_password = ENV['POSTGRES_APP_PASSWORD']
|
|
5
|
-
|
|
6
|
-
# Create user with RLS privileges in PostgreSQL
|
|
7
|
-
execute <<-SQL
|
|
8
|
-
DO $$
|
|
9
|
-
BEGIN
|
|
10
|
-
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '#{app_user}') THEN
|
|
11
|
-
CREATE ROLE #{app_user} WITH LOGIN PASSWORD '#{app_password}';
|
|
12
|
-
END IF;
|
|
13
|
-
END
|
|
14
|
-
$$;
|
|
15
|
-
SQL
|
|
16
|
-
|
|
17
|
-
# Grant basic permissions to the user
|
|
18
|
-
execute "GRANT CONNECT ON DATABASE #{ActiveRecord::Base.connection.current_database} TO #{app_user};"
|
|
19
|
-
execute "GRANT USAGE ON SCHEMA public TO #{app_user};"
|
|
20
|
-
execute "GRANT CREATE ON SCHEMA public TO #{app_user};"
|
|
21
|
-
|
|
22
|
-
# Grant default permissions for future tables in public schema
|
|
23
|
-
execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO #{app_user};"
|
|
24
|
-
execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO #{app_user};"
|
|
25
|
-
|
|
26
|
-
# Grant permissions on all existing tables
|
|
27
|
-
execute "GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO #{app_user};"
|
|
28
|
-
execute "GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO #{app_user};"
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def down
|
|
32
|
-
app_user = ENV['<%= RlsMultiTenant.app_user_env_var %>']
|
|
33
|
-
|
|
34
|
-
# Revoke permissions
|
|
35
|
-
execute "REVOKE ALL ON SCHEMA public FROM #{app_user};"
|
|
36
|
-
execute "REVOKE CONNECT ON DATABASE #{ActiveRecord::Base.connection.current_database} FROM #{app_user};"
|
|
37
|
-
|
|
38
|
-
# Revoke permissions from all existing tables and sequences
|
|
39
|
-
execute "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM #{app_user};"
|
|
40
|
-
execute "REVOKE ALL ON ALL SEQUENCES IN SCHEMA public FROM #{app_user};"
|
|
41
|
-
|
|
42
|
-
# Revoke default permissions for future tables in public schema
|
|
43
|
-
execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE SELECT, INSERT, UPDATE, DELETE ON TABLES FROM #{app_user};"
|
|
44
|
-
execute "ALTER DEFAULT PRIVILEGES IN SCHEMA public REVOKE USAGE, SELECT ON SEQUENCES FROM #{app_user};"
|
|
45
|
-
|
|
46
|
-
# Drop user
|
|
47
|
-
execute "DROP ROLE IF EXISTS #{app_user};"
|
|
48
|
-
end
|
|
49
|
-
end
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
namespace :db_as do
|
|
2
|
-
desc "Run a db: task with admin privileges. Usage: `rails db_as:admin[migrate]`"
|
|
3
|
-
task :admin, [:sub_task] do |t, args|
|
|
4
|
-
sub_task = args[:sub_task]
|
|
5
|
-
|
|
6
|
-
# Check if a sub-task was provided
|
|
7
|
-
if sub_task.nil? || !Rake::Task.task_defined?("db:#{sub_task}")
|
|
8
|
-
puts "Usage: rails db_as:admin[sub_task]"
|
|
9
|
-
puts "Valid sub-tasks: #{Rake.application.tasks.map(&:name).select { |name| name.start_with?("db:") }.map { |name| name.split(':', 2).last }.uniq.sort.join(', ')}"
|
|
10
|
-
exit
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
database_url = "postgresql://#{ENV['POSTGRES_USER']}:#{ENV['POSTGRES_PASSWORD']}@#{ENV['POSTGRES_HOST']}:5432/#{ENV['POSTGRES_DB']}"
|
|
14
|
-
|
|
15
|
-
# Set the DATABASE_URL with admin user details.
|
|
16
|
-
ENV['DATABASE_URL'] = database_url
|
|
17
|
-
ENV['CACHE_DATABASE_URL'] = "#{database_url}_cache"
|
|
18
|
-
ENV['QUEUE_DATABASE_URL'] = "#{database_url}_queue"
|
|
19
|
-
ENV['CABLE_DATABASE_URL'] = "#{database_url}_cable"
|
|
20
|
-
|
|
21
|
-
# Set a flag to indicate we're running with admin privileges
|
|
22
|
-
ENV['RLS_MULTI_TENANT_ADMIN_MODE'] = 'true'
|
|
23
|
-
|
|
24
|
-
puts "Executing db:#{sub_task} with admin privileges..."
|
|
25
|
-
Rake::Task["db:#{sub_task}"].invoke
|
|
26
|
-
end
|
|
27
|
-
end
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
# frozen_string_literal: true
|
|
2
|
-
|
|
3
|
-
require 'rails/generators'
|
|
4
|
-
require 'rls_multi_tenant/generators/shared/template_helper'
|
|
5
|
-
|
|
6
|
-
module RlsMultiTenant
|
|
7
|
-
module Generators
|
|
8
|
-
class TaskGenerator < Rails::Generators::Base
|
|
9
|
-
include Shared::TemplateHelper
|
|
10
|
-
|
|
11
|
-
source_root File.expand_path("templates", __dir__)
|
|
12
|
-
|
|
13
|
-
desc "Generate RLS Multi-tenant rake tasks"
|
|
14
|
-
|
|
15
|
-
def create_db_admin_task
|
|
16
|
-
copy_shared_template "db_admin.rake", "lib/tasks/db_admin.rake"
|
|
17
|
-
show_instructions
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def show_instructions
|
|
21
|
-
say "\n" + "="*60, :green
|
|
22
|
-
say "RLS Multi-tenant rake tasks created successfully!", :green
|
|
23
|
-
say "="*60, :green
|
|
24
|
-
say "\nWhat was created:", :yellow
|
|
25
|
-
say "1. lib/tasks/db_admin.rake - Database admin tasks", :yellow
|
|
26
|
-
say "\nUsage:", :yellow
|
|
27
|
-
say "rails db_as:admin[migrate] # Run migrations with admin privileges", :yellow
|
|
28
|
-
say "rails db_as:admin[seed] # Run seeds with admin privileges", :yellow
|
|
29
|
-
say "\nNote: This is required because the app user doesn't have migration privileges", :yellow
|
|
30
|
-
say "="*60, :green
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|