235 lines
8.5 KiB
Java
235 lines
8.5 KiB
Java
|
|
package cn.palmte.work.service;
|
|||
|
|
|
|||
|
|
import cn.palmte.work.model.*;
|
|||
|
|
import cn.palmte.work.pojo.LoginResponse;
|
|||
|
|
import cn.palmte.work.pojo.Menu;
|
|||
|
|
import cn.palmte.work.shiro.ShiroUtils;
|
|||
|
|
import cn.palmte.work.utils.*;
|
|||
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|||
|
|
import org.springframework.stereotype.Service;
|
|||
|
|
|
|||
|
|
import javax.servlet.http.HttpServletRequest;
|
|||
|
|
import java.util.ArrayList;
|
|||
|
|
import java.util.Date;
|
|||
|
|
import java.util.List;
|
|||
|
|
import java.util.regex.Pattern;
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* @author: zhangming
|
|||
|
|
* @date: 2019/9/18 0018
|
|||
|
|
*/
|
|||
|
|
@Service
|
|||
|
|
public class AdminService {
|
|||
|
|
private static final Pattern PSW_PATTERN = Pattern.compile("^[\\@A-Za-z0-9\\!\\#\\$\\%\\^\\&\\*\\.\\~]{8,20}$");
|
|||
|
|
|
|||
|
|
@Autowired
|
|||
|
|
public AdminRepositoryCustom adminRepositoryCustom;
|
|||
|
|
@Autowired
|
|||
|
|
public AdminRepositoryImpl adminRepositoryImpl;
|
|||
|
|
@Autowired
|
|||
|
|
public AdminRepository adminRepository;
|
|||
|
|
@Autowired
|
|||
|
|
public SysPermissionRepository sysPermissionRepository;
|
|||
|
|
|
|||
|
|
public Admin getAdminByUsername(String userName) {
|
|||
|
|
List<Admin> admins = adminRepository.getAdminByUsernameListNoEnabled(userName);
|
|||
|
|
if (admins != null && !admins.isEmpty()) {
|
|||
|
|
Admin admin = admins.get(0);
|
|||
|
|
//查询角色ID和TYPE
|
|||
|
|
Admin adminRoleInfo = adminRepositoryImpl.findAdminByUserName(userName);
|
|||
|
|
admin.setRoleType(adminRoleInfo.getRoleType());
|
|||
|
|
admin.setRoleId(adminRoleInfo.getRoleId());
|
|||
|
|
admin.setRoleLevel(adminRoleInfo.getRoleLevel());
|
|||
|
|
return admin;
|
|||
|
|
}
|
|||
|
|
return null;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<String> getAuthoritiesName(String adminId) {
|
|||
|
|
return adminRepositoryCustom.getAuthoritiesName(adminId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<String> getAuthoritieUrls(String adminId) {
|
|||
|
|
return adminRepositoryCustom.getAuthoritieUrls(adminId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<SysPermission> getAuthoritieUrlsByParentPermission(String adminId, String permission) {
|
|||
|
|
return adminRepositoryCustom.getAuthoritieUrlsByParentPermission(adminId, permission);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<String> getRolesName(String adminId) {
|
|||
|
|
return adminRepositoryCustom.getRolesName(adminId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public LoginResponse initMenuList(int uId) {
|
|||
|
|
LoginResponse loginResponse = new LoginResponse();
|
|||
|
|
|
|||
|
|
List<Menu> topMenuList = getMenuByLevelID(2);
|
|||
|
|
|
|||
|
|
loginResponse.setTopMenuList(topMenuList);
|
|||
|
|
|
|||
|
|
List<Menu> menuList = new ArrayList<>();
|
|||
|
|
if (uId > 0) {
|
|||
|
|
menuList = getMenuByParentId(uId);
|
|||
|
|
} else {
|
|||
|
|
if (null != topMenuList && topMenuList.size() > 0) {
|
|||
|
|
Integer topMenuId = topMenuList.get(0).getId();
|
|||
|
|
menuList = getMenuByParentId(topMenuId);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
loginResponse.setSideBarList(menuList);
|
|||
|
|
|
|||
|
|
return loginResponse;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<Menu> getMenuByLevelID(int levelId) {
|
|||
|
|
List<SysPermission> list = sysPermissionRepository.findSysPermissionByLevel(levelId);
|
|||
|
|
List<Menu> nodeList = new ArrayList<>();
|
|||
|
|
for (SysPermission sysPermission : list) {
|
|||
|
|
//TODO:需补充shiro权限相关逻辑
|
|||
|
|
if (ShiroUtils.hasPermission(sysPermission.getPermission())) {
|
|||
|
|
// remark字段,用于返回前端TOP菜单css样式的class ID
|
|||
|
|
String url[] = sysPermission.getUrl().split("/");
|
|||
|
|
sysPermission.setRemark(url[url.length - 1]);
|
|||
|
|
Menu menu = new Menu();
|
|||
|
|
menu.setId(sysPermission.getId());
|
|||
|
|
menu.setName(sysPermission.getName());
|
|||
|
|
menu.setIcon(sysPermission.getIcon());
|
|||
|
|
menu.setRemark(sysPermission.getRemark());
|
|||
|
|
menu.setUrl(sysPermission.getUrl());
|
|||
|
|
menu.setIcon(sysPermission.getIcon());
|
|||
|
|
menu.setParentId(sysPermission.getParentId());
|
|||
|
|
menu.setPermossion(sysPermission.getPermission());
|
|||
|
|
nodeList.add(menu);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return nodeList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public List<Menu> getMenuByParentId(int parentId) {
|
|||
|
|
List<Menu> nodeList = new ArrayList<>();
|
|||
|
|
List<Menu> returnList = new ArrayList<>();
|
|||
|
|
List<SysPermission> list = sysPermissionRepository.findSysPermissionByParentId(parentId);
|
|||
|
|
list.forEach(sysPermission -> {
|
|||
|
|
Menu menu = new Menu();
|
|||
|
|
menu.setId(sysPermission.getId());
|
|||
|
|
menu.setName(sysPermission.getName());
|
|||
|
|
menu.setIcon(sysPermission.getIcon());
|
|||
|
|
menu.setRemark(sysPermission.getRemark());
|
|||
|
|
menu.setUrl(sysPermission.getUrl());
|
|||
|
|
menu.setIcon(sysPermission.getIcon());
|
|||
|
|
menu.setParentId(sysPermission.getParentId());
|
|||
|
|
menu.setPermossion(sysPermission.getPermission());
|
|||
|
|
nodeList.add(menu);
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
|
|||
|
|
for (Menu node1 : nodeList) {
|
|||
|
|
boolean mark = false;
|
|||
|
|
for (Menu node2 : nodeList) {
|
|||
|
|
if (node1.getParentId() > 0L && node1.getParentId() == node2.getId()) {
|
|||
|
|
mark = true;
|
|||
|
|
if (node2.getChildren() == null) {
|
|||
|
|
node2.setChildren(new ArrayList<Menu>());
|
|||
|
|
}
|
|||
|
|
//TODO:需补充shiro权限相关逻辑
|
|||
|
|
if (ShiroUtils.hasPermission(node1.getPermossion())) {
|
|||
|
|
node2.getChildren().add(node1);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//TODO:需补充shiro权限相关逻辑
|
|||
|
|
if (!mark && ShiroUtils.hasPermission(node1.getPermossion())) {
|
|||
|
|
returnList.add(node1);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return returnList;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 更新登录信息
|
|||
|
|
*/
|
|||
|
|
public void updateLoginInfo(Admin admin, HttpServletRequest request) {
|
|||
|
|
admin.setLoginDate(new Date());
|
|||
|
|
admin.setLoginIp(request.getRemoteAddr());
|
|||
|
|
admin.setLoginErrorCount(0);
|
|||
|
|
admin.setLocked(Admin.UN_LOCKED);
|
|||
|
|
admin.setLockedDate(null);
|
|||
|
|
adminRepository.save(admin);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public SysRole getRole(String adminId) {
|
|||
|
|
return adminRepositoryCustom.getRole(adminId);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 通过id查询admin
|
|||
|
|
*/
|
|||
|
|
public Admin getAdminById(int id) {
|
|||
|
|
return adminRepository.getAdminById(id);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void updatePassword(String id, String password, String newPassword, String privateKey) {
|
|||
|
|
int adminId = InterfaceUtil.getAdminId();
|
|||
|
|
if(adminId != Integer.parseInt(id)){
|
|||
|
|
throw new RuntimeException("密码修改失败,id不合法");
|
|||
|
|
}
|
|||
|
|
Admin admin = adminRepository.findOne(Integer.valueOf(id));
|
|||
|
|
if(null == admin){
|
|||
|
|
throw new RuntimeException("密码修改失败,不存在 id = " + id + " 这个人");
|
|||
|
|
}
|
|||
|
|
String salt = admin.getSalt();
|
|||
|
|
|
|||
|
|
String desOldPwd = "";
|
|||
|
|
String desNewPwd = "";
|
|||
|
|
try{
|
|||
|
|
/* RSA 解密 */
|
|||
|
|
String oldPwdByRSA = StrKit.byteToStringWithDefaultEncoding(RSAUtils.decryptByPrivateKey(Base64Utils.decode(password), privateKey));
|
|||
|
|
desOldPwd = DESCrypto.encryptPassword(oldPwdByRSA, salt);
|
|||
|
|
|
|||
|
|
String newPwdByRSA = StrKit.byteToStringWithDefaultEncoding(RSAUtils.decryptByPrivateKey(Base64Utils.decode(newPassword), privateKey));
|
|||
|
|
if(!PSW_PATTERN.matcher(newPwdByRSA).matches()){// 密码不满足正则表达式
|
|||
|
|
throw new RuntimeException("密码修改失败,密码不满足规则(8-20位非中文字符)");
|
|||
|
|
}
|
|||
|
|
desNewPwd = DESCrypto.encryptPassword(newPwdByRSA, salt);
|
|||
|
|
}
|
|||
|
|
catch(Exception e){
|
|||
|
|
throw new RuntimeException("密码修改失败");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
String correct = admin.getPassword();
|
|||
|
|
|
|||
|
|
if(!desOldPwd.equals(correct)){
|
|||
|
|
throw new RuntimeException("密码修改失败,原密码错误");
|
|||
|
|
}
|
|||
|
|
admin.setPassword(desNewPwd);
|
|||
|
|
admin.setLastUpdatedBy(InterfaceUtil.getAdminId());
|
|||
|
|
admin.setLastUpdatedTime(new Date());
|
|||
|
|
admin.setUpdatedPasswordTime(new Date());
|
|||
|
|
adminRepository.save(admin);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
public boolean isLocked(Admin admin){
|
|||
|
|
if(admin.getLocked()==Admin.UN_LOCKED){
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
Date lockedDate = admin.getLockedDate();
|
|||
|
|
//15分钟之后就不算锁定了
|
|||
|
|
return System.currentTimeMillis() - lockedDate.getTime() <= 15 * 60 * 1000;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public void addLoginError(Admin admin){
|
|||
|
|
int loginErrorCount = admin.getLoginErrorCount();
|
|||
|
|
admin.setLoginErrorCount(loginErrorCount+1);
|
|||
|
|
//5次就锁定
|
|||
|
|
if(loginErrorCount >= 5-1){
|
|||
|
|
admin.setLocked(Admin.LOCKED);
|
|||
|
|
admin.setLockedDate(new Date());
|
|||
|
|
}
|
|||
|
|
adminRepository.saveAndFlush(admin);
|
|||
|
|
}
|
|||
|
|
}
|