KerberosおよびLDAPを使用したJava Spring SSO認証

Dmytro:

私は、Java Spring Kerberos Securityライブラリ(リンクを使用してLinuxベースのRest APIアプリケーションに取り組んでいます

期待どおりに機能するSSO認証を実装できましたが、ROLEベースの承認を実装するためにLDAP統合を追加する必要があります。

ただし、LDAPバインディング/検索は機能しません-SearchFilterは次の例外で失敗します:

exception

org.springframework.ldap.InvalidSearchFilterException: invalid attribute description; nested exception is javax.naming.directory.InvalidSearchFilterException: invalid attribute description; remaining name 'dc=intranet,dc=example,dc=com'
    org.springframework.ldap.support.LdapUtils.convertLdapException(LdapUtils.java:135)
    org.springframework.ldap.core.LdapTemplate.executeWithContext(LdapTemplate.java:809)
    org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:792)
    org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntry(SpringSecurityLdapTemplate.java:194)
    org.springframework.security.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:116)
    org.springframework.security.ldap.userdetails.LdapUserDetailsService.loadUserByUsername(LdapUserDetailsService.java:38)
    org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:66)
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
    org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
root cause

javax.naming.directory.InvalidSearchFilterException: invalid attribute description; remaining name 'dc=intranet,dc=example,dc=com'
    com.sun.jndi.ldap.Filter.encodeSimpleFilter(Filter.java:446)
    com.sun.jndi.ldap.Filter.encodeFilter(Filter.java:171)
    com.sun.jndi.ldap.Filter.encodeFilterString(Filter.java:74)
    com.sun.jndi.ldap.LdapClient.search(LdapClient.java:546)
    com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1985)
    com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1844)
    com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1769)
    com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1786)
    com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:418)
    com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:396)
    javax.naming.directory.InitialDirContext.search(InitialDirContext.java:297)
    org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntryInternal(SpringSecurityLdapTemplate.java:208)
    org.springframework.security.ldap.SpringSecurityLdapTemplate$3.executeWithContext(SpringSecurityLdapTemplate.java:196)
    org.springframework.ldap.core.LdapTemplate.executeWithContext(LdapTemplate.java:806)
    org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:792)
    org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntry(SpringSecurityLdapTemplate.java:194)
    org.springframework.security.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:116)
    org.springframework.security.ldap.userdetails.LdapUserDetailsService.loadUserByUsername(LdapUserDetailsService.java:38)
    org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider.authenticate(KerberosServiceAuthenticationProvider.java:66)
    org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.java:156)
    org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter.doFilter(SpnegoAuthenticationProcessingFilter.java:145)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)

アプリケーションの詳細:

