2014-12-26 5 views
0

Я использую Spring security 3.2.4 с Windows AD LDAP. Я могу успешно пройти аутентификацию и заполнен LdapUserDetailsImpl. От LdapUserDetailsImpl я могу получить имя пользователя, власти, но как получить имя сотрудника (а не имя пользователя Логина) LdapUserDetailsImpl содержит следующие свойства и значениеSpring Security 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 спасибо для ссылки. Я понимаю, что нам нужно написать или реализовать реализацию, но я думал, если у нас будет более простой способ. В любом случае я реализовал свой контекстный mapper и добавил его в качестве ответа. Это правильный способ? – Mukun

ответ

0

My Custom Mapper. Это правильный способ?

@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

Вы можете просто получить Оп от Принципала и извлечь имя (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 и Novell возможно тоже.

Так полный ответ был бы:

@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; 
    } 
} 
Смежные вопросы