Spring Security的用户名别名

时间:2014-06-22 23:09:25

标签: email spring-security ldap alias username

是否可以为用户提供使用普通用户名或其替代方式登录的功能?

我需要该功能的原因如下。我们使用电子邮件作为用户名(客户要求),对于同一用户,它们都有效user@mail.domain.comuser@domain.com。他们中的一些人习惯使用第一种符号,其他人则使用第二种符号。

用户正在通过LDAP进行身份验证,这对我来说是只读的,所以我不能只为用户记录添加第二个邮件属性。有什么想法吗?

1 个答案:

答案 0 :(得分: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;
        }
    }
}

在这种情况下,我们应该在{/ 1}} 之前注册我们的过滤器 Spring Security过滤器:

web.xml

完成触摸是将LDAP搜索过滤器中的<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> 更改为(mail={0})

(mail={0}@*)

请注意,解决方案的副作用是Spring Security用户名将不再包含<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> 后缀,因此您需要在需要显示电子邮件时手动添加它。但是,你应该决定哪一个是主要的。

您还应注意,过滤器不会影响包含其他域后缀的用户名,或者根本不具有后缀。这是为了目的,你可以添加一个简单的检查。

现在,用户可以@domainuser@mail.domain.com甚至user@domain.com登录。如果您不喜欢后者的“奖励行为”,您还可以添加支票。