私はgrailsを初めて使用し、Spring Security CoreとMulti-tenant single db pluginを実装しようとしています. 最初にスプリング セキュリティ コアを実装し、カスタムの AuthenticationProvider と Authentication を実装しました。次に、マルチテナントのシングル db プラグインをインストールし、カスタムの tenantResolver と tenantRepository を自動的に作成する 'mt-spring-security' スクリプトを実行しました。テスト目的で、tenantResolver に tenantId をハードコーディングしました。ドメイン クラスに @MultiTenant アノテーションを追加しました。
@マルチテナント
クラスClientUserはSerializableを実装します{
long idclient_user
Userprofile user
Client client
int tenantId
...
}
AuthenticationProvider では、ClientUser データは現在のテナントに対してフィルター処理されません。すべてのテナントにデータを持ち込んでいます。
クラスClientAuthenticationProviderはAuthenticationProviderを実装します{
Authentication authenticate(Authentication auth) throws AuthenticationException {
ClientAuthentication authentication = auth
String password = authentication.credentials
String username = authentication.name
String clientName = authentication.clientName
...
Userprofile.withTransaction { status ->
def user = Userprofile.findWhere(username: username)
def client = Client.findWhere(clientname: clientName)
def clientUser = ClientUser.findWhere(client: client, user: user) <-- NOT FILTERED FOR THE CURRENT TENANT. I HARD-CODED INVALID TENANTID IN THE TENANTRESOLVER AND EXPECTING IT TO FAIL BUT IT STILL FINDS THE USER.
if (!clientUser) {
throw new UsernameNotFoundException('User not found', username)
}
...
}
...
result
}
マルチテナントと春のセキュリティがどのように連携するのかわかりません。アーキテクチャ/デザインを理解するのに苦労しています。
誰かがサンプルの実装を提供してくれたり、正しい方向に向けてくれたりすると、本当に役に立ちます。ありがとう、ディネッシュ