【问题标题】:Spring Security LDAP get User Given NameSpring Security LDAP获取用户名
【发布时间】:2017-12-24 03:48:44
【问题描述】:

我正在使用带有 Windows AD LDAP 的 Spring security 3.2.4。 我能够成功验证并填充 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 并拆分字符串以获取员工姓名。

【问题讨论】:

  • @KonstantinV.Salikhov 感谢您的链接。我知道我们需要编写或自己的实现,但我在想,如果我们有更简单的方法。我已经实现了我的上下文映射器并将其添加为答案的任何方式。这是正确的做法吗?

标签: spring spring-security-ldap


【解决方案1】:

您可以从 Principal 获取 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);

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我的自定义映射器。这是正确的做法吗?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-02
        • 2012-11-10
        • 2015-02-26
        • 2013-04-17
        • 1970-01-01
        • 2014-09-20
        • 2017-06-01
        • 2014-06-18
        相关资源
        最近更新 更多