ldap java_使用LDAP保护Java EE6中的Web应用程序

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领域。

创建新的LDAP领域

创建新的LDAP领域

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

Glassfish Web应用程序LDAP领域

Glassfish Web应用程序LDAP领域

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

SampleWebApp目录

SampleWebApp目录

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

JEE登录和身份验证

JEE登录和身份验证

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

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

Netbeans IDE中的SampleWebApp

Netbeans IDE中的SampleWebApp

SampleWebApp配置

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>

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

  • SampleWebApp代码下载

参考:来自Idiotechie博客的JCG合作伙伴 Mainak Goswami的使用LDAP的Java EE6安全Web应用程序 。

翻译自: https://www.javacodegeeks.com/2013/05/secure-web-application-in-java-ee6-using-ldap.html

ldap java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 一致性hash_一致性hash算法在分表分库中的应用

一致性hash算法结构图 分表分库结构图 可进行循环冗余存储&#xff0c;顺时针存储到下一个物理节点(非虚拟节点)package com.haiziwang.platform.kmcsms.route.algorithm;import java.util.Collection;import java.util.SortedMap;import java.util.TreeMap;/*** 一致性Hash算法…

生产中的性能分析

生产中的性能分析 如果您在Java应用程序的性能方面遇到了一些严重问题&#xff0c;那么很可能您会知道线程分析的价值。 但是您知道应该使用哪个分析器吗&#xff1f; 探查器使用两种基本技术-采样和仪器。 采样分析器 采样探查器包括定期向JVM询问所有当前活动线程的当前执行…

mysql用com_MySQL 使用教程

关于 MySQLMySQL 是最流行的开源数据库。本文简明的讲解了 MySQL 如何下载安装到使用的整个过程。MySQL 支持多种特性&#xff1a;使用 C和 C编写&#xff0c;并使用了多种编译器进行测试&#xff0c;保证了源代码的可移植性。支持 AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell…

c++ 一维数组长度_每天一点C / 一维数组和指针

哈喽&#xff0c;我是老吴&#xff0c;继续记录我的学习心得。每天一点系列是我对微习惯的践行。现在能做到每天一点 C&#xff0c;将来就会有更多的每天一点系列&#xff0c;没人规定嵌入式软件工程师就只能学习 C 语言和折腾 Linux&#xff0c;不要给自己设限。为什么是每天一…

设计模式 工厂方法_工厂设计模式–一种有效的方法

设计模式 工厂方法如您所知&#xff0c;“工厂方法模式”或俗称“工厂设计模式”是“创意设计模式”类别下的一种设计模式。 模式背后的基本原理是&#xff0c;在运行时&#xff0c;我们根据传递的参数获得类似类型的对象。 关于这种模式的文章很多&#xff0c;开发人员可以通过…

SMPP Java示例(客户端)

这篇文章通过创建一个简单的SMPP客户端向移动用户发送短信来提供SMPP Java示例&#xff0c;使用该客户端我们可以简单地提交以向单个移动用户发送消息&#xff0c;也可以一次将消息广播给多个移动用户。另外&#xff0c;我们将验证交货收据。 出于客户端的目的&#xff0c;我们…

mysql插入另一个表中数据_MySql中把一个表的数据插入到另一个表中的实现

1.如果2张表的字段一致&#xff0c;并且希望插入全部数据&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目标表 SELECT * FROM 来源表;insert into insertTest select * from insertTest2;2.如果只希望导入指定字段&#xff0c;可以用这种方法&#xff1a;INSERT INTO 目…

mysql事务中怎么更改空值_MySQL事务

1.事务1.事务特性--ACIDAtomicity(原子性):要么全做,要么不做,不能只做一半(银行转账)Consistency(约束性):事务的前后,约束都能满足Isolation(依赖性):事务之间是独立的,互不影响的Durability(持久性):事务执行之后,事物的结果可以持久保存2.事务隔离级别:read uncommitted:可…

mysql自定义函数多参数_自定义mysql函数 - 无法传递参数

作为标题状态。这里的功能DELIMITER //CREATE FUNCTION GetCreateValue( table_name CHAR(64), id_field CHAR(64), name_field CHAR(64), name_value CHAR(64) )RETURNS INTEGERBEGINDECLARE ret INTEGER;SELECT count(*) INTO ret FROM table_name WHERE name_field name_va…

