Skip to content

Commit 2c6dce8

Browse files
committed
refactor: 优化用户权限初始化逻辑
1 parent d4f01dc commit 2c6dce8

File tree

6 files changed

+199
-77
lines changed

6 files changed

+199
-77
lines changed

hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/configuration/AuthorizationServiceAutoConfiguration.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,26 +5,35 @@
55
import org.hswebframework.web.authorization.ReactiveAuthenticationManagerProvider;
66
import org.hswebframework.web.authorization.define.AuthorizeDefinitionCustomizer;
77
import org.hswebframework.web.authorization.define.CompositeAuthorizeDefinitionCustomizer;
8-
import org.hswebframework.web.authorization.simple.DefaultAuthorizationAutoConfiguration;
98
import org.hswebframework.web.authorization.token.UserTokenManager;
10-
import org.hswebframework.web.system.authorization.api.UserDimensionProvider;
119
import org.hswebframework.web.system.authorization.api.entity.PermissionEntity;
1210
import org.hswebframework.web.system.authorization.api.service.reactive.ReactiveUserService;
1311
import org.hswebframework.web.system.authorization.defaults.service.*;
1412
import org.hswebframework.web.system.authorization.defaults.service.terms.DimensionTerm;
1513
import org.hswebframework.web.system.authorization.defaults.service.terms.UserDimensionTerm;
1614
import org.springframework.beans.factory.ObjectProvider;
15+
import org.springframework.beans.factory.SmartInitializingSingleton;
1716
import org.springframework.boot.autoconfigure.AutoConfiguration;
18-
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
1917
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2018
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
19+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2120
import org.springframework.context.annotation.Bean;
22-
import org.springframework.context.annotation.Configuration;
2321

2422

