2014-06-22 75 views
0

是否可以爲用戶提供使用其普通用戶名或其替代方式登錄的功能?Spring Security的用戶名別名

我需要該功能的原因如下。我們使用電子郵件作爲用戶名(客戶的要求),對於同一用戶,這兩個電子郵件地址的有效期爲[email protected][email protected]。其中一些曾經使用第一種符號,其他的則是第二種。

用戶正在通過LDAP進行身份驗證,這對我而言是隻讀的,所以我不能只在用戶記錄中添加第二個郵件屬性。請有任何想法嗎?

回答

1

我結束的解決方案是基於這個答案: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。如果你不喜歡後者的「獎勵行爲」,你也可以添加一張支票。

相關問題