在上一篇文章中,我们解释了如何在通过传输层安全性(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领域。
根据为LDAP服务器完成的配置添加配置设置。
JAAS上下文–标识符,将在应用程序模块中用于与LDAP服务器连接。 (例如ldapRealm)
目录– LDAP服务器URL路径(例如ldap:// localhost:389)
基本DN:LDAP目录中的专有名称,用于标识用户数据的位置。 将JEE安全性应用于Web应用程序 按照以下结构创建示例Web应用程序:
基于表单的身份验证机制将用于用户身份验证。
让我们借助上图和代码来解释整个过程。
在Netbeans IDE中设置一个示例Web应用程序。
步骤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存储库中存储的用户名和密码对用户进行身份验证。
第四步:
如果身份验证成功,则将安全资源(在本例中为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>
您可以从以下链接下载完整的工作代码:
- SampleWebApp代码下载
翻译自: https://www.javacodegeeks.com/2013/05/secure-web-application-in-java-ee6-using-ldap.html