2017-12-20 4 views
0

현재 LDAP를 통해 사용자를 인증하는 응용 프로그램을 개발 중입니다. 로그인 성공 기준은 올바른 사용자 이름, 암호 및 그룹 (TEST-FFSUS-CALBR-USER)을 기반으로합니다.LDAP에 ContainerCriteria를 사용하여 특정 그룹이 있는지 확인하는 동안 문제가 발생했습니다.

사용자 이름 및 비밀번호 기준으로 성공적으로 로그인했지만 그룹 기준으로 성공적으로 로그인 할 수 없었습니다. 응용 문맥에서

@Resource 
LdapTemplate ldapTemplate; 

public boolean login(String username, String password) { 
     try { 
       ContainerCriteria searchCriteria = getLdapFilterCriteria(username); 
       boolean result = ldapTemplate.authenticate("OU=User,OU=fo-id,DC=feefusde,DC=rootdom,DC=net", 
         searchCriteria.filter().encode(), password); 
       return result; 
      } catch (Exception e) { 
       return false; 
      } 
    } 

private ContainerCriteria getLdapFilterCriteria(String usernameOrEmail) { 
     ContainerCriteria objectClassCriteria = LdapQueryBuilder.query().base("DC=rootdom,DC=net").where("objectClass") 
       .is("user"); 
     ContainerCriteria mailCriteria = LdapQueryBuilder.query().where("mail").is(usernameOrEmail); 
     ContainerCriteria cnCriteria = LdapQueryBuilder.query().where("CN").is(usernameOrEmail); 
     ContainerCriteria roleCriteria = LdapQueryBuilder.query().where("memberOf=CN").is("TEST-FFSUS-CALBR-USER"); 
     ContainerCriteria userByMailOrCnCriteria = mailCriteria.or(cnCriteria); 
     ContainerCriteria searchCriteria = objectClassCriteria.and(userByMailOrCnCriteria).and(roleCriteria); 
     return searchCriteria; 
    } 

:

<bean id="ldapTemplate" class="org.springframework.ldap.core.LdapTemplate"> 
    <property name="contextSource"> 
     <bean class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
      <constructor-arg> 
       <value>ldap://urlofldap:portno</value> 
      </constructor-arg> 
      <property name="userDn" value="${ldap.username}" /> 
      <property name="password" value="${ldap.password}" /> 
     </bean> 
    </property> 
</bean> 

문제보다 해결하기 위해 어떤 방법이 있나요 다음

이 목적을 위해 사용되는 코드입니다. ?

답변

0

memberOf 속성은 그룹 고유 이름과 일치해야합니다. 예를 "CN=TEST-FFSUS-CALBR-USER,OU=roles,DC=feefusde,DC=rootdom,DC=net"를 들어 : "(의 memberOf")는 (TEST-FFSUS-CALBR 사용자가 ").이다"

ContainerCriteria roleCriteria = LdapQueryBuilder.query().where("memberOf").is(groupDN); 
+0

내가 이미 시도했다. 어디 LdapQueryBuilder.query() ";"이 일을 didnt한다. –

+0

@JobyWilsonMathews 물론 작동하지 않았습니다! 시도한 내용이 정확하지 않습니다. "TEST-FFSUS-CA LBR-USER"와 CN = TEST-FFSUS-CALBR-USER, OU = roles, DC = feefusde, DC = rootdom, DC = net "'? 나는'memberOf' 속성이 그룹 ** 고유 이름 **과 일치해야한다고 분명히 말했습니다. ' "TEST-FFSUS-CA LBR-USER"'는 dn이 아닙니다. 또한, 귀하의 질문에 당신은 필터'어디 ("memberOf = CN")'dn 매개 변수에 관계없이 작동하지 않습니다 언급했다. – EricLavault

+0

@JobyWilsonMathews 그래서 질문을 한 다음 대답과 관련이없는 무언가를 시도했다고 말하면 작동하지 않습니다. – EricLavault

관련 문제