Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一,而Active Directory (Microsoft针对Windows的LDAP实现)是另一种广泛使用的LDAP服务器。 在许多项目中,我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身份验证 。 有时,由于实现和集成过程中会遇到各种问题, 并且没有进行LDAP身份验证的标准方法,因此此简单任务会变得棘手。 Java提供了LDAP支持,但是在本文中,我将主要讨论spring安全性,因为它是我首选的Java框架,用于进行身份验证,授权和安全性相关的工作。

我们可以通过编写用于执行LDAP搜索然后进行LDAP绑定的自有程序来在Java中执行相同的操作,但是正如我所说的,当您使用Spring Security进行LDAP身份验证时,它更容易,更简洁。

除了LDAP支持外,Spring Security还提供了企业Java应用程序所需的其他一些功能,包括SSL安全性,密码加密和会话超时功能。

1. LDAP认证基础

在深入了解Active Directory上的LDAP身份验证之前,让我们熟悉一些LDAP术语,因为大多数时候用户是第一次使用它,并且他们对典型的LDAP词汇表(例如Dn,Ou,Bind或search等)不太熟悉。
Dn –专有名称 ,唯一名称,用于在LDAP服务器(例如Microsoft Active Directory)中查找用户。
OU –组织单位 绑定– LDAP绑定是一种操作,其中LDAP客户端将bindRequest发送给包括用户名和密码在内的LDAP用户,如果LDAP服务器能够正确找到用户名和密码,则它允许访问LDAP服务器。 搜索– LDAP搜索是通过使用某些用户凭证来检索用户的Dn的操作。 – LDAP目录的顶部元素,例如树的根。 BaseDn – LDAP树中的一个分支,可用作LDAP搜索操作的基础,例如dc = Microsoft,dc = org

如果您想了解有关LDAP的更多信息,请查看此链接,其中包含有关LDAP的详细信息。

2. Active Directory Spring Security中的LDAP身份验证

在Spring安全性中,有两种方法可以使用LDAP协议来实现活动目录身份验证,第一种是编程和声明性方法,需要一些编码和一些配置。

另一方面,第二种方法是Spring Security提供的即用型解决方案,只需要配置ActireDirectoryAuthenticationProvider即可完成。 我们将看到两种方法,但是我建议使用第二种方法,因为第二种方法简单易用。

2.1在Spring Security中使用LDAP进行Active Directory身份验证-示例1

组态
将以下配置添加到您的spring application-context.xml文件中,我建议将此配置与其他与安全相关的内容一起放在单独的application-context-security.XML文件中。
1)配置LDAP服务器 为了配置LDAP服务器,请将以下XML代码段放入Spring安全配置文件中:

<s:ldap-server url="ldap://stockmarket.com"   //ldap urlport="389"                    //ldap portmanager-dn="serviceAcctount@sotckmarket.com" //manager usernamemanager-password="AD83DgsSe"                 //manager password
/>

此配置是不言自明的,但是有关管理器dn和密码, 活动目录或任何其他LDAP目录上的LDAP身份验证的简短说明仅需两步,首先需要执行LDAP搜索以找到用户的Dn(专有名称),然后进行LDAP搜索。然后此Dn用于执行LDAP绑定。

如果绑定成功,则用户身份验证成功,否则它将失败。 有些人比LDAP绑定更喜欢密码的远程比较 ,但是LDAP绑定是您最不希望做的事情。

Active Directory的大部分内容都不允许匿名搜索操作,因此要执行LDAP搜索,您的服务必须具有LDAP帐户,这是我们在此提供的manager-in和manager-password.property。
Summary中 ,现在将通过以下步骤完成LDAP登录:

  1. 您的服务或应用程序使用manager-dn和manager-password将自身与LDAP绑定。
  2. LDAP搜索用户以找到UserDn
  3. 使用UserDn进行LDAP绑定

到此完成了LDAP登录部分。 现在,让我们进入配置LDAP身份验证提供程序的下一部分。
2)配置LDAP身份验证提供程序
本节在spring-security中指定了各种身份验证提供程序,在这里您可以看到LDAP身份验证提供程序,并且我们使用userPrincipalName在Microsoft Active目录中搜索用户。

<s:authentication-manager erase-credentials="true">
<s:ldap-authentication-provideruser-search-base="dc=stockmarketindia,dc=trader"user-search-filter="userPrincipalName={0}"
/><s:authentication-provider ref="springOutOfBoxActiveDirecotryAuthenticationProvider"/>
</s:authentication-manager>

现在需要一小段编码来传递userPrincipalName并验证用户。

