Spring-LDAP 服务部署和连接实战

2 篇文章 0 订阅
2 篇文章 0 订阅
  1. 安装部署openldap
more start-openldap-docker.sh

#!/bin/bash

#https://github.com/osixia/docker-openldap

docker stop openldap
docker rm   openldap

docker run -d \
--privileged=true \
--name=openldap \
-p 389:389 \
-p 636:636 \
-e "LDAP_DOMAIN=example.org" \
-e "LDAP_ADMIN_PASSWORD=kaixin.com" \
-e "LDAP_CONFIG_PASSWORD=kaixin.com" \
-e "LDAP_READONLY_USER=false" \
-e "LDAP_READONLY_USER_USERNAME=readonly" \
-e "LDAP_READONLY_USER_PASSWORD=yourpassword" \
-e "LDAP_RFC2307BIS_SCHEMA=false" \
-v `pwd`/data:/var/lib/ldap  \
-v `pwd`/conf:/etc/ldap/slapd.d  \
osixia/openldap:1.2.4


#
#测试是否正常
#ldapsearch -x -H ldap://127.0.0.1  -b dc=example,dc=org -D "cn=admin,dc=example,dc=org" -w yourpassword



# OpenLDAP监听的端口:
#      默认监听端口:389(明文数据传输)
#      加密监听端口:636(密文数据传输)

2. 安装部署 ldap-admin  start-phpldapadmin-docker.sh (样本代码如下,请根据实际修改)

docker stop phpldapadmin
docker rm   phpldapadmin

#下面的变量请根据您的实际情况修改.
ldap_hosts=openldap_host_name (请输入openldap IP地址或域名)
dns_server= 你的dns (如果ldap_hosts是填写的ip 不用写这个dns)

docker run -d  \
-p 443:443 \
--dns=${dns_server} \
--name phpladpadmin \
--env PHPLDAPADMIN_LDAP_HOSTS=${ldap_hosts} \
osixia/phpldapadmin:0.7.2  --loglevel debug

echo "如果运行正常,打开网页 https://localhost:443"
echo "Login DN: cn=admin,dc=example,dc=org"
echo "Password: yourpassword"

LDAP简称对应

在这里插入图片描述


通过环境变量设置 LDAP 服务器的参数:
LDAP_ORGANISATION: Organisation name. Defaults to Example Inc.
LDAP_DOMAIN: Ldap domain. Defaults to example.org
LDAP_BASE_DN: Ldap base DN. If empty automatically set from LDAP_DOMAIN value. Defaults to (empty)
LDAP_ADMIN_PASSWORD Ldap Admin password. Defaults to admin
LDAP_CONFIG_PASSWORD Ldap Config password. Defaults to config
LDAP_READONLY_USER Add a read only user. Defaults to false
LDAP_READONLY_USER_USERNAME Read only user username. Defaults to readonly
LDAP_READONLY_USER_PASSWORD Read only user password. Defaults to readonly
LDAP_RFC2307BIS_SCHEMA Use rfc2307bis schema instead of nis schema. Defaults to false

  1. 通过ldapsearch,ldapadd,ldapdelete,ldapmodify等参数查询、新增、删除、修改内容信息
    docker exec ldap ldapsearch -x -H ldap://localhost -b dc=example,dc=org -D “cn=admin,dc=example,dc=org” -w admin
    docker exec $LDAP_CID ldapadd -x -D “cn=admin,dc=example,dc=org” -w admin -f /container/service/slapd/assets/test/new-user.ldif -H ldap://ldap.example.org -ZZ

https://docs.oracle.com/javase/tutorial/jndi/ldap/exceptions.html
LDAP错误代码
如何映射到JNDI异常LDAP定义了一组状态代码,这些代码随LDAP服务器发送的LDAP响应一起返回(请参阅RFC 2251)。 在JNDI中,错误条件表示为已检查的异常,它们是NamingException的子类。 有关JNDI异常类的概述,请参阅命名异常部分。
LDAP服务提供程序将从LDAP服务器接收的LDAP状态代码转换为NamingException的相应子类。 下表显示了LDAP状态代码和JNDI异常之间的映射。

