权限入库,增加环境变量,开发环境下不删除权限

This commit is contained in:
wuy 2019-06-25 17:26:05 +08:00
parent 70696bccb0
commit 1508147f47
7 changed files with 114 additions and 22 deletions

View File

@ -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);
}
/**

View File

@ -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;
}

View File

@ -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;

View File

@ -31,8 +31,4 @@ public class Permission extends BaseEntity {
@TableField
private String permissionName;
/**此处覆盖了父类的属性,初始化权限的时候需要设置该值,直接使用父类,无法设置*/
@TableField
private boolean deleted = false;
}

View File

@ -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) {
/**入库的环境
* 当为开发环境的时候可能会存在几个人同时书写系统权限
* 各自启动的时候所开发的权限可能存在差异会导致删除自己开发环境不存在的权限
* 所以开发环境devdev不会删除权限只会修改和递增而生产(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 {

View File

@ -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> {
/**
* 批量创建或更新或删除entityentity.id存在如果deleted = 1表示逻辑删除=0表示更新若entity.id不存在否则新建
* @param entityList
* @param batchSize
* @return
*/
@Transactional(rollbackFor = Exception.class)
boolean createOrUpdateOrDeleteEntities(Collection<Permission> entityList, int batchSize);
}

View File

@ -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 {
/**
* 批量创建或更新或删除entityentity.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;
}
}