mirror of
https://github.com/PlayEdu/PlayEdu
synced 2025-06-29 00:42:50 +08:00
added: 数据权限
This commit is contained in:
parent
c7f566f00d
commit
86d507cc98
@ -2,12 +2,17 @@ package xyz.playedu.api;
|
|||||||
|
|
||||||
import xyz.playedu.api.domain.AdminUser;
|
import xyz.playedu.api.domain.AdminUser;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
|
||||||
public class PlayEduBackendThreadLocal {
|
public class PlayEduBackendThreadLocal {
|
||||||
|
|
||||||
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> THREAD_LOCAL = new java.lang.ThreadLocal<>();
|
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> THREAD_LOCAL = new java.lang.ThreadLocal<>();
|
||||||
|
|
||||||
|
public final static String KEY_ADMIN_USER_ID = "admin_id";
|
||||||
|
public final static String KEY_ADMIN_USER = "admin_user";
|
||||||
|
public final static String KEY_ADMIN_PER = "admin_per";
|
||||||
|
|
||||||
public PlayEduBackendThreadLocal() {
|
public PlayEduBackendThreadLocal() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -25,19 +30,27 @@ public class PlayEduBackendThreadLocal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static Integer getAdminUserID() {
|
public static Integer getAdminUserID() {
|
||||||
return (Integer) get("admin_user_id");
|
return (Integer) get(KEY_ADMIN_USER_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setAdminUserId(Integer userId) {
|
public static void setAdminUserId(Integer userId) {
|
||||||
put("admin_user_id", userId);
|
put(KEY_ADMIN_USER_ID, userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static AdminUser getAdminUser() {
|
public static AdminUser getAdminUser() {
|
||||||
return (AdminUser) get("admin_user");
|
return (AdminUser) get(KEY_ADMIN_USER);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setAdminUser(AdminUser adminUser) {
|
public static void setAdminUser(AdminUser adminUser) {
|
||||||
put("admin_user", adminUser);
|
put(KEY_ADMIN_USER, adminUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setAdminPer(HashMap<String, Boolean> permissions) {
|
||||||
|
put(KEY_ADMIN_PER, permissions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static HashMap<String, Boolean> getAdminPer() {
|
||||||
|
return (HashMap<String, Boolean>) get(KEY_ADMIN_PER);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void remove() {
|
public static void remove() {
|
||||||
|
@ -2,11 +2,13 @@ package xyz.playedu.api.bus;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
import xyz.playedu.api.PlayEduBackendThreadLocal;
|
||||||
import xyz.playedu.api.constant.BackendConstant;
|
import xyz.playedu.api.constant.BackendConstant;
|
||||||
import xyz.playedu.api.domain.AdminRole;
|
import xyz.playedu.api.domain.AdminRole;
|
||||||
import xyz.playedu.api.service.AdminPermissionService;
|
import xyz.playedu.api.service.AdminPermissionService;
|
||||||
import xyz.playedu.api.service.AdminRoleService;
|
import xyz.playedu.api.service.AdminRoleService;
|
||||||
import xyz.playedu.api.service.AdminUserService;
|
import xyz.playedu.api.service.AdminUserService;
|
||||||
|
import xyz.playedu.api.util.PrivacyUtil;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@ -56,4 +58,21 @@ public class BackendBus {
|
|||||||
return permissionService.getSlugsByIds(permissionIds);
|
return permissionService.getSlugsByIds(permissionIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String valueHidden(String permissionSlug, String type, String value) {
|
||||||
|
HashMap<String, Boolean> permissions = PlayEduBackendThreadLocal.getAdminPer();
|
||||||
|
if (permissions.get(permissionSlug) != null) {
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
if (BackendConstant.PRIVACY_FIELD_TYPE_EMAIL.equals(type)) {
|
||||||
|
return PrivacyUtil.hideEmail(value);
|
||||||
|
} else if (BackendConstant.PRIVACY_FIELD_TYPE_PHONE.equals(type)) {
|
||||||
|
return PrivacyUtil.hidePhone(value);
|
||||||
|
} else if (BackendConstant.PRIVACY_FIELD_TYPE_NAME.equals(type)) {
|
||||||
|
return PrivacyUtil.hideChineseName(value);
|
||||||
|
} else if (BackendConstant.PRIVACY_FIELD_TYPE_ID_CARD.equals(type)) {
|
||||||
|
return PrivacyUtil.hideIDCard(value);
|
||||||
|
}
|
||||||
|
return PrivacyUtil.desValue(value, 1, 0, "*");
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,14 @@ public class AdminPermissionCheck implements ApplicationRunner {
|
|||||||
{"课程", "0", "课程", BPermissionConstant.COURSE},
|
{"课程", "0", "课程", BPermissionConstant.COURSE},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private final String[][] DATA_PERMISSIONS = {
|
||||||
|
{"管理员", "0", "邮箱", BPermissionConstant.DATA_ADMIN_EMAIL},
|
||||||
|
|
||||||
|
{"学员", "0", "邮箱", BPermissionConstant.DATA_USER_EMAIL},
|
||||||
|
{"学员", "10", "姓名", BPermissionConstant.DATA_USER_NAME},
|
||||||
|
{"学员", "10", "身份证号", BPermissionConstant.DATA_USER_ID_CARD},
|
||||||
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run(ApplicationArguments args) throws Exception {
|
public void run(ApplicationArguments args) throws Exception {
|
||||||
HashMap<String, Boolean> slugs = permissionService.allSlugs();
|
HashMap<String, Boolean> slugs = permissionService.allSlugs();
|
||||||
@ -71,8 +79,22 @@ public class AdminPermissionCheck implements ApplicationRunner {
|
|||||||
list.add(permission);
|
list.add(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (list.size() == 0) {
|
for (int i = 0; i < DATA_PERMISSIONS.length; i++) {
|
||||||
return;
|
String[] item = DATA_PERMISSIONS[i];
|
||||||
|
String tmpSlug = item[3];
|
||||||
|
if (slugs.get(tmpSlug) != null) {//已经存在
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
AdminPermission permission = new AdminPermission();
|
||||||
|
|
||||||
|
permission.setGroupName(item[0]);
|
||||||
|
permission.setSort(Integer.valueOf(item[1]));
|
||||||
|
permission.setName(item[2]);
|
||||||
|
permission.setSlug(tmpSlug);
|
||||||
|
permission.setType(BPermissionConstant.TYPE_DATA);
|
||||||
|
permission.setCreatedAt(now);
|
||||||
|
|
||||||
|
list.add(permission);
|
||||||
}
|
}
|
||||||
|
|
||||||
permissionService.saveBatch(list);
|
permissionService.saveBatch(list);
|
||||||
|
@ -32,4 +32,9 @@ public class BPermissionConstant {
|
|||||||
|
|
||||||
public final static String COURSE = "course";
|
public final static String COURSE = "course";
|
||||||
|
|
||||||
|
public final static String DATA_USER_NAME = "data-user-name";
|
||||||
|
public final static String DATA_USER_EMAIL = "data-user-email";
|
||||||
|
public final static String DATA_USER_ID_CARD = "data-user-id-card";
|
||||||
|
public final static String DATA_ADMIN_EMAIL = "data-admin-email";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -49,4 +49,9 @@ public class BackendConstant {
|
|||||||
public final static String[] UPLOAD_IMAGE_CONTENT_TYPE_WL = {"image/png", "image/jpg", "image/jpeg", "image/gif"};
|
public final static String[] UPLOAD_IMAGE_CONTENT_TYPE_WL = {"image/png", "image/jpg", "image/jpeg", "image/gif"};
|
||||||
public final static String UPLOAD_IMAGE_DIR = "images/";
|
public final static String UPLOAD_IMAGE_DIR = "images/";
|
||||||
|
|
||||||
|
public final static String PRIVACY_FIELD_TYPE_EMAIL = "email";
|
||||||
|
public final static String PRIVACY_FIELD_TYPE_PHONE = "phone";
|
||||||
|
public final static String PRIVACY_FIELD_TYPE_NAME = "name";
|
||||||
|
public final static String PRIVACY_FIELD_TYPE_ID_CARD = "IDCard";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -8,15 +8,21 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonGetter;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import xyz.playedu.api.bus.BackendBus;
|
||||||
|
import xyz.playedu.api.constant.BPermissionConstant;
|
||||||
|
import xyz.playedu.api.constant.BackendConstant;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @TableName admin_users
|
* @TableName admin_users
|
||||||
*/
|
*/
|
||||||
@TableName(value = "admin_users")
|
@TableName(value = "admin_users")
|
||||||
@Data
|
@Data
|
||||||
|
@Slf4j
|
||||||
public class AdminUser implements Serializable {
|
public class AdminUser implements Serializable {
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -79,6 +85,11 @@ public class AdminUser implements Serializable {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@JsonGetter("email")
|
||||||
|
public String transformEmail() {
|
||||||
|
return BackendBus.valueHidden(BPermissionConstant.DATA_ADMIN_EMAIL, BackendConstant.PRIVACY_FIELD_TYPE_EMAIL, email);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object that) {
|
public boolean equals(Object that) {
|
||||||
if (this == that) {
|
if (this == that) {
|
||||||
|
@ -8,9 +8,14 @@ import com.baomidou.mybatisplus.annotation.TableName;
|
|||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonGetter;
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import xyz.playedu.api.bus.BackendBus;
|
||||||
|
import xyz.playedu.api.constant.BPermissionConstant;
|
||||||
|
import xyz.playedu.api.constant.BackendConstant;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @TableName users
|
* @TableName users
|
||||||
@ -124,6 +129,21 @@ public class User implements Serializable {
|
|||||||
@TableField(exist = false)
|
@TableField(exist = false)
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@JsonGetter("name")
|
||||||
|
public String transformName() {
|
||||||
|
return BackendBus.valueHidden(BPermissionConstant.DATA_USER_NAME, BackendConstant.PRIVACY_FIELD_TYPE_NAME, getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonGetter("email")
|
||||||
|
public String transformEmail() {
|
||||||
|
return BackendBus.valueHidden(BPermissionConstant.DATA_USER_EMAIL, BackendConstant.PRIVACY_FIELD_TYPE_EMAIL, getEmail());
|
||||||
|
}
|
||||||
|
|
||||||
|
@JsonGetter("id_card")
|
||||||
|
public String transformIdCard() {
|
||||||
|
return BackendBus.valueHidden(BPermissionConstant.DATA_USER_ID_CARD, BackendConstant.PRIVACY_FIELD_TYPE_ID_CARD, getIdCard());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object that) {
|
public boolean equals(Object that) {
|
||||||
if (this == that) {
|
if (this == that) {
|
||||||
|
@ -33,6 +33,9 @@ public class AdminAuthMiddleware implements HandlerInterceptor {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private AppBus appBus;
|
private AppBus appBus;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private BackendBus backendBus;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
|
||||||
if ("OPTIONS".equals(request.getMethod()) || BackendBus.inUnAuthWhitelist(request.getRequestURI())) {
|
if ("OPTIONS".equals(request.getMethod()) || BackendBus.inUnAuthWhitelist(request.getRequestURI())) {
|
||||||
@ -57,6 +60,7 @@ public class AdminAuthMiddleware implements HandlerInterceptor {
|
|||||||
|
|
||||||
PlayEduBackendThreadLocal.setAdminUserId(payload.getSub());
|
PlayEduBackendThreadLocal.setAdminUserId(payload.getSub());
|
||||||
PlayEduBackendThreadLocal.setAdminUser(adminUser);
|
PlayEduBackendThreadLocal.setAdminUser(adminUser);
|
||||||
|
PlayEduBackendThreadLocal.setAdminPer(backendBus.adminUserPermissions(adminUser.getId()));
|
||||||
|
|
||||||
return HandlerInterceptor.super.preHandle(request, response, handler);
|
return HandlerInterceptor.super.preHandle(request, response, handler);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
55
src/main/java/xyz/playedu/api/util/PrivacyUtil.java
Normal file
55
src/main/java/xyz/playedu/api/util/PrivacyUtil.java
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package xyz.playedu.api.util;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author 杭州白书科技有限公司
|
||||||
|
* @create 2023/3/3 10:51
|
||||||
|
*/
|
||||||
|
public class PrivacyUtil {
|
||||||
|
|
||||||
|
public static String hidePhone(String phone) {
|
||||||
|
return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String hideEmail(String email) {
|
||||||
|
return email.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String hideIDCard(String idCard) {
|
||||||
|
return idCard.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1*****$2");
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String hideChineseName(String chineseName) {
|
||||||
|
if (chineseName == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return desValue(chineseName, 1, 0, "*");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对字符串进行脱敏操作
|
||||||
|
*
|
||||||
|
* @param origin 原始字符串
|
||||||
|
* @param prefixNoMaskLen 左侧需要保留几位明文字段
|
||||||
|
* @param suffixNoMaskLen 右侧需要保留几位明文字段
|
||||||
|
* @param maskStr 用于遮罩的字符串, 如'*'
|
||||||
|
* @return 脱敏后结果
|
||||||
|
*/
|
||||||
|
public static String desValue(String origin, int prefixNoMaskLen, int suffixNoMaskLen, String maskStr) {
|
||||||
|
if (origin == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0, n = origin.length(); i < n; i++) {
|
||||||
|
if (i < prefixNoMaskLen) {
|
||||||
|
sb.append(origin.charAt(i));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (i > (n - suffixNoMaskLen - 1)) {
|
||||||
|
sb.append(origin.charAt(i));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
sb.append(maskStr);
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user