是否可以爲用戶提供使用其普通用戶名或其替代方式登錄的功能?Spring Security的用戶名別名
我需要該功能的原因如下。我們使用電子郵件作爲用戶名(客戶的要求),對於同一用戶,這兩個電子郵件地址的有效期爲[email protected]
和[email protected]
。其中一些曾經使用第一種符號,其他的則是第二種。
用戶正在通過LDAP
進行身份驗證,這對我而言是隻讀的,所以我不能只在用戶記錄中添加第二個郵件屬性。請有任何想法嗎?
是否可以爲用戶提供使用其普通用戶名或其替代方式登錄的功能?Spring Security的用戶名別名
我需要該功能的原因如下。我們使用電子郵件作爲用戶名(客戶的要求),對於同一用戶,這兩個電子郵件地址的有效期爲[email protected]
和[email protected]
。其中一些曾經使用第一種符號,其他的則是第二種。
用戶正在通過LDAP
進行身份驗證,這對我而言是隻讀的,所以我不能只在用戶記錄中添加第二個郵件屬性。請有任何想法嗎?
我結束的解決方案是基於這個答案:https://stackoverflow.com/a/1422202/711031。我用下面的FilteredRequest
實現:
public class LoginDomainCutFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(new FilteredRequest(request), response);
}
private static class FilteredRequest extends HttpServletRequestWrapper {
public FilteredRequest(ServletRequest request) {
super((HttpServletRequest) request);
}
public String getParameter(String paramName) {
String value = super.getParameter(paramName);
if ("j_username".equals(paramName)) {
value = cutSuffix(value, "@mail.domain.com");
value = cutSuffix(value, "@domain.com");
}
return value;
}
private String cutSuffix(String value, String suffix) {
if (value.endsWith(suffix)) value = value.substring(0, value.length() - suffix.length());
return value;
}
}
}
在這種情況下,我們應該在web.xml
註冊我們的過濾器前的春季安全過濾器:
<filter>
<filter-name>loginDomainCutFilter</filter-name>
<filter-class>org.mydomain.myapp.LoginDomainCutFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginDomainCutFilter</filter-name>
<url-pattern>/j_spring_security_check</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
點睛之筆是在LDAP改變(mail={0})
到(mail={0}@*)
搜索過濾器:
<beans:bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<beans:constructor-arg index="0" value="ou=users,ou=myorgunit"/>
<beans:constructor-arg index="1" value="(mail={0}@*)"/>
<beans:constructor-arg index="2" ref="contextSource"/>
<beans:property name="searchSubtree" value="true"/>
</beans:bean>
請注意tha此解決方案的副作用是Spring Security用戶名將不再包含@domain
後綴,因此您需要在需要顯示電子郵件時手動添加它。但是,您應該決定哪一個是主要的。
您還應該注意,該過濾器不會影響包含其他域後綴的用戶名,或根本沒有後綴。這是爲了達到目的,你可以添加一個簡單的檢查。
現在用戶可以登錄爲[email protected]
,[email protected]
甚至user
。如果你不喜歡後者的「獎勵行爲」,你也可以添加一張支票。