2014-12-26 9 views
0

Windows AD LDAP과 함께 스프링 보안 3.2.4를 사용하고 있습니다. 인증에 성공했으며 LdapUserDetailsImpl이 채워졌습니다. LdapUserDetailsImpl에서 내가 할 수 얻을 사용자 이름, 당국하지만, 직원 이름 (로그인 사용자 이름) LdapUserDetailsImpl는 다음과 같은 속성을 포함하고 어떻게 직원 이름을 얻을, 내가 필요 그것을 수행 할스프링 보안 LDAP 사용자 이름 지정

Username = 40000 , 
Enabled = true, 
AccountNonExpired = true, 
Dn: cn=employee name,ou=IT_FM,ou=XXX_USERS,dc=XXXX,dc=CO,dc=IN; 

값을 얻는 방법 일부 클래스를 확장하고 내 매핑을 작성하거나 은 단순히 교장으로부터 Dn을 가져 와서 문자열을 분할하여 직원 이름을 얻을 수 있습니다.

+1

http://forum.spring.io/forum/spring-projects/security/57457-ldap-custom-userdetails –

+0

@ KonstantinV.Salikhov 감사 링크를 위해. 구현을 작성하거나 소유 할 필요가 있음을 이해하지만 더 간단한 방법이 있다면 생각하고있었습니다. 어떤 방식 으로든 컨텍스트 매퍼를 구현하고 대답으로 추가했습니다. 이것이 올바른 방법일까요? – Mukun

답변

0

내 사용자 정의 매퍼. 이 올바른 방법입니까?

@Service 
    public class MyUserDetailsContextMapper extends LdapUserDetailsMapper implements UserDetailsContextMapper { 
     @Override 
     public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) { 
      LdapUserDetailsImpl ldapUserDetailsImpl = (LdapUserDetailsImpl) super.mapUserFromContext(ctx, username, authorities); 
      MyUserDetails myUserDetails = new MyUserDetails(); 
      myUserDetails.setAccountNonExpired(ldapUserDetailsImpl.isAccountNonExpired()); 
      myUserDetails.setAccountNonLocked(ldapUserDetailsImpl.isAccountNonLocked()); 
      myUserDetails.setCredentialsNonExpired(ldapUserDetailsImpl.isCredentialsNonExpired()); 
      myUserDetails.setEnabled(ldapUserDetailsImpl.isEnabled()); 
      myUserDetails.setUsername(ldapUserDetailsImpl.getUsername()); 
      myUserDetails.setAuthorities(ldapUserDetailsImpl.getAuthorities()); 
      String dn = ldapUserDetailsImpl.getDn(); 
      int beginIndex = dn.indexOf("cn=") + 3; 
      int endIndex = dn.indexOf(","); 
      myUserDetails.setEmployeeName(dn.substring(beginIndex, endIndex)); 
      return myUserDetails; 
     } 

    } 
1

당신은 교장 DN을 얻고 사용자 이름 (CN)

LdapUserDetailsImpl ldapDetails = (LdapUserDetailsImpl) SecurityContextHolder 
      .getContext().getAuthentication().getPrincipal(); 
String dn = ldapDetails.getDn(); 
int beginIndex = dn.indexOf("cn=") + 3; 
int endIndex = dn.indexOf(","); 
String username = dn.substring(beginIndex, endIndex); 
0

@Mukun 거의이있다을 추출 할 수 있습니다.

String dn = ldapUserDetailsImpl.getDn(); 
int beginIndex = dn.indexOf("cn=") + 3; 
int endIndex = dn.indexOf(","); 
myUserDetails.setEmployeeName(dn.substring(beginIndex, endIndex)); 

내가 가진 것 : 유일한 것은 대신에,이다

String name = ctx.getObjectAttribute("cn").toString() 
myUserDetails.setEmployeeName(name) 

이 LDAP 통합을 당신을 위해 모든 끔찍한 물건을 처리 할 수 ​​있습니다 문자열 자신을 베고의 위험을 잃는다.

또한

myUserDetails.setFirstName(ctx.getObjectAttribute("givenName").toString()) 
myUserDetails.setLastName(ctx.getObjectAttribute("sn").toString()) 

이런 일들은 모두 MS AD, "정상"LDAP 너무 가능한 노벨을 위해 일해야하는 것이 좋습니다.

는 그래서 전체 대답은 다음과 같습니다

@Service 
public class MyUserDetailsContextMapper extends LdapUserDetailsMapper implements UserDetailsContextMapper { 
    @Override 
    public UserDetails mapUserFromContext(DirContextOperations ctx, String username, Collection<? extends GrantedAuthority> authorities) { 
     LdapUserDetailsImpl ldapUserDetailsImpl = (LdapUserDetailsImpl) super.mapUserFromContext(ctx, username, authorities); 
     MyUserDetails myUserDetails = new MyUserDetails(); 
     myUserDetails.setAccountNonExpired(ldapUserDetailsImpl.isAccountNonExpired()); 
     myUserDetails.setAccountNonLocked(ldapUserDetailsImpl.isAccountNonLocked()); 
     myUserDetails.setCredentialsNonExpired(ldapUserDetailsImpl.isCredentialsNonExpired()); 
     myUserDetails.setEnabled(ldapUserDetailsImpl.isEnabled()); 
     myUserDetails.setUsername(ldapUserDetailsImpl.getUsername()); 
     myUserDetails.setAuthorities(ldapUserDetailsImpl.getAuthorities()); 
     myUserDetails.setEmployeeName(ctx.getObjectAttribute("cn").toString()); 
     return myUserDetails; 
    } 
} 
관련 문제