1. Security-context.xml

 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:sec="http://www.springframework.org/schema/security"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">


  <context:property-placeholder location="classpath:application.properties"/>

  <sec:http entry-point-ref="spnegoEntryPoint" use-expressions="true" >
    <sec:intercept-url pattern="/" access="permitAll" />
    <sec:intercept-url pattern="/home" access="permitAll" />
    <sec:intercept-url pattern="/login" access="permitAll" />
    <sec:intercept-url pattern="/test" access="authenticated"/>
    <sec:intercept-url pattern="/data" access="hasRole('ROLE_ADMIN')"/>
    <sec:form-login login-page="/login" />
    <sec:custom-filter ref="spnegoAuthenticationProcessingFilter"
      before="BASIC_AUTH_FILTER" />
  </sec:http>

  <sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider ref="kerberosServiceAuthenticationProvider" />
    <sec:authentication-provider ref="adAuthenticationProvider" />
  </sec:authentication-manager>


  <bean id="adAuthenticationProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
        <constructor-arg  value="${ldap.domain}"/>
        <constructor-arg  value="${ldap.url}"/>
        <property name="userDetailsContextMapper" ref="CustomUserDetailsContextMapper" /> 
  </bean>

  <bean id="spnegoEntryPoint"
    class="org.springframework.security.kerberos.web.authentication.SpnegoEntryPoint" >
  </bean>

  <bean id="spnegoAuthenticationProcessingFilter"
    class="org.springframework.security.kerberos.web.authentication.SpnegoAuthenticationProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager" />
  </bean>

  <bean id="kerberosServiceAuthenticationProvider"
    class="org.springframework.security.kerberos.authentication.KerberosServiceAuthenticationProvider">
    <property name="ticketValidator">
      <bean
        class="org.springframework.security.kerberos.authentication.sun.SunJaasKerberosTicketValidator">
        <property name="servicePrincipal" value="${app.service-principal}" />
        <property name="keyTabLocation" value="${app.keytab-location}" />
        <property name="debug" value="true" />
      </bean>
    </property>
    <property name="userDetailsService" ref="CustomUserDetailsService" />
  </bean>

  <bean id="authorizationContextSource" class="org.springframework.security.kerberos.client.ldap.KerberosLdapContextSource">
      <constructor-arg value="${ldap.url}" />
      <property name="loginConfig">
          <bean class="org.springframework.security.kerberos.client.config.SunJaasKrb5LoginConfig">
               <property name="servicePrincipal" value="${app.service-principal}" />
               <property name="keyTabLocation" value="${app.keytab-location}" />
               <property name="useTicketCache" value="false" />
               <property name="isInitiator" value="true" />
               <property name="debug" value="true" />
           </bean>
      </property>
    </bean>

    <bean id="CustomUserDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
            <constructor-arg index="0" ref="userSearch" />
            <constructor-arg index="1" ref="CustomLdapAuthoritiesPopulator" />
            <property name="userDetailsMapper" ref="CustomUserDetailsContextMapper" />
    </bean>

    <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
            <constructor-arg index="0" value="${ldap.ldap-search-base}" />
            <constructor-arg index="1" value="${ldap.search-filter}" />
            <constructor-arg index="2" ref="authorizationContextSource" />
            <property name="searchSubtree" value="true" />
    </bean>

   <bean id="CustomUserDetailsContextMapper" class="com.my.utility.UserDetailsContextMapperImpl" />

   <bean id="CustomLdapAuthoritiesPopulator" class="com.my.utility.ActiveDirectoryLdapAuthoritiesPopulator" />

</beans>

2. application.properties

ldap.url=ldap://intranet.example.com

ldap.domain=intranet.example.com

ldap.ldap-search-base="DC=INTRANET,DC=EXAMPLE,DC=COM"

ldap.search-filter="(userPrincipalName={0})"

[email protected]

app.keytab-location=file:/apps/tomcat/myprincipal.keytab

app.krb5=file:/apps/tomcat/conf/krb5.conf

3. LDAP DN値

CN=Full Name,OU=Users,OU=LDN,OU=EMEA,OU=GLB,DC=INTRANET,DC=EXAMPLE,DC=com

CN値はフルネームで構成され、ユーザー/プリンシパルID([email protected])ではありません。このLDAP検索/バインディングが適切に行われないため、

org.springframework.ldap.InvalidSearchFilterException: invalid attribute description; nested exception is javax.naming.directory.InvalidSearchFilterException: invalid attribute description; remaining name 'dc=intranet,dc=example,dc=com'

質問

問題を理解し、CustomUserDetailsS​​erviceを修正してこの問題を修正してください。

adAuthenticationProviderは、ログインパスワード認証を使用して個別に期待通りに動作しますが、私は、Kerberos認証マネージャに統合する方法を確認していない- kerberosServiceAuthenticationProvider、それらの間のリンクがあります。

kerberosServiceAuthenticationProviderは、ダミーのユーザー詳細サービスの実装で期待どおりに機能します。ただし、LDAP実装に置き換えている限り、上記のエラーメッセージが表示されて失敗し続けます。

public class DummyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        return new User(username, "notUsed", true, true, true, true,
                AuthorityUtils.createAuthorityList("ROLE_USER"));
    }

}

ご協力ありがとうございました。

Dmytro:

解決策は非常に簡単です- 次の行のapplication.properties構成の下の引用符を削除します。

ldap.ldap-search-base="DC=INTRANET,DC=EXAMPLE,DC=COM"

ldap.search-filter="(userPrincipalName={0})"

ldap.ldap-search-base=DC=INTRANET,DC=EXAMPLE,DC=COM

ldap.search-filter=(userPrincipalName={0})

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Weblogic12 + SPNEGO + Kerberos + LDAPを使用したSSO認証

分類Dev

spring-security-oauth2を使用したSSO:認証コードが読み取られない

分類Dev

Spring Boot2およびSpringSecurity5を使用した多要素認証

分類Dev

uidを使用したPhpおよびLdapログイン認証

分類Dev

Spring Security OAuth2- @ EnableOauth2Ssoですが、認証としてトークンも受け入れます

分類Dev

SSOにFireBase認証を使用する方法