public boolean login(String username, String password) {AndFilter filter = new AndFilter();ldapTemplate.setIgnorePartialResultException(true); // Active Directory doesn’t transparently handle referrals. This fixes that.filter.and(new EqualsFilter("userPrincipalName", username));return ldapTemplate.authenticate("dc=stockmarketindia,dc=trader", filter.toString(), password);}

第2行在该程序中非常重要,因为我整日都在弄清楚应用程序何时反复抛出javax.naming.PartialResultException:未处理的连续引用,您也可以将sAMAccountName用于搜索用户, userPrincipalNamesAMAccountName都是唯一的在Active Directory中。

这里最重要的是它必须是全名,例如name @ domain,例如jimmy@stockmarket.com。

authenticate()方法将根据绑定操作的结果返回true或false。

2.2在Spring Security中使用LDAP的Active Directory身份验证-更简单的示例

第二种方法更简单,更清洁,因为它是开箱即用的,您只需要配置LDAP服务器URL和域名即可使用,就像奶油一样。

<s:authentication-manager erase-credentials="true"><s:authentication-provider ref="ldapActiveDirectoryAuthProvider"/>
</s:authentication-manager><bean id="ldapActiveDirectoryAuthProvider" 
class="org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider"><constructor-arg value="stockmarket.com" />  //your domain<constructor-arg value="ldap://stockmarket.com/" />  //ldap url
</bean>

就这样,完成了。 此配置将对LDAP进行身份验证并加载所有授予的权限 ,就像您所属的组一样。 这也与spring安全登录元素集成在一起。

2.3依赖

这个示例基于spring security 3.0,我使用的是spring-ldap-1.3.1.RELEASE-all.jar和spring-security-ldap-3.1.0.RC3.jar。

如果您不知道如何下载Spring框架JAR文件,请按照此Spring Framework JAR下载指南中给出的步骤进行操作,该指南说明了如何从Maven Central下载Spring框架和其他相关JAR。

2.4 LDAP身份验证期间的错误

您需要非常幸运地完成针对Active Directory的LDAP身份验证而没有任何错误或异常,在这里,我列出了我遇到的一些常见错误及其解决方案,以便快速参考。
1)javax.naming.PartialResultException:未处理的连续引用; 剩余名称'dc = company,dc = com'
发生此错误是因为Microsoft Active Directory无法正确处理引用,并且要解决此问题,请设置此属性

ldapTemplate.setIgnorePartialResultException(true);

2)javax.naming.NameNotFoundException:[LDAP:错误代码32 – No Such Object]; 剩余的名字”
该错误经过反复尝试后得以解决,并且主要是由于用户名格式无效造成的 。 它通过提供全名来解决,例如jemmy@stockmarket.com

2.5工具

LDAP浏览器 :最好使用一些工具来查看LDAP目录中的数据,它可以为您提供一些可见性以及浏览LDAP中数据的方法。

它被称为LDAP浏览器,网络上有很多开源的LDAP浏览器,例如jexplorer。 您可以使用LDAP浏览器浏览和查看Active Directory中的数据。

2.6通过SSL的LDAP Active Directory身份验证

这非常适合对Microsoft活动目录实施LDAP身份验证。 但是您可能要引起注意的一件事是,使用LDAP用户名和密码以明文形式传输到LDAP服务器,并且有权访问LDAP流量的任何人都可以嗅探用户凭据,因此并不安全。

一种解决方案是使用LDAP(基于SSL的LDAP)协议,该协议将加密LDAP客户端和服务器之间的流量。

在spring-security中,这很容易做到,您需要更改的是URL而不是“ ldap://stockmarket.com/ ”,您需要使用“” ldaps://stockmarket.com/ 。 实际上, LDAP的端口是339 ,LDAPS 的端口 是636,但是第二种方法在Spring已得到注意,在第一种方法中,您需要提供此信息。

您可能会遇到的问题是“无法找到到所请求目标的有效认证路径”

异常如下图所示:

javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

此异常的原因很简单, 在SSL握手期间返回的证书 不由在您的JRE密钥中配置的任何受信任的证书颁发机构(CA) 签名,例如Verisign,Thwate,GoDaddy或entrust等。相反,服务器发送的证书是JRE不知道。

要解决此问题,您需要将Server返回的证书添加到JRE的密钥库中。 顺便说一句,如果您对密钥库和信任库感到困惑,那么请阅读我在Java中关于密钥库和信任库之间的区别的文章,以首先了解它。

2. 7我为解决问题所做的工作

毫不奇怪,我使用了一个名为InstallCert.java的开源程序,它仅与您的LDAP服务器和端口一起运行,它将尝试使用SSL连接LDAP服务器,并首先抛出相同的“ PKIX路径构建失败” ,然后抛出LDAP服务器返回的证书。

然后它将要求您将证书添加到密钥库中,只需提供屏幕上显示的证书编号,然后将那些证书添加到C:\ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security文件夹中的“ jssecacerts ”中。 现在重新运行该程序,该错误必须消失,并且将打印:

"Loading KeyStore jssecacerts...Opening connection to stockmarket.com:636...Starting SSL handshake...No errors, the certificate is already trusted

我们已经完成了,现在,如果您尝试通过LDAPS进行身份验证,您将成功。

即使没有Spring安全性,也可以使用Java 对活动目录执行LDAP认证的其他方法。 但是我发现spring-security非常有用,因此请考虑将其用于您的安全性要求。 如果您在LDAP登录期间遇到任何问题,请告诉我,我们将尽力为您提供帮助。

翻译自: https://www.javacodegeeks.com/2018/04/2-ways-to-setup-ldap-active-directory-authentication-in-java-spring-security-example-tutorial.html

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

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

相关文章

【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解

引言 关于EsN0、EbN0与SNR三者关系的描述,在MATLAB帮助文档中搜索词条“AWGN Channel”有比较详细的描述,但有些细节没有讲清楚。 简单翻译解释一下,就是 SNR表示每个采样点的信号噪声比。EbN0表示每个比特能量与噪声功率谱密度的比值。EsN0表示每个符号能量与噪声功率谱密…

非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛

写在前面&#xff1a;①大佬勿在意&#xff0c;小打小闹&#xff01;②若不决参加与否&#xff0c;希望下文可以给你帮助&#xff08;仅限程序设计赛项&#xff09;。 文章目录一、个人真实情况二、比赛最细简介三、最全参赛准备四、比赛时候遇到不会做怎么办&#xff1f;一、个…

加密数据的检索_透明地持久保存并从数据库中检索加密的数据

加密数据的检索自从我在这里发表上一个帖子以来已经有两个多月了&#xff0c;但是今年六月和七月非常忙碌而密集。 首先&#xff0c; Confitura的组织&#xff08;欧洲最大的Java开发人员免费会议&#xff09;参加了我所有的免费晚会&#xff0c;然后在相当紧张的住院期间&…

微信小程序云开发日记类日记记录分享动态

微信公众号&#xff1a;创享日记&#xff08;微信号csds992022&#xff09; 发送关键词&#xff1a;日记类小程序 免费获取源码 1 概述 1.1 关于本手册 为了使您对研岸日记记录社交软件的使用有清晰详尽的了解&#xff0c;特此编写《用户手册》&#xff0c;为了保障您的利益&a…

Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】

第三节 设计输出及利用在线帮助 在Windows中&#xff0c;消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。 。其输出方式不再限于从上往下&#xff0c;而是全屏可控&#xff0c;因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。 将…

408考研数据结构复习-时间复杂度与空间复杂度-附统考真题

文章目录一、时间复杂度二、空间复杂度三、相关题目一、时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n)&#xff0c;它是该算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。算法中基本运算&#xff08;最深…

解调去载波后均衡信道与实际信道的关系

关注公号【逆向通信猿】更精彩!!! 通常,信号经过调制后发送,会经过信道作用,示意图可以表示为 其中 x ( t ) x(t) x(t)为基带信号, e

第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java

【问题描述】 对于一棵多叉树&#xff0c;我们可以通过 “左孩子右兄弟” 表示法&#xff0c;将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的&#xff0c;那么得到的二叉树可能不唯一。换句话说&#xff0c;每个结点可以选任意子结点作为左孩子&#xff0c;并按任…

activiti脚本任务_Activiti中的高级脚本:自定义配置注入

activiti脚本任务脚本任务可能是Activiti代码库中“最古老的”类之一&#xff0c;但是我认为它仍然未被许多人使用。 &#xff08;感知到的&#xff09;缺点当然是性能&#xff08;解释还是编译&#xff09;&#xff0c;并且从IDE角度来看支持较少。 但是&#xff0c;好处&…

【锁相环系列3】QPSK+基带+Costas锁相环载波同步(重点环路滤波器参数设置和迭代核心代码详解)

引言 假设在QPSK信号解调中,完成匹配滤波、定时抽样后的星座如下所示 而画出基带信号部分点的星座图如下所示 由以上两幅图可以看出,基带信号中还存在微小的频偏,导致星座图旋转,而这种微小的频偏很难通过FFT估计出来,由此想到了用锁相环解决,锁相环锁定后的星座如下 …

