我们如何使用spring security Ldap作为客户端进行身份验证

时间:2015-07-03 13:08:29

标签: angularjs spring spring-mvc authentication spring-security

我使用spring-mvc和angularjs创建了一个应用程序。对于身份验证,我在数据库中创建了一个表,我正在匹配用户输入数据库中的用户。但现在我想使用LDAP进行身份验证。有人可以帮我解决如何使用angularjs进行LDAP身份验证。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我在我的应用程序中使用了Spring MVC和AngularJs的LDAP身份验证,这是我提出的......

securityContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:sec="http://www.springframework.org/schema/security"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans     http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/security  http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <bean id="contextSource"
          class="org.springframework.ldap.core.support.LdapContextSource">
        <property name="anonymousReadOnly" value="false"/>
        <property name="password" value="${ldap.password}"/>
        <property name="pooled" value="false"/>
        <property name="userDn" value="${ldap.userdn}"/>
        <property name="base" value="${ldap.base}"/>
        <property name="referral" value="follow"/>
        <property name="urls">
            <list>
                <value>${ldap.url}</value>
            </list>
        </property>
    </bean>

    <bean id="entryPoint" class="com.company.ldap.UserAuthenticationEntryPoint"/>

    <bean id="logoutSuccessHandler" class="com.company.ldap.LdapLogoutSuccessHandler"/>

    <bean id="userDetailsContextMapper" class="com.company.ldap.LdapUserDetailsContextMapper"/>

    <bean id="authenticationSuccessHandler" class="com.company.ldap.LdapAuthenticationSuccessHandler"/>

    <bean id="authenticationFailureHandler" class="com.company.ldap.LdapAuthenticationFailureHandler"/>

    <sec:http use-expressions="true"
              auto-config="false"
              create-session="never"
              entry-point-ref="entryPoint"
              authentication-manager-ref="authenticationManager">

        <sec:form-login
                login-processing-url="/login"
                authentication-success-handler-ref="authenticationSuccessHandler"
                authentication-failure-handler-ref="authenticationFailureHandler"
                username-parameter="username"
                password-parameter="password"
                login-page="/"/>

        <sec:intercept-url pattern="/" access="permitAll"/>
        <sec:intercept-url pattern="/secure/**" access="isAuthenticated()"/>

        <sec:logout invalidate-session="true"
                    delete-cookies="JSESSIONID"
                    logout-url="/secure/logout"
                    success-handler-ref="logoutSuccessHandler"/>

        <sec:csrf disabled="true"/>
        <sec:headers disabled="true"/>

    </sec:http>

    <sec:authentication-manager id="authenticationManager">
        <sec:ldap-authentication-provider user-search-filter="${ldap.search.filter}"
                                          user-context-mapper-ref="userDetailsContextMapper"/>
    </sec:authentication-manager>

</beans>

首先,您需要做的是定义LdapContextSource并设置所有认可值,例如我看起来如下:

ldap.url=ldap://ldap-host:389/
ldap.userdn=cn=some-cn,cn=Users,dc=dcname,dc=net
ldap.password=*******
ldap.base=ou=Users,ou=City,ou=Company,dc=dcname,dc=net
ldap.search.filter=sAMAccountName={0}

然后我必须创建几个类来处理成功登录,成功注销,用户映射等。

例如我的身份验证成功处理程序:

public class LdapAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        RequestDispatcher dispatcher = request.getRequestDispatcher("/secure/user");
        dispatcher.forward(request, response);
    }
}

成功进行身份验证后,只需将请求转发给"/secure/user"此网址即可。在那里,我为此路径配置了Spring控制器方法,以返回一些用户详细信息。

您还可能需要一个EntryPoint来处理错误,而UserContextMapper可以从Ldap获取一些用户详细信息。这取决于您如何实施AuthenticationEntryPointLdapUserDetailsMapper

其他配置没有什么特别之处,只是简单的form-login和禁用的CSRF以及其他安全标头,因为我的应用程序并不需要它们。

请注意,从Spring Security 4.0.0开始,如果您不需要它们,则必须自行禁用这些标头,因为默认情况下它们在所有先前版本中都已启用,默认情况下,它们已被禁用。

希望这有帮助。