23+
@EnableConfigurationProperties({AuthenticationInitializeProperties.class})
2524
@AutoConfiguration
2625
public class AuthorizationServiceAutoConfiguration {
2726

27+
@Bean
28+
public SmartInitializingSingleton authenticationInitializeCustomizerExecutor(AuthenticationInitializeProperties properties,
29+
ObjectProvider<AuthenticationInitializeCustomizer> customizers) {
30+
return () -> {
31+
for (AuthenticationInitializeCustomizer customizer : customizers) {
32+
customizer.customize(properties);
33+
}
34+
};
35+
}
36+
2837
@AutoConfiguration
2938
public static class ReactiveAuthorizationServiceAutoConfiguration {
3039

@@ -80,7 +89,7 @@ public DefaultPermissionService defaultPermissionService() {
8089

8190
@Bean
8291
@ConditionalOnBean(UserTokenManager.class)
83-
public RemoveUserTokenWhenUserDisabled removeUserTokenWhenUserDisabled(UserTokenManager tokenManager){
92+
public RemoveUserTokenWhenUserDisabled removeUserTokenWhenUserDisabled(UserTokenManager tokenManager) {
8493
return new RemoveUserTokenWhenUserDisabled(tokenManager);
8594
}
8695
}
@@ -91,11 +100,12 @@ public UserDimensionTerm userDimensionTerm() {
91100
}
92101

93102
@Bean
94-
public DimensionTerm dimensionTerm(){
103+
public DimensionTerm dimensionTerm() {
95104
return new DimensionTerm();
96105
}
106+
97107
@Bean
98-
public PermissionProperties permissionProperties(){
108+
public PermissionProperties permissionProperties() {
99109
return new PermissionProperties();
100110
}
101111
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.hswebframework.web.system.authorization.defaults.service;
2+
3+
import org.hswebframework.web.authorization.DimensionType;
4+
5+
/**
6+
* 认证信息初始化自定义接口
7+
*
8+
* @apiNote
9+
* @since 5.0.1
10+
*/
11+
public interface AuthenticationInitializeCustomizer {
12+
13+
void customize(Context context);
14+
15+
16+
interface Context {
17+
18+
/**
19+
* 启动某个维度的权限设置功能
20+
*
21+
* @param dimensionType 维度类型
22+
* @see DimensionType#getId()
23+
* @see org.hswebframework.web.system.authorization.api.entity.AuthorizationSettingEntity
24+
* @see DefaultAuthorizationSettingService
25+
*/
26+
void enableDimension(String dimensionType);
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package org.hswebframework.web.system.authorization.defaults.service;
2+
3+
import lombok.Getter;
4+
import lombok.Setter;
5+
import org.springframework.boot.context.properties.ConfigurationProperties;
6+
7+
import java.util.HashSet;
8+
import java.util.Set;
9+
10+
@Getter
11+
@Setter
12+
@ConfigurationProperties(prefix = "hsweb.permission.initialize")
13+
public class AuthenticationInitializeProperties implements AuthenticationInitializeCustomizer.Context {
14+
15+
private Set<String> enabledDimensions;
16+
17+
public boolean isDimensionEnabled(String dimensionType) {
18+
return enabledDimensions == null || enabledDimensions.contains("*") || enabledDimensions.contains(dimensionType);
19+
}
20+
21+
@Override
22+
public synchronized void enableDimension(String dimensionType) {
23+
if (enabledDimensions == null) {
24+
enabledDimensions = new HashSet<>();
25+
}
26+
enabledDimensions.add(dimensionType);
27+
}
28+
29+
30+
}

hsweb-system/hsweb-system-authorization/hsweb-system-authorization-default/src/main/java/org/hswebframework/web/system/authorization/defaults/service/DefaultDimensionService.java

Lines changed: 54 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.hswebframework.web.system.authorization.defaults.service;
22

33
import org.apache.commons.collections4.CollectionUtils;
4+
import org.apache.commons.collections4.MapUtils;
45
import org.hswebframework.ezorm.rdb.mapping.ReactiveRepository;
56
import org.hswebframework.web.authorization.Dimension;
67
import org.hswebframework.web.authorization.DimensionProvider;
@@ -20,18 +21,21 @@
2021
import org.springframework.beans.factory.annotation.Autowired;
2122
import org.springframework.context.ApplicationEventPublisher;
2223
import org.springframework.context.event.EventListener;
24+
import org.springframework.transaction.annotation.Transactional;
2325
import reactor.core.publisher.Flux;
2426
import reactor.core.publisher.Mono;
2527

28+
import java.time.Duration;
2629
import java.util.Collection;
2730
import java.util.List;
2831
import java.util.function.Function;
2932
import java.util.stream.Collectors;
3033

34+
@Deprecated
3135
public class DefaultDimensionService
32-
extends GenericReactiveTreeSupportCrudService<DimensionEntity, String>
33-
implements
34-
DimensionProvider, DimensionUserBindProvider {
36+
extends GenericReactiveTreeSupportCrudService<DimensionEntity, String>
37+
implements
38+
DimensionProvider, DimensionUserBindProvider {
3539

3640
@Autowired
3741
private ReactiveRepository<DimensionUserEntity, String> dimensionUserRepository;
@@ -52,20 +56,25 @@ public void setChildren(DimensionEntity entity, List<DimensionEntity> children)
5256
entity.setChildren(children);
5357
}
5458

59+
private Flux<DimensionTypeEntity> allCache;
60+
5561
@Override
5662
public Flux<DimensionTypeEntity> getAllType() {
57-
return dimensionTypeRepository
58-
.createQuery()
59-
.fetch();
63+
if (allCache == null) {
64+
return allCache = Flux
65+
.defer(()-> dimensionTypeRepository.createQuery().fetch())
66+
.cache(Duration.ofSeconds(1));
67+
}
68+
return allCache;
6069
}
6170

6271
@Override
6372
public Mono<DynamicDimension> getDimensionById(DimensionType type, String id) {
6473
return createQuery()
65-
.where(DimensionEntity::getId, id)
66-
.fetch()
67-
.singleOrEmpty()
68-
.map(entity -> DynamicDimension.of(entity, type));
74+
.where(DimensionEntity::getId, id)
75+
.fetch()
76+
.singleOrEmpty()
77+
.map(entity -> DynamicDimension.of(entity, type));
6978
}
7079

7180
@Override
@@ -78,70 +87,72 @@ public Flux<? extends Dimension> getDimensionsById(DimensionType type, Collectio
7887
}
7988

8089
@Override
90+
@Transactional(readOnly = true)
8191
public Flux<DynamicDimension> getDimensionByUserId(String userId) {
8292
return getAllType()
83-
.collect(Collectors.toMap(DimensionType::getId, Function.identity()))
84-
.flatMapMany(typeGrouping -> dimensionUserRepository
85-
.createQuery()
86-
.where(DimensionUserEntity::getUserId, userId)
87-
.fetch()
88-
.collectList()
89-
.filter(CollectionUtils::isNotEmpty)
90-
.flatMapMany(list -> {
91-
//查询所有的维度
92-
return this
93-
.queryIncludeChildren(list.stream()
94-
.map(DimensionUserEntity::getDimensionId)
95-
.collect(Collectors.toSet()))
96-
.filter(dimension -> typeGrouping.containsKey(dimension.getTypeId()))
97-
.map(dimension ->
98-
DynamicDimension.of(dimension, typeGrouping.get(dimension.getTypeId()))
99-
);
100-
101-
})
102-
);
93+
.collect(Collectors.toMap(DimensionType::getId, Function.identity()))
94+
.filter(MapUtils::isNotEmpty)
95+
.flatMapMany(typeGrouping -> dimensionUserRepository
96+
.createQuery()
97+
.where(DimensionUserEntity::getUserId, userId)
98+
.fetch()
99+
.collectList()
100+
.filter(CollectionUtils::isNotEmpty)
101+
.flatMapMany(list -> {
102+
//查询所有的维度
103+
return this
104+
.queryIncludeChildren(list.stream()
105+
.map(DimensionUserEntity::getDimensionId)
106+
.collect(Collectors.toSet()))
107+
.filter(dimension -> typeGrouping.containsKey(dimension.getTypeId()))
108+
.map(dimension ->
109+
DynamicDimension.of(dimension, typeGrouping.get(dimension.getTypeId()))
110+
);
111+
112+
})
113+
);
103114
}
104115

105116
@Override
106117
public Flux<DimensionUserBind> getDimensionBindInfo(Collection<String> userIdList) {
107118
return dimensionUserRepository
108-
.createQuery()
109-
.in(DimensionUserEntity::getUserId, userIdList)
110-
.fetch()
111-
.map(entity -> DimensionUserBind.of(entity.getUserId(), entity.getDimensionTypeId(), entity.getDimensionId()));
119+
.createQuery()
120+
.in(DimensionUserEntity::getUserId, userIdList)
121+
.fetch()
122+
.map(entity -> DimensionUserBind.of(entity.getUserId(), entity.getDimensionTypeId(), entity.getDimensionId()));
112123
}
113124

114125
@Override
115126
@SuppressWarnings("all")
116127
public Flux<String> getUserIdByDimensionId(String dimensionId) {
117128
return dimensionUserRepository
118-
.createQuery()
119-
.select(DimensionUserEntity::getUserId)
120-
.where(DimensionUserEntity::getDimensionId, dimensionId)
121-
.fetch()
122-
.map(DimensionUserEntity::getUserId);
129+
.createQuery()
130+
.select(DimensionUserEntity::getUserId)
131+
.where(DimensionUserEntity::getDimensionId, dimensionId)
132+
.fetch()
133+
.map(DimensionUserEntity::getUserId);
123134
}
124135

125136
@EventListener
126137
public void handleDimensionChanged(EntitySavedEvent<DimensionEntity> event) {
127138
event.async(
128-
ClearUserAuthorizationCacheEvent.all().publish(eventPublisher)
139+
ClearUserAuthorizationCacheEvent.all().publish(eventPublisher)
129140
);
130141
}
131142

132143
@EventListener
133144
public void handleDimensionChanged(EntityModifyEvent<DimensionEntity> event) {
134145
event.async(
135-
ClearUserAuthorizationCacheEvent.all().publish(eventPublisher)
146+
ClearUserAuthorizationCacheEvent.all().publish(eventPublisher)
136147
);
137148
}
138149

139150
@EventListener
140151
public void dispatchDimensionDeleteEvent(EntityDeletedEvent<DimensionEntity> event) {
141152

142153
event.async(
143-
Flux.fromIterable(event.getEntity())
144-
.flatMap(e -> new DimensionDeletedEvent(e.getTypeId(), e.getId()).publish(eventPublisher))
154+
Flux.fromIterable(event.getEntity())
155+
.flatMap(e -> new DimensionDeletedEvent(e.getTypeId(), e.getId()).publish(eventPublisher))
145156
);
146157
}
147158

0 commit comments

Comments
 (0)