LDAP状态代码含义异常或操作
0 Success Report success.
1 Operations error NamingException
2 Protocol error CommunicationException
3 Time limit exceeded. TimeLimitExceededException
4 Size limit exceeded. SizeLimitExceededException
5 Compared false. Used by DirContext.search(). Does not generate an exception.
6 Compared true. Used by DirContext.search(). Does not generate an exception.
7 Authentication method not supported. AuthenticationNotSupportedException
8 Strong authentication required. AuthenticationNotSupportedException
9 Partial results being returned. If the environment property “java.naming.referral” is set to “ignore” or the contents of the error do not contain a referral, throw a PartialResultException. Otherwise, use contents to build a referral.
10 Referral encountered. If the environment property “java.naming.referral” is set to “ignore”, then ignore. If the property is set to “throw”, throw ReferralException. If the property is set to “follow”, then the LDAP provider processes the referral. If the “java.naming.ldap.referral.limit” property has been exceeded, throw LimitExceededException.
11 Administrative limit exceeded. LimitExceededException
12 Unavailable critical extension requested. OperationNotSupportedException
13 Confidentiality required. AuthenticationNotSupportedException
14 SASL bind in progress. Used internally by the LDAP provider during authentication.
16 No such attribute exists. NoSuchAttributeException
17 An undefined attribute type. InvalidAttributeIdentifierException
18 Inappropriate matching InvalidSearchFilterException
19 A constraint violation. InvalidAttributeValueException
20 An attribute or value already in use. AttributeInUseException
21 An invalid attribute syntax. InvalidAttributeValueException
32 No such object exists. NameNotFoundException
33 Alias problem NamingException
34 An invalid DN syntax. InvalidNameException
35 Is a leaf. Used by the LDAP provider; usually doesn’t generate an exception.
36 Alias dereferencing problem NamingException
48 Inappropriate authentication AuthenticationNotSupportedException
49 Invalid credentials AuthenticationException
50 Insufficient access rights NoPermissionException
51 Busy ServiceUnavailableException
52 Unavailable ServiceUnavailableException
53 Unwilling to perform OperationNotSupportedException
54 Loop detected. NamingException
64 Naming violation InvalidNameException
65 Object class violation SchemaViolationException
66 Not allowed on non-leaf. ContextNotEmptyException
67 Not allowed on RDN. SchemaViolationException
68 Entry already exists. NameAlreadyBoundException
69 Object class modifications prohibited. SchemaViolationException
71 Affects multiple DSAs. NamingException
80 Other NamingException

https://youripaddr:443
用户名: cn=admin,dc=example,dc=org
密码:yourpassword
在这里插入图片描述

导入或手动创建记录:example.ldif 内容如下

dn: dc=example,dc=org
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: example

dn: ou=groups,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=subgroups,ou=groups,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: subgroups

dn: ou=people,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people

dn: ou=space cadets,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: space cadets

dn: ou=“quoted people”,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: “quoted people”

dn: ou=otherpeople,dc=example,dc=org
objectclass: top
objectclass: organizationalUnit
ou: otherpeople

dn: uid=ben,ou=people,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben Alex
sn: Alex
uid: ben
userPassword: {SHA}nFCebWjxfaLbHHG1Qk5UU4trbvQ=

dn: uid=bob,ou=people,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Bob Hamilton
sn: Hamilton
uid: bob
userPassword: bobspassword

dn: uid=joe,ou=otherpeople,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Joe Smeth
sn: Smeth
uid: joe
userPassword: joespassword

dn: cn=mouse, jerry,ou=people,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Mouse, Jerry
sn: Mouse
uid: jerry
userPassword: jerryspassword

dn: cn=slash/guy,ou=people,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: slash/guy
sn: Slash
uid: slashguy
userPassword: slashguyspassword

dn: cn=quote"guy,ou=“quoted people”,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: quote"guy
sn: Quote
uid: quoteguy
userPassword: quoteguyspassword

dn: uid=space cadet,ou=space cadets,dc=example,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Space Cadet
sn: Cadet
uid: space cadet
userPassword: spacecadetspassword

dn: cn=developers,ou=groups,dc=example,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: developers
ou: developer
uniqueMember: uid=ben,ou=people,dc=example,dc=org
uniqueMember: uid=bob,ou=people,dc=example,dc=org

dn: cn=managers,ou=groups,dc=example,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: managers
ou: manager
uniqueMember: uid=ben,ou=people,dc=example,dc=org
uniqueMember: cn=mouse, jerry,ou=people,dc=example,dc=org

dn: cn=submanagers,ou=subgroups,ou=groups,dc=example,dc=org
objectclass: top
objectclass: groupOfUniqueNames
cn: submanagers
ou: submanager
uniqueMember: uid=ben,ou=people,dc=example,dc=org

在这里插入图片描述

  1. 编写代码测试,简单的LDAP应用。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.LdapShaPasswordEncoder;

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http
			.authorizeRequests()
				.anyRequest().fullyAuthenticated()
				.and()
			.formLogin();
	}

	@Override
	public void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth
				.ldapAuthentication()
				.userDnPatterns("uid={0},ou=people")
				.groupSearchBase("ou=groups")
				.contextSource()
				.url("ldap://openldap.devops.marathon.mesos:389/dc=example,dc=org")
				.managerDn("cn=admin,dc=example,dc=org")
				.managerPassword("kaixin.com")
				.and()
				.passwordCompare()
				.passwordEncoder(new LdapShaPasswordEncoder())
				.passwordAttribute("userPassword");
	}
	//.url("ldap://openldap.devops.marathon.mesos:389/dc=example,dc=org")

}

验证:
在这里插入图片描述
输入:ben 密码: benspassword1
在这里插入图片描述
输入:ben 密码: benspassword
在这里插入图片描述

github 样本代码下载
https://github.com/HappyFreeAngel/spring-ldap-example.git

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

开心自由天使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值