更新5/28/2019
我正在使用ActiveDirectoryLdapAuthenticationProvider
中的org.springframework.security.ldap.authentication.ad
,并且searchForUser
方法可以通过电子邮件找到用户。
我使用的是默认的searchFilter
:(&(objectClass=user)(userPrincipalName={0}))
。
但是如果将networkID作为用户名提供,则无法使用。所以:
employee@PublicCompanyEmail.com
工作正常
employee_AD_username@internaldomain.com
不起作用
赞赏任何想法!
答案 0 :(得分:1)
Har har,您遇到了eUPN与iUPN问题。您的公司使用UPN后缀,该后缀为userPrincipalName
字段中存储的每个用户创建一个具有虚拟企业UPN的虚拟域。一旦隐式UPN(Kerberos主体)被企业级UPN覆盖,您就不走运了。
您可能需要考虑的事情比一遍又一遍地用用户名和密码来困扰用户...至少在Tomcat上,如果您可以使用<security:jee>
在Spring Security中,则可以拥有this。
答案 1 :(得分:0)
首先使用一些术语
安全帐户管理器(SAM)名称
The networkID you use to login to the network.
用户主体名称(UPN)
It may be Implicit UPN (iUPN) or Explicit UPN (eUPN).
An example for iUPN would be: networkID@internalDomain.com
An example for eUPN would be: employee_name@companyName.com
eUPN may be defined by network administrator.
In my case, the UPN we're using in our AD is actually an eUPN.
搜索过滤器语法
This is query language for AD.
We used it to define the filter while searching for objects in AD.
{0}-occurrence means full username with domain in it. If the domain is defined in LDAP configuration then Spring Security checks if it's present in the entered username to login. If not, then it'll be added.
{1}-occurrence means whatever entered as username. So, Spring won't do any modification on the provided username.
如果您希望能够在不提供域名的情况下登录,则需要在LDAP配置中定义域
ActiveDirectoryLdapAuthenticationProvider provider = new ActiveDirectoryLdapAuthenticationProvider(
"domain",...);
然后,如果这是电子邮件地址中使用的域,则使用此过滤器:
(&(objectClass=user)(userPrincipalName={0}))
将找到具有和不具有域名的用户。
然后,如果配置的域是内部域,则使用此过滤器:
(&(objectClass=user)(sAMAccountName={1}))
如果提供的用户名是不带doamin的networkID,则会找到用户。
如果您没有为LDAP配置定义域,并且在实例化对象时将其保留为空,那么您应该能够同时搜索UPN和sam -account并出现{1},但是您必须提供用于登录时同时输入networkID和电子邮件用户名。