1

以前の 質問のように、Spring Security を既存のアプリケーションに統合するという濁った水の中を歩き続けます。アプリケーションは最終的に LDAP (TLS 経由) を介して Active Directory に対して認証し、グループ メンバーシップまたはユーザー オブジェクトのカスタム AD フィールドに格納された文字列。

私の現在の問題は、上記のすべてを正常に管理できましが、セッションに保存されたカスタム権限を持つ User オブジェクトを取得できなかったことです。これは、追加の作業をしなくても、すべてのユーザーが最後にログインしたユーザーが利用できる権限を享受できることを意味します。

ユーザー権限をHashtable<username, permissions>オブジェクトに保存することでこの問題を回避しました。これは、ゲッター/セッターに で注釈を付けることで保護できます@PreAuthorize("isAuthenticated() and principal.name == #username")が、これは明らかに理想的ではありません。AD から収集したカスタム情報を、カスタム ユーザー オブジェクトの一部としてセッションに保存したいと考えています。しかし、どのように?

security.xmlmyとconfigurationの関連部分はldap.xml、それぞれ次のとおりです。

<security:authentication-manager>
    <security:authentication-provider ref="ldapAuthenticationProvider"/>
</security:authentication-manager>

<bean id="ldapAuthenticationProvider"
            class="my.project.package.OverrideActiveDirectoryLdapAuthenticationProvider">


        <constructor-arg value="test.server"/>
        <constructor-arg value="ldap://192.168.0.2:389"/>
        <property name="convertSubErrorCodesToExceptions" value="true"/>
</bean>

私が予見した問題の 1 つは、loadUserAuthorities()(AD フィールドのカスタム使用のためにオーバーライドされた) メソッドが呼び出されると、SecurityContextHolder.getContext().getAuthentication()が返されることnullです。これは問題です。これは、認証プロセスが完了しておらず、認証対象のユーザーに関連するセッション ID が生成されていないことを示しています (Spring のセッションの処理を理解しているため)。つまり、Spring は認証時に匿名セッションをクリアして新しいセッション ID を優先しますが、そのセッションloadUserAuthorities()は実行時に明らかに利用できません。

それで、私は何をしましょうか?私が言ったように、私のハックは機能し、安全であるように見えますが (適切な注釈があれば)、理想的とは言えません。カスタム ユーザー情報をセッション スコープのユーザー オブジェクトに適切に保存しながら、LDAP 経由 (TLS 経由) で AD に対する認証を維持するはどうすればよいですか?

いつものように、私は SO コミュニティから受けるすべての支援を愛し、感謝しています。

4

0 に答える 0