我正在开发一个基于Spring MVC的Web应用程序,使用Spring Security允许用户使用他们的Active Directory凭据登录。我想在用户登录后获取其电子邮件地址。我已经使登录功能正常运行,并且现在正在尝试找出如何获取用户的电子邮件地址。看起来我应该从一个InetOrgPerson
对象中获取它。我已经尝试在XML配置文件中指定一个InetOrgPersonContextMapper
:
<bean id="ldapActiveDirectoryAuthProvider" class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider">
<constructor-arg name="domain" value="foo.bar" />
<constructor-arg name="url" value="ldap://foo.bar" />
<property name="useAuthenticationRequestCredentials" value="true" />
<property name="convertSubErrorCodesToExceptions" value="true" />
<property name="userDetailsContextMapper">
<bean class="org.springframework.security.ldap.userdetails.InetOrgPersonContextMapper" />
</property>
</bean>
我正在尝试在控制器中获取电子邮件,代码如下:
@RequestMapping(value = "/startProcess.html", method = RequestMethod.POST)
public ModelAndView startProcess(@ModelAttribute Token token, Principal principal)
{
ModelAndView mav = new ModelAndView();
String user = principal.getName();
String email = ((InetOrgPerson)principal).getMail();
logger.info("Got email \"" + email + "\" for user \"" + user + "\"");
...
}
这个问题导致了一个类转换异常,提示无法将UsernamePasswordAuthenticationToken
转换为InetOrgPerson
。我决定尝试手动获取Principal
对象,而不是让Spring注入它:
@RequestMapping(value = "/startProcess.html", method = RequestMethod.POST)
public ModelAndView startProcess(@ModelAttribute Token token, Principal principal)
{
ModelAndView mav = new ModelAndView();
String user = principal.getName();
Object p = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
String email = ((InetOrgPerson)p).getMail();
logger.info("Got email \"" + email + "\" for user \"" + user + "\"");
...
}
这告诉我它不能将LdapUserDetailsImpl
转换为InetOrgPerson
。既然我使用了InetOrgPersonContextMapper
,那么LdapUserDetailsImpl
不应该是一个InetOrgPerson
吗?
getCredentials()
的结果是一个字符串,即用户名。但您的实现不是这样吗?如果是这样,那么您需要直接查询Active Directory以获取该用户名对应人员的电子邮件地址。 - Bob DalgleishgetPrincipal()
。 - JDiPierrogetPrincipal()
返回的是一个字符串。你不能有效地将该字符串用作InetOrgPerson
。 - Bob Dalgleish