pg_rls 0.0.2.6.6 → 0.0.2.6.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/templates/pg_rls.rb.tt +15 -0
- data/lib/pg_rls/middleware/set_reset_connection.rb +46 -0
- data/lib/pg_rls/tenant.rb +6 -7
- data/lib/pg_rls/version.rb +1 -1
- data/lib/pg_rls.rb +6 -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: 6783ec3471dcba6dbad4e13ab33933d5f02e4ea336956f1a88d568a0ac4f7943
|
4
|
+
data.tar.gz: 72d651c7863a7fc8de7df9441b849b58894e37833334d445df814aad402cf8e1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ef6b9d2c986f307fe286e7289fd6059a1255f029c1bc4c88d47da7547d5e2a30d1e43fa0bf7161dfbd307e78f996527f015800fc9c1ce44c80ecb2e7720f36fb
|
7
|
+
data.tar.gz: 15f5f316a234d82bbc6712ba78aaa33edc329ac7e7027d228fddd9aa6ea750a66c2585921e31b83d48e4906ae5ed36169ad57954c49e3ae52dc9158cc17dee34
|
@@ -26,4 +26,19 @@ PgRls.setup do |config|
|
|
26
26
|
## data structure across many project, Solo mode create a hidden tenant table
|
27
27
|
## which is autopopulated on each request
|
28
28
|
# config.solo_mode = true
|
29
|
+
|
30
|
+
##
|
31
|
+
## After installing the PgRls gem, you can add the `PgRls::Middleware::SetResetConnection`
|
32
|
+
## middleware to your Rails application to secure all database connections using Row Level Security.
|
33
|
+
## To add the middleware using the `middleware.use` method, add the following
|
34
|
+
## lines to your `config/application.rb` file:
|
35
|
+
## require 'pg_rls/middleware/set_reset_connection'
|
36
|
+
## config.middleware.use PgRls::Middleware::SetResetConnection
|
37
|
+
## Note: Be sure to add the `PgRls::Middleware::SetResetConnection` middleware after any
|
38
|
+
## middleware that sets up the Rails session, since the RLS middleware depends
|
39
|
+
## on the presence of the session to work correctly.
|
40
|
+
## Additionally, you will need to manually require the `PgRls::Middleware::SetResetConnection`
|
41
|
+
## file in your application, as shown in the first line of the code snippet above.
|
42
|
+
# config.session_key = '_hub_sessions'
|
43
|
+
# config.session_prefix = '_session_id:2::'
|
29
44
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module PgRls
|
4
|
+
module Middleware
|
5
|
+
# Set RLS if sessions present.
|
6
|
+
class SetResetConnection
|
7
|
+
def initialize(app)
|
8
|
+
@app = app
|
9
|
+
end
|
10
|
+
|
11
|
+
def call(env)
|
12
|
+
tenant = load_tenant_thought_session(env)
|
13
|
+
|
14
|
+
return @app.call(env) if tenant.blank?
|
15
|
+
|
16
|
+
PgRls::Tenant.with_tenant(tenant) { @app.call(env) }
|
17
|
+
rescue ActiveRecord::RecordNotFound => e
|
18
|
+
raise e unless rails_active_storage_request?(env)
|
19
|
+
|
20
|
+
[404, { 'Content-Type' => 'text/plain' }, ['Could not find asset']]
|
21
|
+
end
|
22
|
+
|
23
|
+
def load_session_cookie_value(env)
|
24
|
+
cookie_string = env['HTTP_COOKIE']
|
25
|
+
return if cookie_string.nil?
|
26
|
+
|
27
|
+
cookie_regex = /#{PgRls.session_key}=([^;]+)/
|
28
|
+
match = cookie_regex.match(cookie_string)
|
29
|
+
match[1] if match
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_tenant_thought_session(env)
|
33
|
+
cookie = load_session_cookie_value(env)
|
34
|
+
|
35
|
+
return if cookie.blank?
|
36
|
+
|
37
|
+
sessions = Rails.cache.read("#{PgRls.session_prefix}#{Digest::SHA256.hexdigest(cookie)}")
|
38
|
+
sessions['_tenant']
|
39
|
+
end
|
40
|
+
|
41
|
+
def rails_active_storage_request?(env)
|
42
|
+
env['PATH_INFO'].start_with?('/rails/active_storage/')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/pg_rls/tenant.rb
CHANGED
@@ -25,9 +25,9 @@ module PgRls
|
|
25
25
|
raise e
|
26
26
|
end
|
27
27
|
|
28
|
-
def find_each(&
|
28
|
+
def find_each(&)
|
29
29
|
PgRls.main_model.find_each do |tenant|
|
30
|
-
with_tenant(tenant, &
|
30
|
+
with_tenant(tenant, &)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -41,12 +41,12 @@ module PgRls
|
|
41
41
|
|
42
42
|
def fetch
|
43
43
|
fetch!
|
44
|
-
rescue ActiveRecord::StatementInvalid
|
45
|
-
|
44
|
+
rescue ActiveRecord::StatementInvalid, ActiveRecord::RecordNotFound
|
45
|
+
nil
|
46
46
|
end
|
47
47
|
|
48
48
|
def fetch!
|
49
|
-
@
|
49
|
+
@tenant ||= PgRls.main_model.find_by!(
|
50
50
|
tenant_id: PgRls.connection_class.connection.execute(
|
51
51
|
"SELECT current_setting('rls.tenant_id')"
|
52
52
|
).getvalue(0, 0)
|
@@ -63,7 +63,6 @@ module PgRls
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def reset_rls!
|
66
|
-
@fetch = nil
|
67
66
|
@tenant = nil
|
68
67
|
PgRls.connection_class.connection.execute('RESET rls.tenant_id')
|
69
68
|
end
|
@@ -80,7 +79,7 @@ module PgRls
|
|
80
79
|
|
81
80
|
connection_adapter.connection.transaction do
|
82
81
|
connection_adapter.connection.execute(format('SET rls.tenant_id = %s',
|
83
|
-
|
82
|
+
connection_adapter.connection.quote(tenant.tenant_id)))
|
84
83
|
end
|
85
84
|
|
86
85
|
tenant
|
data/lib/pg_rls/version.rb
CHANGED
data/lib/pg_rls.rb
CHANGED
@@ -148,6 +148,12 @@ module PgRls
|
|
148
148
|
mattr_accessor :test_inline_tenant
|
149
149
|
@@test_inline_tenant = false
|
150
150
|
|
151
|
+
mattr_accessor :session_key
|
152
|
+
@@session_key = '_hub_sessions'
|
153
|
+
|
154
|
+
mattr_accessor :session_prefix
|
155
|
+
@@session_prefix = '_session_id:2::'
|
156
|
+
|
151
157
|
mattr_accessor :search_methods
|
152
158
|
@@search_methods = %i[subdomain id tenant_id]
|
153
159
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pg_rls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.2.6.
|
4
|
+
version: 0.0.2.6.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Laloush
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-02-
|
11
|
+
date: 2023-02-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -65,6 +65,7 @@ files:
|
|
65
65
|
- lib/pg_rls/database/tasks/admin_database.rake
|
66
66
|
- lib/pg_rls/errors/tenant_not_found.rb
|
67
67
|
- lib/pg_rls/middleware.rb
|
68
|
+
- lib/pg_rls/middleware/set_reset_connection.rb
|
68
69
|
- lib/pg_rls/middleware/sidekiq.rb
|
69
70
|
- lib/pg_rls/middleware/sidekiq/client.rb
|
70
71
|
- lib/pg_rls/middleware/sidekiq/server.rb
|