SpringBoot之data操作Apache DS完成对用户操作

Posted 你是小KS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot之data操作Apache DS完成对用户操作相关的知识,希望对你有一定的参考价值。

当前版本:jdk1.8apacheds-2.0.0.AM26

1. 声明

当前内容主要为使用SpringBootData方式操作Apache DS,实现对用户的操作

主要内容:

  1. 手动创建一个组织并添加一个成员
  2. 使用springbootdata方式对成员进行操作
  3. 切换不同用户登录

当前pom依赖

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.6.3</version>
	<relativePath />
</parent>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-ldap</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2. 使用Studio进行数据添加操作

这里创建一个ou=software的组织,然后在该组织中添加成员并设置密码






此时一个名称为:ou=software的组织就创建好了

接下来就是在下面创建一个用户



开始设置密码


这里密码设置为:123456


此时用户添加完毕

3. 开始使用springbootdata对ldap进行操作

该内容参考:官方文档

配置类:

@Configuration
@EnableLdapRepositories(basePackages = "com.hy.springboot.ldap.dao")
public class AppConfig 
	@Bean
	public ContextSource contextSource() 
		LdapContextSource ldapContextSource = new LdapContextSource();
		//ldapContextSource.setUserDn("uid=admin,ou=system");
		//ldapContextSource.setPassword("secret");
		ldapContextSource.setUserDn("uid=admin,ou=software,dc=example,dc=com");
		ldapContextSource.setPassword("123456");
		ldapContextSource.setUrl("ldap://192.168.1.101:10389");
		return ldapContextSource;
	

	@Bean
	public LdapTemplate ldapTemplate(ContextSource contextSource) 
		return new LdapTemplate(contextSource);
	

2.entity层


@Entry(objectClasses =  "inetOrgPerson", "organizationalPerson", "person",
		"top" , base = "ou=software,dc=example,dc=com")
public final class Person 

	@Id
	private Name dn;

	@Attribute(name = "uid")
	@DnAttribute(value = "uid", index = 0)
	private String loginName;

	@Attribute(name = "userPassword")
	// @DnAttribute(value = "userPassword")
	private String loginPwd;

	@Attribute(name = "cn")
	private String fullName;

	@Attribute(name = "sn")
	private String firstName;

	public String getLoginPwd() 
		return loginPwd;
	

	public void setLoginPwd(byte[] loginPwd) throws UnsupportedEncodingException 
		this.loginPwd = new String(loginPwd, "utf-8");

	
	// 省略其他get\\set、toString等方法


这里:@DnAttribute(value = "uid", index = 0)就是在添加的时候回将uid=XXX设置为rdn中的开头部分(index=0)

密码应该使用字符串写入,但是读取出来的却是byte[],会自动加密

3.dao层

@Repository
public interface PersonDao extends LdapRepository<Person>


4.controller层

@RestController
public class PersonController 
	@Autowired
	private PersonDao personDao;
	

	/**
	 * 
	 * @author hy
	 * @createTime 2022-02-06 15:14:10
	 * @description 实现删除用户数据的操作
	 * @param uid
	 * @return
	 * @throws UnsupportedEncodingException
	 *
	 */
	@RequestMapping(value = "/deleteById", method = RequestMethod.GET)
	public Object deleteById(String uid) throws UnsupportedEncodingException 
		String model="uid=%s,ou=software,dc=example,dc=com";
		String format = String.format(model, uid);
		try 
			personDao.deleteById(new LdapName(format));
			return "OK";
		 catch (InvalidNameException e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "ERROR";
		
		
	

	@RequestMapping(value = "/add", method = RequestMethod.GET)
	public Object add(Person p,String password) throws UnsupportedEncodingException 
		p.setLoginPwd(password.getBytes("utf-8"));
		Person save = personDao.save(p);
		return "OK";
	

	@RequestMapping(value = "/findAll", method = RequestMethod.GET)
	public Object findAll() 
		List<Person> findAll = personDao.findAll();
		return findAll.toString();
	

	@RequestMapping(value = "/login", method = RequestMethod.GET)
	public Object login(String username, String password) 
		ContainerCriteria containerCriteria = LdapQueryBuilder.query()
				.where("uid").is(username)
				// 对应密码123456的SSHA 加盐的SHA加密,通过面板获取的
		.and("userPassword").is("SSHAM5yGHC2aiR2EETjz0MGC0CCL8kO0IVlV1WnZZw==") ;
		boolean loginSuccess =false;
		/*
		 * Iterable<Person> findAll = personDao.findAll(containerCriteria);
		 * Iterator<Person> iterator = findAll.iterator(); 
		 * while(iterator.hasNext())  Person next = iterator.next();
		 * System.out.println(next); 
		 */
		Optional<Person> findOne = personDao.findOne(containerCriteria);
		loginSuccess = findOne.isPresent();
		if (loginSuccess) 
			return "login success!";
		
		return "login failed!";
	

4. 测试






对于不同的添加的成员之后,就可以切换用户进行操作了

以上是关于SpringBoot之data操作Apache DS完成对用户操作的主要内容,如果未能解决你的问题,请参考以下文章

springboot检索之整合elasticsearch并使用spring-data操作

小D课堂SpringBoot数据库操作之整合Mybaties和事务讲解

SpringBoot之集成MongoDB

python之文件系统操作(os模块)

SpringBoot+vue+实战项目之第4集

springboot编写持久化接口之集成jdbctemplate