ldap java






在上一篇文章中,我们解释了如何在通过传输层安全性(TLS)/安全套接字层(SSL)传输数据时保护数据。 现在让我们尝试了解如何为使用LDAP服务器进行身份验证的基于JEE 6的Web应用程序应用安全机制。

目的:

•在JEE应用服务器中配置LDAP领域
•将JEE安全性应用于示例Web应用程序。

使用的产品:

  • IDE:Netbeans 7.2
  • Java开发工具包(JDK):版本6
  • Glassfish服务器:3.1
  • 身份验证机制:基于表单的身份验证
  • 验证服务器:LDAP OpenDS v2.2

将JEE安全性应用于示例Web应用程序:

可以通过声明性安全性或程序性安全性来保护JEE Web应用程序。

声明式安全性可以通过使用批注或通过部署描述符在JEE应用程序中实现。 如果角色和身份验证过程很简单,并且可以利用现有的安全提供程序(甚至包括LDAP,Kerberos之类的外部安全提供程序),则可以使用这种类型的安全性机制。

当声明性安全对于上下文中的应用程序来说不够时, 程序安全性提供了附加的安全性机制。 当我们需要定制的安全性并需要丰富的角色集时,需要使用它。

在Glassfish应用程序服务器中配置领域

在我们在Glassfish应用程序服务器中配置领域之前,您需要安装和配置将用于项目的LDAP服务器。 您可以在以下文章中获得完整的说明:“ 如何安装和配置LDAP服务器 ”。
安装成功后,启动您的Glassfish服务器并转到管理控制台。 创建一个新的LDAP领域。



java连接ldap认证 ldap java_tomcat

创建新的LDAP领域



根据为LDAP服务器完成的配置添加配置设置。



java连接ldap认证 ldap java_python_02

Glassfish Web应用程序LDAP领域



JAAS上下文–标识符,将在应用程序模块中用于与LDAP服务器连接。 (例如ldapRealm)
目录– LDAP服务器URL路径(例如ldap:// localhost:389)
基本DN:LDAP目录中的专有名称,用于标识用户数据的位置。 将JEE安全性应用于Web应用程序 按照以下结构创建示例Web应用程序:



java连接ldap认证 ldap java_python_03

SampleWebApp目录



基于表单的身份验证机制将用于用户身份验证。



java连接ldap认证 ldap java_spring_04

JEE登录和身份验证



让我们借助上面的图和代码来解释整个过程。

在Netbeans IDE中设置一个示例Web应用程序。



java连接ldap认证 ldap java_spring_05

Netbeans IDE中的SampleWebApp



java连接ldap认证 ldap java_java_06

SampleWebApp配置



第1步:

如上图所示,客户端浏览器尝试从http:// {samplewebsite.com} / {contextroot} /index.jsp网站请求受保护的资源。 Web服务器进入Web配置文件,并确定请求的资源受到保护。

web.xml

<security-constraint>
        <display-name>SecurityConstraint</display-name>
        <web-resource-collection>
            <web-resource-name>Secured resources</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>GeneralUser</role-name>
            <role-name>Administrator</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
</security-constraint>

第2步:

Web服务器将Login.jsp作为基于表单的身份验证机制的一部分提供给客户端。 这些配置是从Web配置文件中检查的。

web.xml

<login-config>
        <auth-method>FORM</auth-method>
        <realm-name>ldapRealm</realm-name>
        <form-login-config>
            <form-login-page>/Login.jsp</form-login-page>
            <form-error-page>/LoginError.jsp</form-error-page>
        </form-login-config>
</login-config>

第三步:

客户端将登录表单提交到Web服务器。 当服务器发现表单操作为“ j_security_check”时,它将处理请求以认证客户端的凭据。 jsp表单必须包含登录元素j_username和j_password,这将允许Web服务器调用登录身份验证机制。

Login.jsp

<form action="j_security_check" method=post>
            <p>username: <input type="text" name="j_username"></p>
            <p>password: <input type="password" name="j_password"></p>
            <input type="submit" value="submit">
            <input type="reset" value="Reset"> 
</form>

由于在登录配置中使用了LDAP领域,因此在处理请求时,Web服务器会将身份验证请求发送到LDAP服务器。 LDAP服务器将根据LDAP存储库中存储的用户名和密码对用户进行身份验证。

第4步:

如果身份验证成功,则将安全资源(在本例中为index.jsp)返回给客户端,并且容器使用会话ID来标识客户端的登录会话。 容器使用包含会话ID的cookie维护登录会话。 服务器将此Cookie发送回客户端,并且只要客户端能够为后续请求显示此Cookie,容器就可以轻松识别客户端并因此维护该客户端的会话。

步骤5:

仅当身份验证失败时,才会按照web.xml中的配置将用户重定向到LoginError.jsp。

<form-error-page>/LoginError.jsp</form-error-page>

这显示了如何将基于表单的安全认证应用于示例Web应用程序。 现在让我们简要了解一下用于该项目的安全资源。 在此项目中,受保护的资源是index.jsp,它接受用户名并将请求转发到LoginServlet。 登录Servlet将请求分派到Success.jsp,然后将用户名打印到客户端。

index.jsp

<body>
        <h2>Please type your name</h2>
        <form method="POST" action="LoginServlet">
            <input type="text" name="username" size="25">
            <p></p>
            <input type="submit" value="Submit">
            <input type="reset" value="Reset">
        </form>
 </body>

LoginServlet.java

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            RequestDispatcher requestDispatcher = getServletConfig().getServletContext().
                    getRequestDispatcher("/Success.jsp");
            requestDispatcher.forward(request, response);
        } finally {
            out.close();
        }
    }

Success.jsp

<body>
        <h1>You have been successfully logged in as ${param.username}</h1>
</body>

Web.xml

<servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.login.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/LoginServlet</url-pattern>
 </servlet-mapping>

您可以从以下链接下载完整的工作代码: