Spring Security LDAP получает имя пользователя

Я использую Spring Security 3.2.4 с Windows AD LDAP. Я могу успешно пройти аутентификацию, и LdapUserDetailsImpl заполнен. Из LdapUserDetailsImpl я могу получить имя пользователя, полномочия, но как получить имя сотрудника (а не имя пользователя для входа) LdapUserDetailsImpl содержит следующие свойства и значения

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

Как получить имя сотрудника, нужно ли мне расширить какой-то класс и написать собственное сопоставление, или может быть просто получить Dn от принципала и разделить строку, чтобы получить имя сотрудника.


person Mukun    schedule 26.12.2014    source источник
comment
forum.spring.io/forum/spring-projects/ безопасность/   -  person Konstantin V. Salikhov    schedule 26.12.2014
comment
@KonstantinV.Salikhov спасибо за ссылку. Я понимаю, что нам нужно написать или собственную реализацию, но я думал, если у нас есть более простой способ. В любом случае я реализовал свой преобразователь контекста и добавил его в качестве ответа. Это правильный способ сделать?   -  person Mukun    schedule 26.12.2014


Ответы (3)


Вы можете просто получить 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);
person Harshad Ranganathan    schedule 22.01.2015

У @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;
    }
}
person Steve Williams    schedule 23.12.2017

Мой пользовательский картограф. Это правильный способ сделать?

 @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;
        }

    }
person Mukun    schedule 26.12.2014