diff --git a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java index 36c70e2f1..ca42b8184 100644 --- a/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java +++ b/hsweb-authorization/hsweb-authorization-basic/src/main/java/org/hswebframework/web/authorization/basic/define/DefaultBasicAuthorizeDefinition.java @@ -36,7 +36,7 @@ public class DefaultBasicAuthorizeDefinition implements AopAuthorizeDefinition { private ResourcesDefinition resources = new ResourcesDefinition(); private DimensionsDefinition dimensions = new DimensionsDefinition(); - private String message; + private String message = "权限不足,拒绝访问"; private Phased phased; diff --git a/hsweb-starter/src/main/java/org/hswebframework/web/starter/initialize/SystemInitialize.java b/hsweb-starter/src/main/java/org/hswebframework/web/starter/initialize/SystemInitialize.java index d9caf3948..b544fc23f 100644 --- a/hsweb-starter/src/main/java/org/hswebframework/web/starter/initialize/SystemInitialize.java +++ b/hsweb-starter/src/main/java/org/hswebframework/web/starter/initialize/SystemInitialize.java @@ -28,11 +28,11 @@ import java.util.stream.Collectors; * @author zhouhao */ public class SystemInitialize { - private Logger logger = LoggerFactory.getLogger(SystemInitialize.class); + private final Logger logger = LoggerFactory.getLogger(SystemInitialize.class); - private DatabaseOperator database; + private final DatabaseOperator database; //将要安装的信息 - private SystemVersion targetVersion; + private final SystemVersion targetVersion; //已安装的信息 private SystemVersion installed; diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java index 9008e09ee..b4cb0256f 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-api/src/main/java/org/hswebframework/web/system/authorization/api/entity/DimensionUserEntity.java @@ -9,6 +9,8 @@ import org.hswebframework.ezorm.rdb.mapping.annotation.EnumCodec; import org.hswebframework.web.api.crud.entity.GenericEntity; import org.hswebframework.web.dict.EnumDict; import org.hswebframework.web.system.authorization.api.enums.DimensionUserFeature; +import org.springframework.util.DigestUtils; +import org.springframework.util.StringUtils; import javax.persistence.Column; import javax.persistence.Index; @@ -68,6 +70,16 @@ public class DimensionUserEntity extends GenericEntity { @Schema(description = "其他功能") private DimensionUserFeature[] features; + public void generateId() { + if (StringUtils.isEmpty(getId())) { + String id = DigestUtils + .md5DigestAsHex(String.format("%s-%s-%s", + dimensionTypeId, + dimensionId, userId).getBytes()); + setId(id); + } + } + public boolean hasFeature(DimensionUserFeature feature) { return features != null && EnumDict.in(feature, features); } diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionUserService.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionUserService.java index d59f76683..5b8b2f7e4 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionUserService.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionUserService.java @@ -1,10 +1,12 @@ package org.hswebframework.web.system.authorization.defaults.service; import lombok.extern.slf4j.Slf4j; +import org.hswebframework.ezorm.rdb.exception.DuplicateKeyException; import org.hswebframework.ezorm.rdb.mapping.ReactiveDelete; import org.hswebframework.ezorm.rdb.mapping.ReactiveUpdate; import org.hswebframework.ezorm.rdb.mapping.defaults.SaveResult; import org.hswebframework.web.crud.service.GenericReactiveCrudService; +import org.hswebframework.web.exception.BusinessException; import org.hswebframework.web.system.authorization.api.entity.DimensionUserEntity; import org.hswebframework.web.system.authorization.api.event.ClearUserAuthorizationCacheEvent; import org.hswebframework.web.system.authorization.api.event.UserDeletedEvent; @@ -35,8 +37,9 @@ public class DefaultDimensionUserService extends GenericReactiveCrudService save(Publisher entityPublisher) { return Flux.from(entityPublisher) - .doOnNext(entity -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.of(entity.getUserId()))) - .as(super::save); + .doOnNext(DimensionUserEntity::generateId) + .doOnNext(entity -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.of(entity.getUserId()))) + .as(super::save); } @Override @@ -49,18 +52,21 @@ public class DefaultDimensionUserService extends GenericReactiveCrudService insert(Publisher entityPublisher) { return Flux.from(entityPublisher) - .doOnNext(entity -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.of(entity.getUserId()))) - .as(super::insert); + .doOnNext(DimensionUserEntity::generateId) + .doOnNext(entity -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.of(entity.getUserId()))) + .as(super::insert) + .onErrorMap(DuplicateKeyException.class, (err) -> new BusinessException("重复的绑定请求")); } @Override public Mono insertBatch(Publisher> entityPublisher) { return Flux.from(entityPublisher) - .doOnNext(entity -> eventPublisher.publishEvent(ClearUserAuthorizationCacheEvent.of(entity - .stream() - .map(DimensionUserEntity::getUserId) - .collect(Collectors.toSet())))) - .as(super::insertBatch); + .doOnNext(entity -> eventPublisher + .publishEvent(ClearUserAuthorizationCacheEvent + .of(entity.stream() + .map(DimensionUserEntity::getUserId) + .collect(Collectors.toSet())))) + .as(super::insertBatch); } @Override @@ -75,24 +81,25 @@ public class DefaultDimensionUserService extends GenericReactiveCrudService createUpdate() { return super.createUpdate() - .onExecute((update, r) -> r.doOnSuccess(i -> { - createQuery() - .select(DimensionUserEntity::getUserId) - .setParam(update.toQueryParam()) - .fetch() - .map(DimensionUserEntity::getUserId) - .collectList() - .map(ClearUserAuthorizationCacheEvent::of) - .subscribe(); - })); + .onExecute((update, r) -> r + .doOnSuccess(i -> { + this.createQuery() + .select(DimensionUserEntity::getUserId) + .setParam(update.toQueryParam()) + .fetch() + .map(DimensionUserEntity::getUserId) + .collectList() + .map(ClearUserAuthorizationCacheEvent::of) + .subscribe(); + })); } @Override @SuppressWarnings("all") public ReactiveDelete createDelete() { return super.createDelete() - .onExecute((delete, r) -> r.doOnSuccess(i -> { - createQuery() + .onExecute((delete, r) -> r.doOnSuccess(i -> { + this.createQuery() .select(DimensionUserEntity::getUserId) .setParam(delete.toQueryParam()) .fetch() @@ -100,6 +107,6 @@ public class DefaultDimensionUserService extends GenericReactiveCrudService