与Zapier集成

整合很无聊。 也是不可避免的。 但是我不会写有关企业集成模式的文章 。 相反&#xff0c;我将解释如何创建与Zapier集成的应用程序。 什么是Zapier &#xff1f; 它是一项服务&#xff0c;使您可以通过其API&#xff08;或协议&#xff09;连接两个&#xff08;或多个&#x…

python用psf函数_python学习之-类的内置函数

内置方法&#xff1a;__str__(该方法必须返回字符串类型),在对像被打印时自动触发,然后将该方法的返回值当做打印结果输出)class People:def __init__(self,name,age):self.namenameself.ageagedef __str__(self): #绑定给对象的方法return ‘‘ %(self.name,self.age) #这个方…

多用户远程连接mysql_Mysql权限控制 - 允许用户远程连接

Mysql为了安全性&#xff0c;在默认情况下用户只允许在本地登录&#xff0c;可是在有此情况下&#xff0c;还是需要使用用户进行远程连接&#xff0c;因此为了使其可以远程需要进行如下操作&#xff1a;一、允许root用户在任何地方进行远程登录&#xff0c;并具有所有库任何操作…

cxf 服务端soap报文_使用Apache CXF开发SOAP Web服务

cxf 服务端soap报文在上一篇文章中&#xff0c;我逐步介绍了使用apache CXF开发简单的RESTFull服务的步骤。 在本文中&#xff0c;我将讨论使用CXF开发SOAP Web服务。 在继续前进之前&#xff0c;让我们先了解一下构成SOAP Web服务的概念/元素 SOAP或简单对象访问协议 SOAP是一…

Java 8日期和时间

如今&#xff0c;一些应用程序仍在使用java.util.Date和java.util.Calendar API&#xff0c;包括使我们的生活更轻松地使用这些类型的库&#xff0c;例如JodaTime。 但是&#xff0c;Java 8引入了新的API来处理日期和时间&#xff0c;这使我们可以对日期和时间表示进行更精细的…

php mysql 随机字符串_MySQL_Mysql 自定义随机字符串的实现方法,前几天在开发一个系统,需要 - phpStudy...

Mysql 自定义随机字符串的实现方法前几天在开发一个系统&#xff0c;需要用到随机字符串&#xff0c;但是mysql的库函数有没有直接提供&#xff0c;就简单的利用现有的函数东拼西凑出随机字符串来.下面简单的说下实现当时.1.简单粗暴.select ..., substring(MD5(RAND()),floor(…

python哪些类型可以作为迭代器_python0.8-----set类型与迭代器

set:类似dict&#xff0c;是一组dict的集合&#xff0c;不存储value。本质&#xff1a;无序(没有下标)无重复的元素的集合。创建&#xff1a;创建set需要一个list或者tuple或者dict作为输入集合。重复元素在色中会被自动过滤。s1[1,2,3,4,5,6,1,2]set(s1){1,2,3,4,5,6} --表示》…

线程池实现填充短信_填充一个池需要多少个线程?

线程池实现填充短信在最近几个月中&#xff0c;我们一直看到很小但持续的操作失败&#xff0c;但有一个奇怪的异常– org.springframework.jdbc.CannotGetJdbcConnectionException –“无法获得JDBC连接&#xff1b; 嵌套异常是java.sql.SQLException&#xff1a;客户端尝试检出…

python线性回归x可以数量不一样吗_R和Python中的线性回归 - 在同一问题上的结果不同...

只是指出这一点&#xff1a; statsmodel s least squares fit does by default not include a constant. If we remove the constant from R适合&#xff0c;我们得到与Python实现非常相似的结果&#xff0c;或者相反&#xff0c;如果我们向 statsmodel -fit添加一个常量&#…

PostgreSQL开放自由

Open Liberty是源自WebSphere Liberty的有趣的新型OSS Java EE应用服务器。 您可以将Open Liberty配置为使用PostgreSQL作为其默认数据源&#xff0c;如下所示&#xff1a; 将<datasource> &#xff0c; <jdbcDriver>和<library>指令添加到server.xml配置中…

实现mysql百度式查询_mysql查询优化建议(百度)

1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中使用!或<>操作符&#xff0c;否则将引擎放弃使用索引而进行全表扫描。3.应尽量避免在 where 子句中对字段进行 null 值判断…