分類Dev

JHipster、Spring Security、およびoauth2を使用した認証リダイレクトの制御

分類Dev

Spring Securityを使用したADAMに対するLDAPを使用した認証

分類Dev

Spring SecurityとLDAP認証

分類Dev

RestTemplateを使用したSpring 4.0.0基本認証

分類Dev

RestTemplateを使用したSpring Security認証

分類Dev

Spring-Cookieを使用したRESTful認証

分類Dev

Spring DataSolrを使用したSolrCoreの認証

分類Dev

SSOを使用したOutlookWEBアドインの認証

分類Dev

Spring Securityによる認証

分類Dev

SpringによるRESTful認証

分類Dev

Oauth2およびSpring-boot-starter-parentバージョン2+を使用したSpringブートSSO

分類Dev

ログイン、パスワード、およびSpring Security(OAuthではない)を使用したFacebookアクセストークンを使用した認証方法

分類Dev

反応アプリケーションからSpnegoKerberos Spring SSOにWindows認証(ブラウザー)を渡す方法は?

分類Dev

KerberosまたはAD / LDAPを使用しないHbase認証

分類Dev

Kerberos認証を使用したLDAP接続プーリング

分類Dev

JDBCおよびKerberos認証を使用してHiveに接続する際の例外

分類Dev

Spring Security + Spring data + MongoDBによる認証

分類Dev

Spring、Swing、SQLiteを使用したJavaでのユーザー認証

分類Dev

基本認証を使用したJavaでのGetおよびPost API呼び出し

分類Dev

Spring LDAP APIを使用し、Springセキュリティを使用せずにLDAPを使用して認証する

分類Dev

SSO認証を使用したExchangeサーバーを介したJavaMail

分類Dev

複数のアプリケーションでのSSOおよびRESTApi認証

分類Dev

フォーム認証とOWINUseCookieAuthenticationおよびサブドメインSSO

Related 関連記事

  1. 1

    Weblogic12 + SPNEGO + Kerberos + LDAPを使用したSSO認証

  2. 2

    spring-security-oauth2を使用したSSO:認証コードが読み取られない

  3. 3

    Spring Boot2およびSpringSecurity5を使用した多要素認証

  4. 4

    uidを使用したPhpおよびLdapログイン認証

  5. 5

    Spring Security OAuth2- @ EnableOauth2Ssoですが、認証としてトークンも受け入れます

  6. 6

    SSOにFireBase認証を使用する方法

  7. 7

    JHipster、Spring Security、およびoauth2を使用した認証リダイレクトの制御

  8. 8

    Spring Securityを使用したADAMに対するLDAPを使用した認証

  9. 9

    Spring SecurityとLDAP認証

  10. 10

    RestTemplateを使用したSpring 4.0.0基本認証

  11. 11

    RestTemplateを使用したSpring Security認証

  12. 12

    Spring-Cookieを使用したRESTful認証

  13. 13

    Spring DataSolrを使用したSolrCoreの認証

  14. 14

    SSOを使用したOutlookWEBアドインの認証

  15. 15

    Spring Securityによる認証

  16. 16

    SpringによるRESTful認証

  17. 17

    Oauth2およびSpring-boot-starter-parentバージョン2+を使用したSpringブートSSO

  18. 18

    ログイン、パスワード、およびSpring Security(OAuthではない)を使用したFacebookアクセストークンを使用した認証方法

  19. 19

    反応アプリケーションからSpnegoKerberos Spring SSOにWindows認証(ブラウザー)を渡す方法は?

  20. 20

    KerberosまたはAD / LDAPを使用しないHbase認証

  21. 21

    Kerberos認証を使用したLDAP接続プーリング

  22. 22

    JDBCおよびKerberos認証を使用してHiveに接続する際の例外

  23. 23

    Spring Security + Spring data + MongoDBによる認証

  24. 24

    Spring、Swing、SQLiteを使用したJavaでのユーザー認証

  25. 25

    基本認証を使用したJavaでのGetおよびPost API呼び出し

  26. 26

    Spring LDAP APIを使用し、Springセキュリティを使用せずにLDAPを使用して認証する

  27. 27

    SSO認証を使用したExchangeサーバーを介したJavaMail

  28. 28

    複数のアプリケーションでのSSOおよびRESTApi認証

  29. 29

    フォーム認証とOWINUseCookieAuthenticationおよびサブドメインSSO

ホットタグ

アーカイブ