0

私は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
}

マルチテナントと春のセキュリティがどのように連携するのかわかりません。アーキテクチャ/デザインを理解するのに苦労しています。

誰かがサンプルの実装を提供してくれたり、正しい方向に向けてくれたりすると、本当に役に立ちます。ありがとう、ディネッシュ

4

1 に答える 1

0

問題は、Spring セキュリティ フィルタの前にマルチテナント フィルタが登録されたため、Spring セキュリティ認証が完了するまで tenantResolver が呼び出されなかったことです。config.groovy で resolveTenantBeforeLogin を true に設定することで、この問題を修正しました。

config.groovy に、次の行を追加します。

multiTenant.resolveTenantBeforeLogin=true

この行を追加した後、tenantResolver が最初に呼び出され、次に認証が呼び出されます。

于 2013-12-04T03:16:12.203 に答える