activerecord-tenant-level-security 0.6.0 → 0.8.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/.circleci/config.yml +2 -2
- data/CHANGELOG.md +10 -0
- data/activerecord-tenant-level-security.gemspec +2 -2
- data/lib/activerecord-tenant-level-security/reconnectable_adapter.rb +9 -0
- data/lib/activerecord-tenant-level-security/tenant_level_security.rb +23 -10
- data/lib/activerecord-tenant-level-security/version.rb +1 -1
- data/lib/activerecord-tenant-level-security.rb +4 -1
- metadata +9 -12
- data/gemfiles/rails_7.2.gemfile +0 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 81fecc5ddf88902ee6cee67a10993252adde65b960a65fe9a98de17cb2068d8c
|
|
4
|
+
data.tar.gz: 5e00c87015dc059b04cd1d6bf53937ad5c85c600f4f03f2054070aa38b61371d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 776a2762a6723583c82c0ae8429dc5cb84ad68d4ab8d1629d89f754ef1a0ff2b09856600282542daa1853b76b03b6d90a068c00884d372dbe9c638bf59157de6
|
|
7
|
+
data.tar.gz: 7c16407104591d25471693009c1c76f3d50bbe742f83efa9036defdf50e891c1eae79a8029f10af122be8be4ccb1f0f51e1d63b4b0220ad1b806fab2b2dae9cf
|
data/.circleci/config.yml
CHANGED
|
@@ -29,5 +29,5 @@ workflows:
|
|
|
29
29
|
matrix:
|
|
30
30
|
parameters:
|
|
31
31
|
ruby: ['ruby:3.3', 'ruby:3.4', 'ruby:4.0']
|
|
32
|
-
rails: ['
|
|
33
|
-
postgres: ['postgres:14.
|
|
32
|
+
rails: ['rails_8.0', 'rails_8.1']
|
|
33
|
+
postgres: ['postgres:14.24', 'postgres:15.19', 'postgres:16.15', 'postgres:17.11', 'postgres:18.6']
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
## v0.8.0 (2026-09-07)
|
|
2
|
+
|
|
3
|
+
### Breaking Changes
|
|
4
|
+
- [#39](https://github.com/kufu/activerecord-tenant-level-security/pull/39): Drop support for Rails 7.2 (EOL)
|
|
5
|
+
|
|
6
|
+
## v0.7.0 (2026-04-07)
|
|
7
|
+
|
|
8
|
+
### Enhancements
|
|
9
|
+
- [#35](https://github.com/kufu/activerecord-tenant-level-security/pull/35): Preserve RLS context across automatic reconnections
|
|
10
|
+
|
|
1
11
|
## v0.6.0 (2026-03-11)
|
|
2
12
|
|
|
3
13
|
### Breaking Changes
|
|
@@ -24,8 +24,8 @@ Gem::Specification.new do |spec|
|
|
|
24
24
|
end
|
|
25
25
|
spec.require_paths = ["lib"]
|
|
26
26
|
|
|
27
|
-
spec.add_dependency "activerecord", ">=
|
|
28
|
-
spec.add_dependency "activesupport", ">=
|
|
27
|
+
spec.add_dependency "activerecord", ">= 8.0"
|
|
28
|
+
spec.add_dependency "activesupport", ">= 8.0"
|
|
29
29
|
spec.add_dependency "pg", ">= 1.0"
|
|
30
30
|
|
|
31
31
|
spec.add_development_dependency "bundler", ">= 2.0"
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
module TenantLevelSecurity
|
|
2
2
|
DEFAULT_PARTITION_KEY = 'tenant_id'.freeze
|
|
3
3
|
|
|
4
|
+
class TenantContext < ActiveSupport::CurrentAttributes
|
|
5
|
+
attribute :tenant_id
|
|
6
|
+
|
|
7
|
+
def tenant_id=(val)
|
|
8
|
+
super
|
|
9
|
+
TenantLevelSecurity.switch_with_connection!(ActiveRecord::Base.connection, val)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
resets do
|
|
13
|
+
TenantLevelSecurity.switch_with_connection!(ActiveRecord::Base.connection, nil)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
4
17
|
class << self
|
|
5
18
|
# The current_tenant_id sets the default tenant from the outside.
|
|
6
19
|
# Be sure to register in advance as `TenantLevelSecurity.current_tenant_id { id }` with initializers.
|
|
@@ -14,19 +27,19 @@ module TenantLevelSecurity
|
|
|
14
27
|
end
|
|
15
28
|
end
|
|
16
29
|
|
|
17
|
-
def with(tenant_id)
|
|
18
|
-
|
|
19
|
-
return yield if old_tenant_id == tenant_id
|
|
20
|
-
begin
|
|
21
|
-
switch! tenant_id
|
|
22
|
-
yield
|
|
23
|
-
ensure
|
|
24
|
-
switch! old_tenant_id
|
|
25
|
-
end
|
|
30
|
+
def with(tenant_id, &block)
|
|
31
|
+
TenantContext.with(tenant_id: tenant_id, &block)
|
|
26
32
|
end
|
|
27
33
|
|
|
28
34
|
def switch!(tenant_id)
|
|
29
|
-
|
|
35
|
+
TenantContext.tenant_id = tenant_id
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def switch_current_tenant_context!(conn = ActiveRecord::Base.connection)
|
|
39
|
+
TenantLevelSecurity.switch_with_connection!(
|
|
40
|
+
conn,
|
|
41
|
+
TenantLevelSecurity::TenantContext.tenant_id || TenantLevelSecurity.current_tenant_id
|
|
42
|
+
)
|
|
30
43
|
end
|
|
31
44
|
|
|
32
45
|
def switch_with_connection!(conn, tenant_id)
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
require 'active_support'
|
|
2
|
+
require 'active_support/current_attributes'
|
|
2
3
|
require 'active_record'
|
|
3
4
|
require 'pg'
|
|
4
5
|
|
|
@@ -7,9 +8,11 @@ require_relative 'activerecord-tenant-level-security/command_recorder'
|
|
|
7
8
|
require_relative 'activerecord-tenant-level-security/schema_dumper'
|
|
8
9
|
require_relative 'activerecord-tenant-level-security/schema_statements'
|
|
9
10
|
require_relative 'activerecord-tenant-level-security/sidekiq'
|
|
11
|
+
require_relative 'activerecord-tenant-level-security/reconnectable_adapter'
|
|
10
12
|
|
|
11
13
|
ActiveSupport.on_load(:active_record) do
|
|
12
14
|
ActiveRecord::ConnectionAdapters::AbstractAdapter.include TenantLevelSecurity::SchemaStatements
|
|
15
|
+
ActiveRecord::ConnectionAdapters::AbstractAdapter.prepend TenantLevelSecurity::ReconnectableAdapter
|
|
13
16
|
ActiveRecord::Migration::CommandRecorder.include TenantLevelSecurity::CommandRecorder
|
|
14
17
|
ActiveRecord::SchemaDumper.prepend TenantLevelSecurity::SchemaDumper
|
|
15
18
|
|
|
@@ -17,6 +20,6 @@ ActiveSupport.on_load(:active_record) do
|
|
|
17
20
|
# Make sure that TenantLevelSecurity.current_tenant_id does not depend on database connections.
|
|
18
21
|
# If a new connection is needed to get the current_tenant_id, the callback may be invoked recursively.
|
|
19
22
|
ActiveRecord::ConnectionAdapters::AbstractAdapter.set_callback :checkout, :after do |conn|
|
|
20
|
-
TenantLevelSecurity.
|
|
23
|
+
TenantLevelSecurity.switch_current_tenant_context!(conn)
|
|
21
24
|
end
|
|
22
25
|
end
|
metadata
CHANGED
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: activerecord-tenant-level-security
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- SmartHR
|
|
8
|
-
autorequire:
|
|
9
8
|
bindir: bin
|
|
10
9
|
cert_chain: []
|
|
11
|
-
date:
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
12
11
|
dependencies:
|
|
13
12
|
- !ruby/object:Gem::Dependency
|
|
14
13
|
name: activerecord
|
|
@@ -16,28 +15,28 @@ dependencies:
|
|
|
16
15
|
requirements:
|
|
17
16
|
- - ">="
|
|
18
17
|
- !ruby/object:Gem::Version
|
|
19
|
-
version: '
|
|
18
|
+
version: '8.0'
|
|
20
19
|
type: :runtime
|
|
21
20
|
prerelease: false
|
|
22
21
|
version_requirements: !ruby/object:Gem::Requirement
|
|
23
22
|
requirements:
|
|
24
23
|
- - ">="
|
|
25
24
|
- !ruby/object:Gem::Version
|
|
26
|
-
version: '
|
|
25
|
+
version: '8.0'
|
|
27
26
|
- !ruby/object:Gem::Dependency
|
|
28
27
|
name: activesupport
|
|
29
28
|
requirement: !ruby/object:Gem::Requirement
|
|
30
29
|
requirements:
|
|
31
30
|
- - ">="
|
|
32
31
|
- !ruby/object:Gem::Version
|
|
33
|
-
version: '
|
|
32
|
+
version: '8.0'
|
|
34
33
|
type: :runtime
|
|
35
34
|
prerelease: false
|
|
36
35
|
version_requirements: !ruby/object:Gem::Requirement
|
|
37
36
|
requirements:
|
|
38
37
|
- - ">="
|
|
39
38
|
- !ruby/object:Gem::Version
|
|
40
|
-
version: '
|
|
39
|
+
version: '8.0'
|
|
41
40
|
- !ruby/object:Gem::Dependency
|
|
42
41
|
name: pg
|
|
43
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -116,11 +115,11 @@ files:
|
|
|
116
115
|
- bin/console
|
|
117
116
|
- bin/setup
|
|
118
117
|
- compose.yml
|
|
119
|
-
- gemfiles/rails_7.2.gemfile
|
|
120
118
|
- gemfiles/rails_8.0.gemfile
|
|
121
119
|
- gemfiles/rails_8.1.gemfile
|
|
122
120
|
- lib/activerecord-tenant-level-security.rb
|
|
123
121
|
- lib/activerecord-tenant-level-security/command_recorder.rb
|
|
122
|
+
- lib/activerecord-tenant-level-security/reconnectable_adapter.rb
|
|
124
123
|
- lib/activerecord-tenant-level-security/schema_dumper.rb
|
|
125
124
|
- lib/activerecord-tenant-level-security/schema_statements.rb
|
|
126
125
|
- lib/activerecord-tenant-level-security/sidekiq.rb
|
|
@@ -132,8 +131,7 @@ licenses:
|
|
|
132
131
|
metadata:
|
|
133
132
|
homepage_uri: https://github.com/kufu/activerecord-tenant-level-security
|
|
134
133
|
source_code_uri: https://github.com/kufu/activerecord-tenant-level-security
|
|
135
|
-
changelog_uri: https://github.com/kufu/activerecord-tenant-level-security/blob/v0.
|
|
136
|
-
post_install_message:
|
|
134
|
+
changelog_uri: https://github.com/kufu/activerecord-tenant-level-security/blob/v0.8.0/CHANGELOG.md
|
|
137
135
|
rdoc_options: []
|
|
138
136
|
require_paths:
|
|
139
137
|
- lib
|
|
@@ -148,8 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
148
146
|
- !ruby/object:Gem::Version
|
|
149
147
|
version: '0'
|
|
150
148
|
requirements: []
|
|
151
|
-
rubygems_version: 3.
|
|
152
|
-
signing_key:
|
|
149
|
+
rubygems_version: 3.6.9
|
|
153
150
|
specification_version: 4
|
|
154
151
|
summary: An Active Record extension for Multitenancy with PostgreSQL Row Level Security
|
|
155
152
|
test_files: []
|