如何使用 ldap 和 spring security 从登录的用户那里获取电子邮件

Posted

技术标签:

【中文标题】如何使用 ldap 和 spring security 从登录的用户那里获取电子邮件【英文标题】:How can i get email from a user who logged in , with ldap and spring security 【发布时间】:2017-09-22 06:59:05 【问题描述】:

嘿,我希望可以成功连接到 ldap 服务器并使用用户名和密码登录,但之后我想获取登录用户的电子邮件,我该怎么做?

@Controller
public class DemoController    
public MutationServices ms = new MutationServices();
@RequestMapping("login")
public String logout (ModelMap model)
    return "/login";


@RequestMapping("uploadFile")
public String uploadPage(ModelMap model)
    return "/upload";


@RequestMapping("utilisateurs")
public String getSimpleUserPage(ModelMap model)

Authenticationauth=SecurityContextHolder.getContext().getAuthentication();
    String username = auth.getName();

    @SuppressWarnings("unchecked")
    Collection<SimpleGrantedAuthority> authorities 
       (Collection<SimpleGrantedAuthority>) auth.getAuthorities();
    System.out.println("auth : " + authorities);
    model.addAttribute("username", username);
    return "/user";

这是我的春季安全

<http>
    <form-login login-page="/login"
        authentication-failure-url="/login"
    />

    <intercept-url pattern="/utilisateurs**" access="ROLE_USERS" />
    <logout logout-success-url="/index.jsp" />

    <http-basic />
</http>
<authentication-manager>
    <ldap-authentication-provider
        user-search-filter="(cn=0)" 
        user-search-base="dc=example,dc=com"
        group-search-filter="(member=0)"
        group-search-base="dc=example,dc=com"
        group-role-attribute="cn" 
        role-prefix="ROLE_">

    </ldap-authentication-provider>
</authentication-manager>

<ldap-server url="ldap://0.0.0.0:10389"
     manager-dn="uid=admin,dc=example,dc=com"  manager-password="admin"/>

【问题讨论】:

为什么要改变之前编辑的做法?你的代码看起来很乱。 好吧,因为我不得不,我也需要上传一个文件,我可以获取用户详细信息,但我无法在我拥有的 ldap 中获取电子邮件属性 @Controller public class DemoController 不是代码块的一部分,也不是最后一个。 还有一些改进的空间,但看起来更好:) 我建议将你的第一段Hey i want can succesfully connect to the ldap server and also login with a username and a password, but after that i want to get the email of the user who logged in, how can i do that? 改写成这样的内容:解释你的代码应该做什么,当前正在工作的内容,以及什么不工作。因为你现在的第一段是一个句子,我不知道你到底有什么问题:) 编辑确实让它更好看! 【参考方案1】:

假设您使用inetOrgPerson LDAP 架构。

为此 LDAP 模式定义 bean,这将在登录时检索电子邮件:

@Bean
public InetOrgPersonContextMapper userContextMapper() 
    return new InetOrgPersonContextMapper();

将 bean 引用添加到 LDAP 配置:

<ldap-authentication-provider
    user-search-filter="(cn=0)" 
    user-search-base="dc=example,dc=com"
    group-search-filter="(member=0)"
    group-search-base="dc=example,dc=com"
    group-role-attribute="cn" 
    role-prefix="ROLE_"
    user-context-mapper-ref="userContextMapper">

然后你可以像这样检索电子邮件:

 Authentication auth = SecurityContextHolder.getContext().getAuthentication();
 InetOrgPerson person = (InetOrgPerson)auth.getPrincipal();
 String email = person.getMail();

【讨论】:

以上是关于如何使用 ldap 和 spring security 从登录的用户那里获取电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Rest 和 Spring 安全性通过 ldap 登录 Angular?

如何使用带有 LDAP 的 Spring Security 获取用户信息

Spring 3,Spring Security,LDAP,如何向 LDAP 添加角色?

如何在 Spring 安全性中同时使用数据库和 LDAP 身份验证?

使用 Spring、Basic Auth 和 LDAP,如何获取提供的用户名?

如何将 Spring Security 从 ldap 更改为 ldap starttls