This application demonstrates multi-tenancy in a Spring-Boot 2 app using a discriminator field with Hibernate.
Run the app:
$ createdb spring-multi-tenancy
$ ./mvnw clean spring-boot:run
From another terminal:
$ curl localhost:8080/employees -H "X-TenantID: tenant1"
[{"userId":"16b5308b-6bb8-4a75-ae93-66dc71a0b981","firstName":"John","lastName":"Doe","tenantId":"tenant1"}]
$ curl localhost:8080/employees -H "X-TenantID: tenant3"
[]
$ curl localhost:8080/employees -H "X-TenantID: tenant3" -H "Content-Type: application/json" -X POST -d '{"firstName":"joe"}'
{"userId":"c77ad6bb-b2ad-47f7-b21c-3e50deb6a574","firstName":"joe","lastName":null,"tenantId":"tenant3"}
$ curl localhost:8080/employees -H "X-TenantID: tenant3"
[{"userId":"c77ad6bb-b2ad-47f7-b21c-3e50deb6a574","firstName":"joe","lastName":null,"tenantId":"joe"}]
X-TenantID
http header and set's it in the ThreadLocal variable using TenantContext
class. If http header is not present in request, it'll be rejected.EmployeeServiceAspect
class) intercepts the service call and set's the hibernate tenant filter.@Transactional
for EmployeeServiceAspect
to work.EmptyInterceptor
) class which sets the tenantId value during the save/delete/flush-dirty entity events.TenantSupport
interface for the Entity interceptor to work. MIT