valueOfByPageInfo(PageInfo pageInfo, Function
function) {
+ PageModel pageModel = new PageModel();
+ pageModel.setPages(pageInfo.getPages());
+ pageModel.setTotal(pageInfo.getTotal());
+ pageModel.setHasNext(pageInfo.isHasNextPage());
+ pageModel.setHasPrevious(pageInfo.isHasPreviousPage());
+ pageModel.setCurrentPage(pageInfo.getPageNum());
+ if (CollUtil.isEmpty(pageInfo.getList())) {
+ pageModel.setResults(Collections.emptyList());
+ } else {
+ pageModel.setResults(pageInfo.getList().stream().map(function).collect(Collectors.toList()));
+ }
+ return pageModel;
+ }
+
+ public static PageModel convertResultObj(PageModel pageInfo, Function
function) {
+ PageModel pageModel = new PageModel();
+ pageModel.setPages(pageInfo.getPages());
+ pageModel.setTotal(pageInfo.getTotal());
+ pageModel.setHasNext(pageInfo.isHasNext());
+ pageModel.setHasPrevious(pageInfo.isHasPrevious());
+ pageModel.setCurrentPage(pageInfo.getCurrentPage());
+ if (CollUtil.isEmpty(pageInfo.getResults())) {
+ pageModel.setResults(Collections.emptyList());
+ } else {
+ pageModel.setResults(pageInfo.getResults().stream().map(function).collect(Collectors.toList()));
+ }
+ return pageModel;
+ }
+
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java b/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java
new file mode 100644
index 0000000000000000000000000000000000000000..0e8c13748ef77b7454904c389bdf08bb3b784b26
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/Role.java
@@ -0,0 +1,77 @@
+package com.taoes.simpledocker.model;
+
+import cn.hutool.core.collection.CollUtil;
+import com.taoes.simpledocker.dao.bean.PermissionDao;
+import com.taoes.simpledocker.dao.bean.RoleDao;
+import com.taoes.simpledocker.model.enums.PermissionEnum;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * 角色领域模型
+ *
+ * @author manwang (569258yin)
+ * @date 2022/7/13 21:55
+ */
+@Data
+@NoArgsConstructor
+public class Role {
+
+ public static final String ADMIN_ROLE_NAME = "admin";
+
+ private Integer id;
+ private String name;
+ private String comment;
+ private List permissions;
+
+
+ public RoleDao convertRoleDao() {
+ RoleDao roleDao = new RoleDao();
+ roleDao.setId(this.id);
+ roleDao.setComment(this.comment);
+ roleDao.setName(this.name);
+ return roleDao;
+ }
+
+ public static Role factoryRole(RoleDao roleDao) {
+ Role role = new Role();
+ role.setId(roleDao.getId());
+ role.setName(roleDao.getName());
+ role.setComment(roleDao.getComment());
+ role.setPermissions(Collections.emptyList());
+ return role;
+ }
+
+ public static Role factoryRole(RoleDao roleDao, List permissions) {
+ Role role = new Role();
+ role.setId(roleDao.getId());
+ role.setName(roleDao.getName());
+ role.setComment(roleDao.getComment());
+ role.setPermissions(convertPermission2Enum(permissions));
+ return role;
+ }
+
+ public static List factoryRoles(List roleDaoList, List permissionDaoList) {
+ Map> groupByRoleIdMap = permissionDaoList.stream().collect(Collectors.groupingBy(PermissionDao::getRoleId));
+ return roleDaoList.stream().map(r -> factoryRole(r, groupByRoleIdMap.get(r))).collect(Collectors.toList());
+ }
+
+ public static List convertPermission2Enum(List permissions) {
+ if (CollUtil.isEmpty(permissions)) {
+ return Collections.emptyList();
+ }
+ return permissions.stream().map(r -> PermissionEnum.getPermissionEnum(r.getPermission())).collect(Collectors.toList());
+ }
+
+ public static List getAllPermissions(List roles) {
+ if (CollUtil.isEmpty(roles)) {
+ return Collections.emptyList();
+ }
+ return roles.stream().flatMap(r -> r.getPermissions().stream().map(PermissionEnum::getPermission)).distinct().collect(Collectors.toList());
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java
index cbe4917a6bd69d4b231a385cdff0ef331058ba23..4447b9e8035aee5c296340bdc7dfeb50a3e8aaa1 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/model/User.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/User.java
@@ -12,22 +12,27 @@ import lombok.Data;
public class User {
- private Long id;
+ private Long id;
- /**
- * 用户名
- */
- private String username;
+ /**
+ * 用户账号
+ */
+ private String account;
+ /**
+ * 用户名
+ */
+ private String name;
- /**
- * 创建时间
- */
- private String createdAt;
- /**
- * 更新时间
- */
- private String updatedAt;
+ /**
+ * 创建时间
+ */
+ private String createdAt;
+
+ /**
+ * 更新时间
+ */
+ private String updatedAt;
}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f5a70d73283db6e985c8ed773f1cfed7e85edff
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionEnum.java
@@ -0,0 +1,70 @@
+package com.taoes.simpledocker.model.enums;
+
+import com.taoes.simpledocker.model.exception.ParamCheckException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author manwang (569258yin)
+ * @date 2022/7/13 21:57
+ */
+@AllArgsConstructor
+@Getter
+public enum PermissionEnum {
+
+ ADMIN(PermissionGroupEnum.ADMIN.getId(), "*", "超级管理员"),
+
+ DOCKER_ENDPOINT_ADD(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:create", "新增docker节点"),
+ DOCKER_ENDPOINT_UPDATE(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:update", "修改docker节点"),
+ DOCKER_ENDPOINT_DELETE(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:delete", "删除docker节点"),
+ DOCKER_ENDPOINT_QUERY(PermissionGroupEnum.DOCKER_ENDPOINT.getId(), "docker:endpoint:query", "查看docker节点"),
+
+ USER_ADD(PermissionGroupEnum.USER.getId(), "user:add", "新增用户"),
+ USER_UPDATE(PermissionGroupEnum.USER.getId(), "user:update", "修改用户"),
+ USER_DELETE(PermissionGroupEnum.USER.getId(), "user:delete", "删除用户"),
+ USER_QUERY(PermissionGroupEnum.USER.getId(), "user:query", "查看用户"),
+ USER_AUTH_ROLE(PermissionGroupEnum.USER.getId(), "user:authRole", "编辑用户角色"),
+
+ ROLE_ADD(PermissionGroupEnum.ROLE.getId(), "role:add", "新增角色信息"),
+ ROLE_UPDATE(PermissionGroupEnum.ROLE.getId(), "role:update", "修改角色信息"),
+ ROLE_DELETE(PermissionGroupEnum.ROLE.getId(), "role:delete", "删除角色信息"),
+ ROLE_QUERY(PermissionGroupEnum.ROLE.getId(), "role:query", "查看角色信息"),
+ ROLE_PERMISSION_QUERY(PermissionGroupEnum.ROLE.getId(), "role:permission:query", "查看角色权限"),
+ ROLE_PERMISSION_SAVE(PermissionGroupEnum.ROLE.getId(), "role:permission:save", "修改角色权限"),
+ ;
+
+ private static final Map INNER_MAP = new HashMap<>();
+
+ static {
+ for (PermissionEnum value : PermissionEnum.values()) {
+ INNER_MAP.put(value.permission, value);
+ }
+ }
+
+ private final Integer groupId;
+ private final String permission;
+ private final String desc;
+
+
+ public static PermissionEnum getPermissionEnum(String permission) {
+ PermissionEnum permissionEnum = INNER_MAP.get(permission);
+ if (permissionEnum == null) {
+ throw new ParamCheckException("权限不正确");
+ }
+ return permissionEnum;
+ }
+
+ public static Map> getGroupPermission() {
+ return INNER_MAP.values().stream().collect(Collectors.groupingBy(PermissionEnum::getGroupId));
+ }
+
+ @Override
+ public String toString() {
+ return this.permission;
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c922b28b1bf8af7e113c3a1807f1394d09a7f31
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/enums/PermissionGroupEnum.java
@@ -0,0 +1,44 @@
+package com.taoes.simpledocker.model.enums;
+
+import com.taoes.simpledocker.model.exception.ParamCheckException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author manwang (569258yin)
+ * @date 2022/7/13 21:57
+ */
+@AllArgsConstructor
+@Getter
+public enum PermissionGroupEnum {
+
+ ADMIN(0, "超级管理员"),
+ DOCKER_ENDPOINT(1, "容器资源"),
+ USER(21, "用户"),
+ ROLE(22, "角色"),
+ ;
+
+ private static final Map INNER_MAP = new HashMap<>();
+
+ static {
+ for (PermissionGroupEnum value : PermissionGroupEnum.values()) {
+ INNER_MAP.put(value.id, value);
+ }
+ }
+
+ private final Integer id;
+ private final String desc;
+
+
+ public static PermissionGroupEnum getPermissionGroup(Integer groupId) {
+ PermissionGroupEnum permissionEnum = INNER_MAP.get(groupId);
+ if (permissionEnum == null) {
+ throw new ParamCheckException("权限分组不正确");
+ }
+ return permissionEnum;
+ }
+
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/AuthFailException.java b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/AuthFailException.java
new file mode 100644
index 0000000000000000000000000000000000000000..26f1830948092fee651a0ea7b5be4d14c53e9502
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/AuthFailException.java
@@ -0,0 +1,19 @@
+package com.taoes.simpledocker.model.exception;
+
+import com.taoes.simpledocker.model.exception.BaseBizException;
+import lombok.Data;
+
+@Data
+public class AuthFailException extends BaseBizException {
+
+ public AuthFailException() {
+ }
+
+ public AuthFailException(String message) {
+ super(message);
+ }
+
+ public AuthFailException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/BaseBizException.java b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/BaseBizException.java
index 043ff61ec7e8ca862fe5aca97d87e17534d158a9..f5e38c60b3fefdcdafde1abe53829e502df7e6d2 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/BaseBizException.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/BaseBizException.java
@@ -12,4 +12,8 @@ public abstract class BaseBizException extends RuntimeException {
public BaseBizException(String message) {
super(message);
}
+
+ public BaseBizException(String message, Throwable cause) {
+ super(message, cause);
+ }
}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/DataNotFoundException.java b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/DataNotFoundException.java
new file mode 100644
index 0000000000000000000000000000000000000000..3f41cdd618b6224d0dc0c5996a8c6c4f9cfde1cd
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/DataNotFoundException.java
@@ -0,0 +1,14 @@
+package com.taoes.simpledocker.model.exception;
+
+/**
+ * 数据未查到错误
+ */
+public class DataNotFoundException extends BaseBizException {
+
+ public DataNotFoundException() {
+ }
+
+ public DataNotFoundException(String message) {
+ super(message);
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/model/exception/OperateFailException.java b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/OperateFailException.java
new file mode 100644
index 0000000000000000000000000000000000000000..ae5568888a9a561d48fc28f5ced6f0b1cd5293e9
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/model/exception/OperateFailException.java
@@ -0,0 +1,14 @@
+package com.taoes.simpledocker.model.exception;
+
+/**
+ * 操作失败异常
+ */
+public class OperateFailException extends BaseBizException {
+
+ public OperateFailException() {
+ }
+
+ public OperateFailException(String message) {
+ super(message);
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java
index a0d530c1a35e4096dadabf9286e4fa6362b459f6..0e8b7e5c900a3cc5e09d7b3e9ab8a320915c10cd 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/AuthService.java
@@ -16,6 +16,8 @@ public interface AuthService {
*/
String login(String username, String password);
+ void logout();
+
/**
* 重置密码
*
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b0694ad14808b2d5eacc999902734238c960ad6
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/RoleService.java
@@ -0,0 +1,28 @@
+package com.taoes.simpledocker.service;
+
+import com.taoes.simpledocker.model.PageModel;
+import com.taoes.simpledocker.model.Role;
+
+import java.util.List;
+
+/**
+ * @author manwang (569258yin)
+ * @date 2022/7/13 21:53
+ */
+public interface RoleService {
+
+ PageModel pageList(Integer pageNum, Integer pageSize);
+
+ void addRole(Role role);
+
+ void updateRole(Role role);
+
+ void deleteRole(Integer id);
+
+ Role getById(Integer id);
+
+ List getByIds(List ids);
+
+
+ void savePermission(Integer roleId, List permissions);
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java
index 0705fa25b7a85356fee3ff07fe9efbfa6568d532..9d50fe4e9c4d1b85a4fd7aa9904dbcb72da9aeba 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/UserService.java
@@ -1,6 +1,7 @@
package com.taoes.simpledocker.service;
+import com.taoes.simpledocker.model.Role;
import com.taoes.simpledocker.model.User;
import java.util.List;
@@ -35,4 +36,8 @@ public interface UserService {
void enabled(Long id);
List list();
+
+ void authRole(Long userId, List roleIds);
+
+ List getUserRoles(Long userId);
}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/auth/UserDetailService.java b/backend-src/src/main/java/com/taoes/simpledocker/service/auth/UserDetailService.java
deleted file mode 100644
index 4341960c62a42e2ed62d47ea4a8dbb24ba6bbb07..0000000000000000000000000000000000000000
--- a/backend-src/src/main/java/com/taoes/simpledocker/service/auth/UserDetailService.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.taoes.simpledocker.service.auth;
-
-import com.taoes.simpledocker.dao.bean.UserDao;
-import com.taoes.simpledocker.dao.responsity.UserRepository;
-import java.util.Collections;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Service;
-
-@Slf4j
-@Service
-public class UserDetailService implements UserDetailsService {
-
- @Autowired
- private UserRepository userRepository;
-
- @Override
- public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
- final UserDao userDao = userRepository.findByName(username).orElse(null);
- return new User(userDao.getUsername(), userDao.getPassword(), Collections.emptyList());
- }
-}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java
index e95b5925ecc76614c052769d5c7c5b371710555d..04bbfa6f471f8a809332e5ae66799bcf61b8a184 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/AuthServiceImpl.java
@@ -1,18 +1,19 @@
package com.taoes.simpledocker.service.imple;
-import com.taoes.simpledocker.config.securoty.JwtTokenUtil;
-import java.util.Collections;
-import java.util.Objects;
-import java.util.Optional;
-
+import cn.dev33.satoken.stp.StpUtil;
+import com.taoes.simpledocker.model.exception.AuthFailException;
import com.taoes.simpledocker.dao.bean.UserDao;
import com.taoes.simpledocker.dao.responsity.UserRepository;
+import com.taoes.simpledocker.model.exception.DataNotFoundException;
import com.taoes.simpledocker.service.AuthService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.core.userdetails.User;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
+import java.util.Objects;
+import java.util.Optional;
+
//import org.springframework.security.core.GrantedAuthority;
/**
@@ -28,52 +29,48 @@ public class AuthServiceImpl implements AuthService {
private final UserRepository userRepository;
- private final JwtTokenUtil tokenUtil;
-
@Override
public String login(String username, String password) {
// 查询用户信息
final Optional userOptional = userRepository.findByName(username);
if (!userOptional.isPresent()) {
log.warn("用户:{}登录失败,该用户不存在", username);
- throw new RuntimeException("用户名和密码不匹配");
+ throw new DataNotFoundException("用户名和密码不匹配");
}
final UserDao user = userOptional.get();
// 比对用户信息
if (!Objects.equals(user.getPassword(), password)) {
log.warn("用户:{}登录失败,密码不正确", username);
- throw new RuntimeException("用户名和密码不匹配");
+ throw new AuthFailException("用户名和密码不匹配");
}
+ StpUtil.login(user.getId());
+ return StpUtil.getTokenValue();
+ }
- // 生成token
- return tokenUtil.generateToken(new User(username,user.getPassword(), Collections.emptyList()));//createNewToken(username, new ArrayList<>());
+ @Override
+ public void logout() {
+ log.info("id = {} 退出登录", StpUtil.getLoginIdDefaultNull());
+ StpUtil.logout();
}
+
@Override
public void reset(String username, String password, String newPassword) {
- log.info("准备重置密码:{}", username);
- // TODO 江南 重置密码
+ final Optional userOptional = userRepository.findByName(username);
+ if (!userOptional.isPresent()) {
+ log.warn("用户:{}登录失败,该用户不存在", username);
+ throw new DataNotFoundException("用户不存在或已删除");
+ }
+ final UserDao user = userOptional.get();
+ if (!StringUtils.equals(user.getPassword(), password)) {
+ log.warn("用户:{} 密码验证失败", username);
+ throw new AuthFailException("原始密码不正确");
+ }
+ user.setPassword(newPassword);
+ userRepository.updatePasswd(user);
+ StpUtil.logout();
}
- //private String createNewToken(String username, Collection extends GrantedAuthority> authorities) {
- // // 定义存放角色集合的对象
- // List roleList = new ArrayList<>();
- // for (GrantedAuthority grantedAuthority : authorities) {
- // roleList.add(grantedAuthority.getAuthority());
- // }
- //
- // // 生成token start
- // Calendar calendar = Calendar.getInstance();
- // Date now = calendar.getTime();
- // calendar.setTime(new Date());
- // calendar.add(Calendar.HOUR, 2);
- // Date time = calendar.getTime();
- // return Jwts.builder()
- // .setSubject(username)
- // .setIssuedAt(now)
- // .setExpiration(time)
- // .signWith(SignatureAlgorithm.HS512, "SIGNING_KEY")
- // .compact();
- //}
+
}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..fc74a39597aafe746e860d708a62d474c51753dd
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/RoleServiceImpl.java
@@ -0,0 +1,120 @@
+package com.taoes.simpledocker.service.imple;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.ObjectUtil;
+import com.github.pagehelper.PageInfo;
+import com.github.pagehelper.page.PageMethod;
+import com.google.common.collect.Lists;
+import com.taoes.simpledocker.dao.bean.PermissionDao;
+import com.taoes.simpledocker.dao.bean.RoleDao;
+import com.taoes.simpledocker.dao.responsity.PermissionRepository;
+import com.taoes.simpledocker.dao.responsity.RoleRepository;
+import com.taoes.simpledocker.model.PageModel;
+import com.taoes.simpledocker.model.Role;
+import com.taoes.simpledocker.model.enums.PermissionEnum;
+import com.taoes.simpledocker.model.exception.DataNotFoundException;
+import com.taoes.simpledocker.model.exception.OperateFailException;
+import com.taoes.simpledocker.model.exception.ParamCheckException;
+import com.taoes.simpledocker.service.RoleService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author manwang (569258yin)
+ * @date 2022/7/13 21:53
+ */
+@Service
+public class RoleServiceImpl implements RoleService {
+
+ @Autowired
+ private RoleRepository roleRepository;
+ @Autowired
+ private PermissionRepository permissionRepository;
+
+ @Override
+ public PageModel pageList(Integer pageNum, Integer pageSize) {
+ PageMethod.startPage(pageNum, pageSize);
+ List roleDaoList = roleRepository.getAll();
+ PageInfo pageInfo = new PageInfo<>(roleDaoList);
+ return PageModel.valueOfByPageInfo(pageInfo, Role::factoryRole);
+ }
+
+ @Override
+ public void addRole(Role role) {
+ boolean result = roleRepository.insertRole(role.convertRoleDao());
+ if (!result) {
+ throw new OperateFailException("保存角色失败");
+ }
+ }
+
+ @Override
+ public void updateRole(Role role) {
+ Assert.notNull(role.getId(), "参数不正确");
+ checkRole(role.getId());
+ boolean result = roleRepository.updateRole(role.convertRoleDao());
+ if (!result) {
+ throw new OperateFailException("更新角色失败");
+ }
+ }
+
+ @Override
+ public void deleteRole(Integer id) {
+ checkRole(id);
+ boolean result = roleRepository.deleteRole(id);
+ if (!result) {
+ throw new OperateFailException("删除角色失败");
+ }
+ }
+
+ @Override
+ public Role getById(Integer id) {
+ RoleDao roleDao = roleRepository.getById(id);
+ if (ObjectUtil.isEmpty(roleDao)) {
+ return null;
+ }
+ List permissionDaoList = permissionRepository.getByRoleId(id);
+ return Role.factoryRole(roleDao, permissionDaoList);
+ }
+
+ @Override
+ public List getByIds(List ids) {
+ List roleDaoList = roleRepository.getByIds(ids);
+ if (CollUtil.isEmpty(roleDaoList)) {
+ return Collections.emptyList();
+ }
+ List dbRoleIds = roleDaoList.stream().map(RoleDao::getId).collect(Collectors.toList());
+ List permissionDaoList = permissionRepository.getByRoleIds(dbRoleIds);
+ return Role.factoryRoles(roleDaoList, permissionDaoList);
+ }
+
+ @Override
+ public void savePermission(Integer roleId, List permissions) {
+ checkRole(roleId);
+ for (String permission : permissions) {
+ PermissionEnum.getPermissionEnum(permission);
+ }
+ List permissionDaoList = Lists.newArrayListWithCapacity(permissions.size());
+ for (String permission : permissions) {
+ permissionDaoList.add(new PermissionDao(roleId, permission));
+ }
+ boolean result = permissionRepository.savePermission(roleId, permissionDaoList);
+ if (!result) {
+ throw new OperateFailException("更新角色权限失败");
+ }
+ }
+
+ private void checkRole(Integer id) {
+ RoleDao roleDao = roleRepository.getById(id);
+ if (roleDao == null) {
+ throw new DataNotFoundException("数据不存在或已删除");
+ }
+ if (roleDao.getName().equals(Role.ADMIN_ROLE_NAME)) {
+ throw new ParamCheckException("超级管理员不能修改");
+ }
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/StpInterfaceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/StpInterfaceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..749ec7135f35d539e33c87e3db483ba49921f43d
--- /dev/null
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/StpInterfaceImpl.java
@@ -0,0 +1,44 @@
+package com.taoes.simpledocker.service.imple;
+
+import cn.dev33.satoken.stp.StpInterface;
+import cn.hutool.core.collection.CollUtil;
+import com.taoes.simpledocker.model.Role;
+import com.taoes.simpledocker.service.UserService;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author manwang (569258yin)
+ * @date 2022/7/16 13:38
+ */
+@Service
+public class StpInterfaceImpl implements StpInterface {
+
+
+ @Autowired
+ private UserService userService;
+
+
+ @Override
+ public List getPermissionList(Object loginId, String loginType) {
+ List roles = userService.getUserRoles(NumberUtils.toLong(loginId.toString()));
+ if (CollUtil.isEmpty(roles)) {
+ return Collections.emptyList();
+ }
+ return Role.getAllPermissions(roles);
+ }
+
+ @Override
+ public List getRoleList(Object loginId, String loginType) {
+ List roles = userService.getUserRoles(NumberUtils.toLong(loginId.toString()));
+ if (CollUtil.isEmpty(roles)) {
+ return Collections.emptyList();
+ }
+ return roles.stream().map(Role::getName).collect(Collectors.toList());
+ }
+}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java
index 0aa10f79531001f88969258e9c68d5c088278cdd..5cc651b10633f3f86b9151bd1d5c6aacfcf43761 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/service/imple/UserServiceImpl.java
@@ -1,15 +1,25 @@
package com.taoes.simpledocker.service.imple;
+import cn.hutool.core.collection.CollUtil;
import com.taoes.simpledocker.converter.UserConverter;
+import com.taoes.simpledocker.dao.bean.RoleDao;
+import com.taoes.simpledocker.dao.bean.UserDao;
+import com.taoes.simpledocker.dao.responsity.RoleRepository;
import com.taoes.simpledocker.dao.responsity.UserRepository;
+import com.taoes.simpledocker.model.Role;
import com.taoes.simpledocker.model.User;
+import com.taoes.simpledocker.model.exception.DataNotFoundException;
+import com.taoes.simpledocker.model.exception.ParamCheckException;
+import com.taoes.simpledocker.service.RoleService;
import com.taoes.simpledocker.service.UserService;
-import java.util.List;
-import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
/**
* 用户服务实现
*
@@ -25,6 +35,12 @@ public class UserServiceImpl implements UserService {
@Autowired
private UserConverter userConverter;
+
+ @Autowired
+ private RoleService roleService;
+ @Autowired
+ private RoleRepository roleRepository;
+
@Override
public User findByName(String username) {
@@ -45,4 +61,32 @@ public class UserServiceImpl implements UserService {
public List list() {
return userRepository.list().stream().map(userConverter::from).collect(Collectors.toList());
}
+
+ @Override
+ public void authRole(Long userId, List roleIds) {
+ UserDao user = userRepository.getById(userId);
+ if (user == null) {
+ throw new DataNotFoundException("用户不存在或已删除");
+ }
+ if (CollUtil.isNotEmpty(roleIds)) {
+ List roleDaoList = roleRepository.getByIds(roleIds);
+ if (roleDaoList.size() != roleIds.size()) {
+ throw new ParamCheckException("角色信息有误");
+ }
+ }
+ userRepository.updateRole(userId, roleIds);
+ }
+
+ @Override
+ public List getUserRoles(Long userId) {
+ UserDao user = userRepository.getById(userId);
+ if (user == null) {
+ throw new DataNotFoundException("用户不存在或已删除");
+ }
+ List roleIds = UserDao.convertRoleStr2List(user.getRoleIds());
+ if (CollUtil.isEmpty(roleIds)) {
+ return Collections.emptyList();
+ }
+ return roleService.getByIds(roleIds);
+ }
}
diff --git a/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java b/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java
index 8a061d00d77513f619bdb05d56dd59124152309c..6ee285626ae3b7ceab14c41468c4d0ec47c79758 100644
--- a/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java
+++ b/backend-src/src/main/java/com/taoes/simpledocker/utils/JsonUtils.java
@@ -1,7 +1,12 @@
package com.taoes.simpledocker.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.List;
/**
* TODO: please input file info
@@ -9,9 +14,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
* @author 枕上江南 zhoutao925638@vip.qq.com
* @date 2021/12/9 10:33 下午
*/
+@Slf4j
public class JsonUtils {
- private final static ObjectMapper mapper = new ObjectMapper();
+ private final static ObjectMapper MAPPER = new ObjectMapper();
static {
@@ -19,10 +25,34 @@ public class JsonUtils {
public static String toJsonString(Object obj) {
try {
- return mapper.writeValueAsString(obj);
+ return MAPPER.writeValueAsString(obj);
} catch (JsonProcessingException e) {
- e.printStackTrace();
- return "";
+ log.error("{}对象转json字符串失败", obj, e);
+ return StringUtils.EMPTY;
+ }
+ }
+
+ /**
+ * 将json数据转换成pojo对象list
+ * Title: jsonToList
+ * Description:
+ *
+ * @param jsonData
+ * @param beanType
+ * @return
+ */
+ public static List jsonToList(String jsonData, Class beanType) {
+ JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
+ try {
+ return MAPPER.readValue(jsonData, javaType);
+ } catch (Exception e) {
+ log.error("解析json出错json={}", jsonData, e);
}
+
+ return null;
+ }
+
+ private static JavaType getJavaType(Class> clas, Class>... parameterClasses) {
+ return MAPPER.getTypeFactory().constructParametricType(clas, parameterClasses);
}
}
diff --git a/backend-src/src/main/resources/application-dev.yaml b/backend-src/src/main/resources/application-dev.yaml
index 55e0aa5d206d489e99f0b7610c3e55f9a2d05021..4cb014c6777d5e9c35207b4e5cd2e2a914653aa2 100644
--- a/backend-src/src/main/resources/application-dev.yaml
+++ b/backend-src/src/main/resources/application-dev.yaml
@@ -6,3 +6,6 @@ spring:
username: root
password: admin123
driver-class-name: com.mysql.cj.jdbc.Driver
+
+swagger:
+ production: false
diff --git a/backend-src/src/main/resources/application.yaml b/backend-src/src/main/resources/application.yaml
index d769067c7c7aa8bcf5af38785ad091104426af2f..2efd1c185712815f4554adcbf7fcec5c313851c1 100644
--- a/backend-src/src/main/resources/application.yaml
+++ b/backend-src/src/main/resources/application.yaml
@@ -1,3 +1,26 @@
spring:
profiles:
- active: @profile.active@
\ No newline at end of file
+ active: @profile.active@
+ mvc:
+ pathmatch:
+ matching-strategy: ant_path_matcher
+
+# Sa-Token配置
+sa-token:
+ # token 名称 (同时也是cookie名称)
+ token-name: Token
+ # token 有效期,单位s 默认30天, -1代表永不过期
+ timeout: 2592000
+ # token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
+ activity-timeout: -1
+ # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
+ is-concurrent: true
+ # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
+ is-share: false
+ # token风格
+ token-style: random-128
+ # 是否输出操作日志
+ is-log: false
+ # token前缀
+ token-prefix: Bearer
+
diff --git a/database/update.sql b/database/update.sql
new file mode 100644
index 0000000000000000000000000000000000000000..918d8ea790a2b27b67619738272c9effa29fb7b1
--- /dev/null
+++ b/database/update.sql
@@ -0,0 +1,32 @@
+#### 用户权限相关改动
+CREATE TABLE `role` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `name` varchar(64) NOT NULL,
+ `comment` varchar(255) DEFAULT NULL COMMENT '描述',
+ `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '逻辑删除',
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ UNIQUE KEY `uk_name` (`name`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+CREATE TABLE `permission` (
+ `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
+ `permission` varchar(255) NOT NULL,
+ `role_id` int(11) NOT NULL,
+ `deleted` tinyint(1) NOT NULL DEFAULT '0',
+ `created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
+ `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
+ PRIMARY KEY (`id`),
+ KEY `idx_role` (`role_id`) USING BTREE
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+ALTER TABLE `user`
+ CHANGE COLUMN `username` `account` varchar(128) NOT NULL COMMENT '账号' AFTER `id`,
+ ADD COLUMN `role_ids` varchar(255) NOT NULL DEFAULT '[]' COMMENT '角色数组' AFTER `salt_value`,
+ ADD COLUMN `deleted` tinyint(1) NOT NULL DEFAULT '0',
+ ADD COLUMN `name` varchar(64) NULL COMMENT '昵称' AFTER `id`;
+
+INSERT INTO `sd`.`role` (`id`, `name`, `comment`, `deleted`) VALUES (1, 'admin', '超级管理员', 0);
+
+