From 69ab5f632d56cb71bbbba4fc412453068a7bdc02 Mon Sep 17 00:00:00 2001 From: zhouhao Date: Wed, 3 Aug 2022 20:01:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9D=83=E9=99=90=E5=90=88?= =?UTF-8?q?=E5=B9=B6=E4=BB=A5=E5=8F=8A=E6=9D=83=E9=99=90=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../events/AuthorizationInitializeEvent.java | 5 +- .../simple/SimpleAuthentication.java | 18 ++-- ...activeAuthenticationInitializeService.java | 88 +++++++++++-------- 3 files changed, 67 insertions(+), 44 deletions(-) diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java index 6144f6c5f..93f9bb261 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/events/AuthorizationInitializeEvent.java @@ -2,11 +2,14 @@ package org.hswebframework.web.authorization.events; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.Setter; import org.hswebframework.web.authorization.Authentication; +import org.hswebframework.web.event.DefaultAsyncEvent; @Getter +@Setter @AllArgsConstructor -public class AuthorizationInitializeEvent { +public class AuthorizationInitializeEvent extends DefaultAsyncEvent { private Authentication authentication; } diff --git a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java index 8d8ef7e7d..720e20c56 100644 --- a/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java +++ b/hsweb-authorization/hsweb-authorization-api/src/main/java/org/hswebframework/web/authorization/simple/SimpleAuthentication.java @@ -58,10 +58,16 @@ public class SimpleAuthentication implements Authentication { } public SimpleAuthentication merge(Authentication authentication) { - Map mePermissionGroup = permissions.stream() + Map mePermissionGroup = permissions + .stream() .collect(Collectors.toMap(Permission::getId, Function.identity())); - user = authentication.getUser(); + + if (authentication.getUser() != null) { + user = authentication.getUser(); + } + attributes.putAll(authentication.getAttributes()); + for (Permission permission : authentication.getPermissions()) { Permission me = mePermissionGroup.get(permission.getId()); if (me == null) { @@ -88,10 +94,10 @@ public class SimpleAuthentication implements Authentication { authentication.setUser(user); authentication.setDimensions(dimensions.stream().filter(dimension).collect(Collectors.toList())); authentication.setPermissions(permissions - .stream() - .map(permission -> permission.copy(action -> permissionFilter.test(permission, action), conf -> true)) - .filter(per -> !per.getActions().isEmpty()) - .collect(Collectors.toList()) + .stream() + .map(permission -> permission.copy(action -> permissionFilter.test(permission, action), conf -> true)) + .filter(per -> !per.getActions().isEmpty()) + .collect(Collectors.toList()) ); return authentication; } diff --git a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveAuthenticationInitializeService.java b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveAuthenticationInitializeService.java index b3fc14096..44d431e14 100644 --- a/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveAuthenticationInitializeService.java +++ b/hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultReactiveAuthenticationInitializeService.java @@ -10,6 +10,7 @@ import org.hswebframework.web.authorization.ReactiveAuthenticationInitializeServ import org.hswebframework.web.authorization.access.DataAccessConfig; import org.hswebframework.web.authorization.access.DataAccessType; import org.hswebframework.web.authorization.builder.DataAccessConfigBuilderFactory; +import org.hswebframework.web.authorization.events.AuthorizationInitializeEvent; import org.hswebframework.web.authorization.simple.SimpleAuthentication; import org.hswebframework.web.authorization.simple.SimplePermission; import org.hswebframework.web.authorization.simple.SimpleUser; @@ -21,6 +22,7 @@ import org.hswebframework.web.system.authorization.api.entity.PermissionEntity; import org.hswebframework.web.system.authorization.api.entity.UserEntity; import org.hswebframework.web.system.authorization.api.service.reactive.ReactiveUserService; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationEventPublisher; import org.springframework.util.StringUtils; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -48,6 +50,9 @@ public class DefaultReactiveAuthenticationInitializeService @Autowired(required = false) private List dimensionProviders = new ArrayList<>(); + @Autowired + private ApplicationEventPublisher eventPublisher; + @Override public Mono initUserAuthorization(String userId) { return doInit(userService.findById(userId)); @@ -58,17 +63,23 @@ public class DefaultReactiveAuthenticationInitializeService return userEntityMono.flatMap(user -> { SimpleAuthentication authentication = new SimpleAuthentication(); authentication.setUser(SimpleUser - .builder() - .id(user.getId()) - .name(user.getName()) - .username(user.getUsername()) - .userType(user.getType()) - .build()); + .builder() + .id(user.getId()) + .name(user.getName()) + .username(user.getUsername()) + .userType(user.getType()) + .build()); return initPermission(authentication) .switchIfEmpty(Mono.just(authentication)) .onErrorResume(err -> { log.warn(err.getMessage(), err); return Mono.just(authentication); + }) + .flatMap(auth -> { + AuthorizationInitializeEvent event = new AuthorizationInitializeEvent(auth); + return event + .publish(eventPublisher) + .then(Mono.fromSupplier(event::getAuthentication)); }); }); @@ -76,31 +87,31 @@ public class DefaultReactiveAuthenticationInitializeService protected Flux getSettings(List dimensions) { return Flux.fromIterable(dimensions) - .filter(dimension -> dimension.getType() != null) - .groupBy(d -> d.getType().getId(), (Function) Dimension::getId) - .flatMap(group -> - group.collectList() - .flatMapMany(list -> settingRepository - .createQuery() - .where(AuthorizationSettingEntity::getState, 1) - .and(AuthorizationSettingEntity::getDimensionType, group.key()) - .in(AuthorizationSettingEntity::getDimensionTarget, list) - .fetch())); + .filter(dimension -> dimension.getType() != null) + .groupBy(d -> d.getType().getId(), (Function) Dimension::getId) + .flatMap(group -> + group.collectList() + .flatMapMany(list -> settingRepository + .createQuery() + .where(AuthorizationSettingEntity::getState, 1) + .and(AuthorizationSettingEntity::getDimensionType, group.key()) + .in(AuthorizationSettingEntity::getDimensionTarget, list) + .fetch())); } protected Mono initPermission(SimpleAuthentication authentication) { return Flux.fromIterable(dimensionProviders) - .flatMap(provider -> provider.getDimensionByUserId(authentication.getUser().getId())) - .cast(Dimension.class) - .collectList() - .doOnNext(authentication::setDimensions) - .flatMap(allDimension -> - Mono.zip( - getAllPermission() - , getSettings(allDimension) - .collect(Collectors.groupingBy(AuthorizationSettingEntity::getPermission)) - , (_p, _s) -> handlePermission(authentication, allDimension, _p, _s) - )); + .flatMap(provider -> provider.getDimensionByUserId(authentication.getUser().getId())) + .cast(Dimension.class) + .collectList() + .doOnNext(authentication::setDimensions) + .flatMap(allDimension -> + Mono.zip( + getAllPermission() + , getSettings(allDimension) + .collect(Collectors.groupingBy(AuthorizationSettingEntity::getPermission)) + , (_p, _s) -> handlePermission(authentication, allDimension, _p, _s) + )); } @@ -134,16 +145,19 @@ public class DefaultReactiveAuthenticationInitializeService if (permissionSetting.getDataAccesses() != null) { permissionSetting.getDataAccesses() - .stream() - .map(conf -> { - DataAccessConfig config = builderFactory.create().fromMap(conf.toMap()).build(); - if (config == null) { - log.warn("unsupported data access:{}", conf.toMap()); - } - return config; - }) - .filter(Objects::nonNull) - .forEach(configs::add); + .stream() + .map(conf -> { + DataAccessConfig config = builderFactory + .create() + .fromMap(conf.toMap()) + .build(); + if (config == null) { + log.warn("unsupported data access:{}", conf.toMap()); + } + return config; + }) + .filter(Objects::nonNull) + .forEach(configs::add); } if (CollectionUtils.isNotEmpty(permissionSetting.getActions())) { permission.getActions().addAll(permissionSetting.getActions());