线性移位寄存器序列(m序列)之MATLAB实现

移位寄存器的结构 nnn级线性移位寄存器的结构如下图 当生成多项式g(x)g(x)g(x)为本原多项式时&#xff0c;产生的序列为m序列。例如 g(x)x5x21g(x)x^5x^21g(x)x5x21的本原多项式&#xff0c;初态为10000的5级m序列&#xff0c;其周期为25−1312^5-13125−131&#xff0c;结构如…

scala和java像不像_关于Java和Scala同步的五件事你不知道

scala和java像不像实际上&#xff0c;所有服务器应用程序都需要在多个线程之间进行某种同步。 大多数同步工作是在框架级别为我们完成的&#xff0c;例如通过我们的Web服务器&#xff0c;数据库客户端或消息传递框架。 Java和Scala提供了许多组件来编写可靠的多线程应用程序。 …

BPSK调制下(2,1,6)标准卷积码及打孔生成2/3、3/4、4/5、5/6删余码Viterbi译码误码率曲线图(MATLAB实现)

关注公号【逆向通信猿】更精彩!!! 目录 仿真结果卷积码原理图删余后性能比较常用的删余码仿真代码根据码率生成打孔参数(子函数)将标准(2, 1, 6)编码后的序列进行打孔,生成删余码(子函数)对接收到的序列进行反打孔,将原来打孔删除的比特进行补零(子函数)BPSK调制下(2,1,6…

江南大学物联网工程学院数据库课程实验三作业3vb.net实验报告

一、开发环境 语言环境&#xff1a;Microsoft.NET Framework 4.6 SDK IDE&#xff1a;Microsoft Visual Studio Community 2015 二、代码及配置 1、Form1 Public Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadEnd SubPrivate …

[2021.07.25更新]循环冗余校验(CRC)的MATLAB实现

欢迎同步关注公众号【逆向通信猿】 CRC校验(循环冗余校验) 在计算CRC校验的时候,发现一个网站如下 http://www.ip33.com/crc.html 于是,想自己动手实现该网站计算CRC校验的功能,网站提供的在线计算工具是以十六进制来表示输入参数和结果的,为了方便MATLAB实现,本文提供…

江南大学物联网工程学院数据库课程实验四作业4vb.net实验报告

一、开发环境 语言环境&#xff1a;Microsoft.NET Framework 4.6 SDK IDE&#xff1a;Microsoft Visual Studio Community 2015 二、代码 Imports System.Data.SqlClient Public Class Form1 连接本机数据库并获取test_one数据库中的sc表数据 Dim mybind As BindingManagerB…

MATLAB库函数hilbert(希尔伯特变换)的C语言实现(FFT采用FFTW库)

目录希尔伯特变换原理公式MATLAB官方帮助文档中希尔伯特变换算法常量和结构体定义C语言实现(FFTW库的float版&#xff0c;double版类似)希尔伯特变换原理公式 MATLAB官方帮助文档中希尔伯特变换算法 hilbert uses a four-step algorithm: Calculate the FFT of the input sequ…

netbeans7.4_NetBeans 7.4 Beta提示警告无效的异常处理

netbeans7.4有许多例子说明Java异常处理可能比首次出现时要困难得多&#xff0c;Josh Bloch专门将一整章的《 Effective Java》 &#xff08;两个版本&#xff09;专门用于异常处理。 Java中的检查异常模型 仍然 “ 有争议” 。 我很高兴看到我最近下载的NetBeans 7.4 beta有一…

在厚度仅十几微米的电池隔膜找缺陷?人工智能说,能行(人工智能应用案例)

原文链接&#xff1a;https://www.paddlepaddle.org.cn/support/news?actiondetail&id2104 “我们的质检要做的是在厚度仅十几微米的电池隔膜上找出所有微小缺陷&#xff0c;如果没有检测出来&#xff0c;就很可能使新能源汽车的电池在使用过程中出现问题&#xff0c;甚至…

准确率超90%、1秒发出报警,人工智能助国网山东实现无人巡检(人工智能应用案例)

原文链接&#xff1a;https://mp.weixin.qq.com/s/Jh2YLY-4um79ucdHIs5NTg 众所周知&#xff0c;深度学习框架是人工智能的基础技术“底座”&#xff0c;在各大传统产业上也有着巨大的潜力尚待挖掘。5月20日&#xff0c;由深度学习技术及应用国家工程实验室与百度联合主办的“…