一、引入spring-boot-starter-data-ldap
依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-ldap</artifactId> </dependency>
|
二、配置文件
1 2 3 4 5 6
| spring: ldap: urls: ldap://xx.xx.xx.xx:389 base: OU=xxx,DC=xxx,DC=com username: xxx@xx.com password: xxx
|
在配置文件里填入地址、baseDN、用户名和密码信息
三、创建用户对象类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import com.alibaba.fastjson.annotation.JSONField; import lombok.Data; import org.springframework.ldap.odm.annotations.Attribute; import org.springframework.ldap.odm.annotations.Entry; import org.springframework.ldap.odm.annotations.Id;
import javax.naming.Name;
@Data @Entry(objectClasses = "person") public class Person {
@Id @JSONField(serialize = false) private Name distinguishedName;
@Attribute(name = "sAMAccountName") private String loginName;
@Attribute(name = "cn") private String name;
@Attribute(name = "userAccountControl") private Integer userAccountControl;
private Boolean isDelete; }
|
四、用户登录
4.1 示例代码
1 2 3 4 5 6 7 8 9 10
| import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.filter.EqualsFilter;
private final LdapTemplate ldapTemplate; private static final String LDAP_USERNAME_ATTR = "sAMAccountName";
public void login(String userName, String password) { EqualsFilter filter = new EqualsFilter(LDAP_USERNAME_ATTR, userName); boolean result = ldapTemplate.authenticate("", filter.toString(), password); }
|
基本逻辑就是调用ldapTemplate的authenticate方法来进行认证。
4.2 完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| package com.cowave.meter.admin.user.service.impl;
import cn.hutool.core.util.IdUtil; import com.cowave.commons.framework.access.Access; import com.cowave.commons.framework.filter.security.AccessToken; import com.cowave.commons.framework.filter.security.TokenService; import com.cowave.commons.framework.support.mybatis.page.PageDO; import com.cowave.commons.framework.util.Asserts; import com.cowave.commons.framework.util.AssertsException; import com.cowave.meter.admin.user.dao.SysDeptDao; import com.cowave.meter.admin.user.dao.SysRoleDao; import com.cowave.meter.admin.user.dao.SysUserDao; import com.cowave.meter.admin.user.pojo.Person; import com.cowave.meter.admin.user.pojo.SysDept; import com.cowave.meter.admin.user.pojo.SysRole; import com.cowave.meter.admin.user.pojo.SysUser; import com.cowave.meter.admin.user.service.LdapService; import com.cowave.meter.admin.user.service.SysUserService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.ldap.core.LdapTemplate; import org.springframework.ldap.filter.EqualsFilter; import org.springframework.ldap.query.LdapQueryBuilder; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils;
import java.util.List;
@Slf4j @Service @RequiredArgsConstructor public class LdapServiceImpl implements LdapService { private final LdapTemplate ldapTemplate; private final TokenService tokenService; private final SysUserDao sysUserDao; private final SysUserService userService; private final SysDeptDao sysDeptDao; private final SysRoleDao sysRoleDao; private final BCryptPasswordEncoder bcryptPasswordEncoder = new BCryptPasswordEncoder(); private static final String LDAP_USERNAME_ATTR = "sAMAccountName";
@Override public AccessToken domainLogin(String userName, String password) { EqualsFilter filter = new EqualsFilter(LDAP_USERNAME_ATTR, userName); boolean authenticate = ldapTemplate.authenticate("", filter.toString(), password); if (!authenticate) { throw new AssertsException("auth.failed"); } Boolean domainUserAccountExist = sysUserDao.domainUserAccountExist(userName); if (Boolean.FALSE.equals(domainUserAccountExist)) { LdapQueryBuilder ldapQuery = LdapQueryBuilder.query(); ldapQuery.filter(filter); Person person = ldapTemplate.findOne(ldapQuery, Person.class); if (ObjectUtils.isEmpty(person)) { throw new AssertsException("user.notexist"); }
SysUser sysUser = new SysUser(); sysUser.setUserAccount(userName); Asserts.isFalse(userService.userAccountExist(sysUser), "账户名已存在"); sysUser.setUserName(person.getName()); sysUser.setUserPasswd(bcryptPasswordEncoder.encode(password)); sysUser.setDomainUserAccount(userName); SysDept sysDept = sysDeptDao.queryRootDept(); if (!ObjectUtils.isEmpty(sysDept)) { sysUser.setDeptId(sysDept.getDeptId()); } PageDO<SysRole> sysRolePageDO = sysRoleDao.queryPage(null, "2", 1, 1); if (sysRolePageDO.getPages() > 0) { SysRole sysRole = sysRolePageDO.getList().get(0); sysUser.setRoleId(sysRole.getRoleId()); } userService.saveOrUpdate(sysUser); } SysUser sysUser = sysUserDao.getByDomainUserAccount(userName); String userId = sysUser.getUserId(); AccessToken accessToken = new AccessToken(); accessToken.setType(AccessToken.TYPE_USER);
accessToken.setUserCode(userId); accessToken.setUsername(sysUser.getUserAccount()); accessToken.setUserNick(sysUser.getUserName()); accessToken.setDeptCode(sysUser.getDeptId()); accessToken.setRoles(List.of(sysUser.getRoleId()));
accessToken.setLoginIp(Access.ip()); accessToken.setLoginTime(Access.time()); accessToken.setAccessIp(Access.ip()); accessToken.setAccessTime(Access.time()); accessToken.setId(IdUtil.fastSimpleUUID());
String token = tokenService.newToken(accessToken); accessToken.setToken(token); return accessToken; } }
|
4.3 判断用户是否禁用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
private Boolean getUserDelete(int userAccContr) { if (userAccContr >= 16777216) { userAccContr = userAccContr - 16777216; } if (userAccContr >= 8388608) { userAccContr = userAccContr - 8388608; } if (userAccContr >= 4194304) { userAccContr = userAccContr - 4194304; } if (userAccContr >= 2097152) { userAccContr = userAccContr - 2097152; } if (userAccContr >= 1048576) { userAccContr = userAccContr - 1048576; } if (userAccContr >= 524288) { userAccContr = userAccContr - 524288; } if (userAccContr >= 262144) { userAccContr = userAccContr - 262144; } if (userAccContr >= 131072) { userAccContr = userAccContr - 131072; } if (userAccContr >= 65536) { userAccContr = userAccContr - 65536; } if (userAccContr >= 2097152) { userAccContr = userAccContr - 2097152; } if (userAccContr >= 8192) { userAccContr = userAccContr - 8192; } if (userAccContr >= 4096) { userAccContr = userAccContr - 4096; } if (userAccContr >= 2048) { userAccContr = userAccContr - 2048; } if (userAccContr >= 512) { userAccContr = userAccContr - 512; } if (userAccContr >= 256) { userAccContr = userAccContr - 256; } if (userAccContr >= 128) { userAccContr = userAccContr - 128; } if (userAccContr >= 64) { userAccContr = userAccContr - 64; } if (userAccContr >= 32) { userAccContr = userAccContr - 32; } if (userAccContr >= 16) { userAccContr = userAccContr - 16; } if (userAccContr >= 8) { userAccContr = userAccContr - 8; } if (userAccContr >= 2) { return true; } return false; }
|