복붙노트

[SPRING] Spring LdapAuthentication 및 로컬 데이터베이스에서 롤로드

SPRING

Spring LdapAuthentication 및 로컬 데이터베이스에서 롤로드

나는 봄 보안을 LDAP 서버에 대해 인증하도록 구성했다.

<security:authentication-manager >
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" />

</security:authentication-manager>

인증 후 동일한 사용자의 로컬 데이터베이스에서 역할을로드하려고합니다. "ldap-authentication-provider"를 사용하여 로컬 데이터베이스 역할을로드하려면 어떻게해야합니까?

두 번째 인증 공급자를 아래와 같이 추가하면

<security:authentication-manager >
    <security:ldap-authentication-provider user-dn-pattern="uid={0}" />
            <security:authentication-provider ref="daoAuthenticationProvider" />
</security:authentication-manager>

daoAuthenticationProvider가 추가되었지만 Spring은 첫 번째 인증 제공자가 사용자를 인증 할 때 두 번째 제공자를 사용하지 않습니다. 첫 번째 인증 공급자가 인증에 실패하면 목록에서 다음으로 이동합니다.

기본적으로 사용자 정의해야하는 것처럼 보입니다.

<security:ldap-authentication-provider user-dn-pattern="uid={0}" />

로컬 데이터베이스에서 ROLE을로드합니다.

어떤 제안? 이것이 어떻게 구현되어야 하는가?

해결법

  1. ==============================

    1.인증 공급자는 성공한 인증에 대해 완전히 채워진 인증 토큰을 제공해야하므로 하나의 공급자를 사용하여 사용자의 자격 증명을 검사하고 또 다른 공급자를 사용하여 권한 (역할)을 할당 할 수 없습니다.

    인증 공급자는 성공한 인증에 대해 완전히 채워진 인증 토큰을 제공해야하므로 하나의 공급자를 사용하여 사용자의 자격 증명을 검사하고 또 다른 공급자를 사용하여 권한 (역할)을 할당 할 수 없습니다.

    그러나 ldap 인증 공급자를 사용자 정의하여 기본 동작 (ldap에서 사용자 그룹 검색) 대신 데이터베이스에서 사용자 역할을 가져올 수 있습니다. LdapAuthenticationProvider에는 두 가지 전략, 즉 인증 자체를 수행하는 전략 (LdapAuthenticator)과 사용자 권한 (LdapAuthoritiesPopulator)을 가져 오는 전략이 주입됩니다. 데이터베이스에서 역할을로드하는 LdapAuthoritiesPopulator 구현을 제공하면 요구 사항을 충족시킬 수 있습니다. 이미 데이터베이스에 대해 UserDetailsService가 작동하고있는 경우 UserDetailsServiceLdapAuthoritiesPopulator에 래핑하여 LdapAuthenticationProvider에 삽입하여 쉽게 통합 할 수 있습니다.

    이 구성은 드문 경우이기 때문에 보안 XML 네임 스페이스는 태그 / 속성을 설정하지 않지만 원시 bean 구성은 너무 복잡하지 않습니다. 다음은 개요입니다.

    1) 당신은 어딘가에 당신의 설정에 ldap-server가 있다고 가정합니다. id와 id를 지정하는 것이 중요합니다. 그러면 나중에 참조 할 수 있습니다.

    <security:ldap-server url="..." id="ldapServer" .../>
    

    2) 인증 관리자 섹션에서 사용자 정의 된 제공자 만 참조합니다.

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

    3) 이제 필수적인 부분 :

    <bean id="customLdapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
        <constructor-arg name="authenticator">
            <bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
                <constructor-arg name="contextSource" ref="ldapServer"/>
                <property name="userDnPatterns">
                    <list>
                        <value>uid={0}</value>
                    </list>
                </property>
            </bean>
        </constructor-arg>
        <constructor-arg name="authoritiesPopulator">
            <bean class="org.springframework.security.ldap.authentication.UserDetailsServiceLdapAuthoritiesPopulator">
                <constructor-arg name="userService" ref="userService"/>
            </bean>
        </constructor-arg>
    </bean>
    

    인증자는 기본적으로 네임 스페이스 구성에 의해 생성되는 인증 자와 동일합니다. (ldap 서버를 참조하는 contextSource 속성에주의하십시오.)

    authoritiesPopulator는 사용자의 구성에 어딘가에 정의되어 있어야하는 userService 구현을 둘러싼 간단한 래퍼입니다.

  2. from https://stackoverflow.com/questions/16469314/spring-ldapauthentication-and-load-roles-from-local-database by cc-by-sa and MIT license