权限入库,增加环境变量,开发环境下不删除权限
This commit is contained in:
parent
70696bccb0
commit
1508147f47
|
@ -1,6 +1,7 @@
|
|||
package com.diboot.example.listener;
|
||||
|
||||
import com.diboot.shiro.authz.storage.EnableStorageEnum;
|
||||
import com.diboot.shiro.authz.storage.EnvEnum;
|
||||
import com.diboot.shiro.listener.AbstractStorageApplicationListener;
|
||||
import org.springframework.context.event.ContextRefreshedEvent;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
@ -21,7 +22,7 @@ public class ExampleListener extends AbstractStorageApplicationListener {
|
|||
|
||||
/**需要手动实现构造来设置是否开启权限入库操作,默认入库*/
|
||||
protected ExampleListener() {
|
||||
super(EnableStorageEnum.TRUE);
|
||||
super(EnableStorageEnum.TRUE, EnvEnum.DEV);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
package com.diboot.shiro.authz.storage;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
|
||||
/**
|
||||
* 权限存储环境
|
||||
* @author : wee
|
||||
* @version : v todo
|
||||
* @Date 2019-06-25 17:08
|
||||
*/
|
||||
@Getter
|
||||
@AllArgsConstructor
|
||||
public enum EnvEnum {
|
||||
|
||||
PROD("prod", "生产环境"),
|
||||
|
||||
DEV("dev","开发环境");
|
||||
|
||||
private String env;
|
||||
|
||||
private String desc;
|
||||
|
||||
}
|
|
@ -1,15 +1,7 @@
|
|||
package com.diboot.shiro.authz.storage;
|
||||
|
||||
import com.alibaba.fastjson.annotation.JSONField;
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableLogic;
|
||||
import com.diboot.core.entity.BaseEntity;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
|
|
|
@ -31,8 +31,4 @@ public class Permission extends BaseEntity {
|
|||
@TableField
|
||||
private String permissionName;
|
||||
|
||||
/**此处覆盖了父类的属性,初始化权限的时候需要设置该值,直接使用父类,无法设置*/
|
||||
@TableField
|
||||
private boolean deleted = false;
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import com.diboot.core.util.V;
|
|||
import com.diboot.shiro.authz.annotation.AuthorizationPrefix;
|
||||
import com.diboot.shiro.authz.annotation.AuthorizationWrapper;
|
||||
import com.diboot.shiro.authz.storage.EnableStorageEnum;
|
||||
import com.diboot.shiro.authz.storage.EnvEnum;
|
||||
import com.diboot.shiro.authz.storage.PermissionStorage;
|
||||
import com.diboot.shiro.entity.Permission;
|
||||
import com.diboot.shiro.service.PermissionService;
|
||||
|
@ -58,12 +59,25 @@ public abstract class AbstractStorageApplicationListener implements ApplicationL
|
|||
*/
|
||||
protected boolean storagePermissions;
|
||||
|
||||
protected AbstractStorageApplicationListener(EnableStorageEnum enableStorageEnum) {
|
||||
/**入库的环境:
|
||||
* 当为开发环境的时候,可能会存在几个人同时书写系统权限,
|
||||
* 各自启动的时候,所开发的权限可能存在差异,会导致删除自己开发环境不存在的权限
|
||||
* 所以开发环境(dev)下(dev),不会删除权限,只会修改和递增,而生产(prod)上则会删除
|
||||
* 默认环境为:dev
|
||||
*/
|
||||
protected String env;
|
||||
|
||||
protected AbstractStorageApplicationListener(EnableStorageEnum enableStorageEnum, EnvEnum envEnum) {
|
||||
if (V.isEmpty(enableStorageEnum)) {
|
||||
this.storagePermissions = true;
|
||||
this.storagePermissions = EnableStorageEnum.TRUE.isStoragePermissions();
|
||||
} else {
|
||||
this.storagePermissions = enableStorageEnum.isStoragePermissions();
|
||||
}
|
||||
if (V.isEmpty(envEnum)) {
|
||||
this.env = EnvEnum.DEV.getEnv();
|
||||
} else {
|
||||
this.env = envEnum.getEnv();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -202,7 +216,7 @@ public abstract class AbstractStorageApplicationListener implements ApplicationL
|
|||
for (Map.Entry<String, Permission> entry : dbPermissionMap.entrySet()) {
|
||||
PermissionStorage permissionStorage = loadCodePermissionMap.get(entry.getKey());
|
||||
Permission permission = entry.getValue();
|
||||
//存在则更新(设置ID)
|
||||
//代码中存在则更新(设置ID)
|
||||
if (V.notEmpty(permissionStorage)) {
|
||||
if (isNeedModify(permission, permissionStorage)) {
|
||||
modifyCount++;
|
||||
|
@ -214,17 +228,20 @@ public abstract class AbstractStorageApplicationListener implements ApplicationL
|
|||
loadCodePermissionMap.remove(entry.getKey());
|
||||
}
|
||||
} else {
|
||||
//不存在: 表示需要删除
|
||||
removeCount++;
|
||||
permission.setDeleted(true);
|
||||
saveOrUpdateOrDeletePermissionList.add(permission);
|
||||
//代码中不存在且生产环境: 表示需要删除
|
||||
if (EnvEnum.PROD.getEnv().equals(env)) {
|
||||
removeCount++;
|
||||
permission.setDeleted(true);
|
||||
saveOrUpdateOrDeletePermissionList.add(permission);
|
||||
} else {
|
||||
log.debug("【初始化权限】<== 当前启动环境为:【{}】, 不删除系统中不存在的权限!" , env);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
//需要操作的数据=》转化为List<Permission>
|
||||
List<Permission> saveOrUpdatePermissionList = new ArrayList<>();
|
||||
if (V.notEmpty(loadCodePermissionMap)) {
|
||||
|
||||
List<PermissionStorage> permissionStorageList = loadCodePermissionMap.values().stream().collect(Collectors.toList());
|
||||
saveOrUpdatePermissionList = BeanUtils.convertList(permissionStorageList, Permission.class);
|
||||
saveOrUpdateOrDeletePermissionList.addAll(saveOrUpdatePermissionList);
|
||||
|
@ -248,7 +265,7 @@ public abstract class AbstractStorageApplicationListener implements ApplicationL
|
|||
//截取
|
||||
permissionList = saveOrUpdateOrDeletePermissionList.subList(subStartIndex, subEndIndex);
|
||||
//保存、更新、删除 权限
|
||||
boolean success = permissionService.createOrUpdateEntities(permissionList);
|
||||
boolean success = permissionService.createOrUpdateOrDeleteEntities(permissionList, BaseConfig.getBatchSize());
|
||||
if (success) {
|
||||
log.debug("【初始化权限】<== 共【{}】批次,第【{}】批次成功,调整【{}】个权限!", loopCount, i + 1, permissionList.size());
|
||||
} else {
|
||||
|
|
|
@ -2,6 +2,9 @@ package com.diboot.shiro.service;
|
|||
|
||||
import com.diboot.core.service.BaseService;
|
||||
import com.diboot.shiro.entity.Permission;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
/**
|
||||
* 许可授权相关Service
|
||||
|
@ -11,4 +14,12 @@ import com.diboot.shiro.entity.Permission;
|
|||
*/
|
||||
public interface PermissionService extends BaseService<Permission> {
|
||||
|
||||
/**
|
||||
* 批量创建或更新或删除entity(entity.id存在:【如果deleted = 1表示逻辑删除,=0表示更新】,若entity.id不存在否则新建)
|
||||
* @param entityList
|
||||
* @param batchSize
|
||||
* @return
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
boolean createOrUpdateOrDeleteEntities(Collection<Permission> entityList, int batchSize);
|
||||
}
|
||||
|
|
|
@ -1,11 +1,21 @@
|
|||
package com.diboot.shiro.service.impl;
|
||||
|
||||
import com.baomidou.mybatisplus.core.enums.SqlMethod;
|
||||
import com.baomidou.mybatisplus.core.metadata.TableInfo;
|
||||
import com.baomidou.mybatisplus.core.toolkit.*;
|
||||
import com.diboot.core.service.impl.BaseServiceImpl;
|
||||
import com.diboot.shiro.entity.Permission;
|
||||
import com.diboot.shiro.mapper.PermissionMapper;
|
||||
import com.diboot.shiro.service.PermissionService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.ibatis.binding.MapperMethod;
|
||||
import org.apache.ibatis.session.SqlSession;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Collection;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* 许可授权相关Service
|
||||
|
@ -17,4 +27,45 @@ import org.springframework.stereotype.Service;
|
|||
@Slf4j
|
||||
public class PermissionServiceImpl extends BaseServiceImpl<PermissionMapper, Permission> implements PermissionService {
|
||||
|
||||
/**
|
||||
* 批量创建或更新或删除entity(entity.id存在:【如果deleted = 1表示逻辑删除,=0表示更新】,若entity.id不存在否则新建)
|
||||
*
|
||||
* @param entityList
|
||||
* @return
|
||||
*/
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public boolean createOrUpdateOrDeleteEntities(Collection<Permission> entityList, int batchSize) {
|
||||
Assert.notEmpty(entityList, "error: entityList must not be empty");
|
||||
Class<?> cls = currentModelClass();
|
||||
TableInfo tableInfo = TableInfoHelper.getTableInfo(cls);
|
||||
Assert.notNull(tableInfo, "error: can not execute. because can not find cache of TableInfo for entity!");
|
||||
String keyProperty = tableInfo.getKeyProperty();
|
||||
Assert.notEmpty(keyProperty, "error: can not execute. because can not find column for id from entity!");
|
||||
try (SqlSession batchSqlSession = sqlSessionBatch()) {
|
||||
int i = 0;
|
||||
for (Permission entity : entityList) {
|
||||
Object idVal = ReflectionKit.getMethodValue(cls, entity, keyProperty);
|
||||
if (StringUtils.checkValNull(idVal) || Objects.isNull(getById((Serializable) idVal))) {
|
||||
batchSqlSession.insert(sqlStatement(SqlMethod.INSERT_ONE), entity);
|
||||
}
|
||||
//如果 需要删除,那么调用逻辑删除更新语句
|
||||
else if (entity.isDeleted()){
|
||||
batchSqlSession.delete(sqlStatement(SqlMethod.DELETE_BY_ID), entity.getId());
|
||||
}
|
||||
//更新数据
|
||||
else {
|
||||
MapperMethod.ParamMap<Permission> param = new MapperMethod.ParamMap<>();
|
||||
param.put(Constants.ENTITY, entity);
|
||||
batchSqlSession.update(sqlStatement(SqlMethod.UPDATE_BY_ID), param);
|
||||
}
|
||||
if (i >= 1 && i % batchSize == 0) {
|
||||
batchSqlSession.flushStatements();
|
||||
}
|
||||
i++;
|
||||
}
|
||||
batchSqlSession.flushStatements();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue