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

Posted

技术标签:

【中文标题】我们如何使用 spring security Ldap 以 angularjs 作为客户端进行身份验证【英文标题】:How can we use spring security Ldap for authenticating with angularjs as client side 【发布时间】:2015-09-21 08:16:53 【问题描述】:

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

提前致谢。

【问题讨论】:

您是否查看过有关 ldap 身份验证的 spring 文档-docs.spring.io/spring-ldap/docs/current/reference?甚至本指南 - spring.io/guides/gs/authenticating-ldap ? 【参考方案1】:

我在我的应用程序中使用了 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"这个URL。我为该路径配置了 Spring 控制器的方法以返回一些用户详细信息。

您可能还需要一个 EntryPoint 来处理错误,并使用 UserContextMapper 从 Ldap 获取一些用户详细信息。这取决于您如何实现AuthenticationEntryPoint 和LdapUserDetailsMapper

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

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

希望这会有所帮助。

【讨论】:

我是否必须在客户端添加/进行任何更改,以便我的客户端控制器可以知道它需要检查服务器端编写的代码?此外,在我的应用程序中,我使用引导程序的模式服务登录页面,因此在我的应用程序中 /login 不会在 url 中生成。是否需要在 url 中生成登录链接,或者我们可以通过 bootstrap 的模态服务使用相同的设置进行身份验证。 是否可以在这里添加身份验证入口点代码和 ldapuserdetailsmapper 代码,我是 java spring 中的新手。

以上是关于我们如何使用 spring security Ldap 以 angularjs 作为客户端进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

我们如何使用带有 Spring 5.0 的最新 spring-security-oauth2 jar 来实现授权服务器?

如何在 spring-security 5.2 中增加 RemoteJWKSet 缓存 TTL

如何使用带有多个过滤器和 Spring Security 的 Spring DelegatingFilterProxy?

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

如何使用 Spring Session + Spring security xml 配置和多重安全过滤器

如何允许使用 Spring Security 访问特定的 React 哈希路由?