Skip to content

Commit 4e68a76

Browse files
committed
fix(auth): 修复用户创建和更新逻辑,增加事件发布支持
1 parent 3bc4201 commit 4e68a76

File tree

2 files changed

+115
-96
lines changed
  • hsweb-system/hsweb-system-authorization

2 files changed

+115
-96
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package org.hswebframework.web.system.authorization.api.event;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Getter;
5+
import org.hswebframework.web.event.DefaultAsyncEvent;
6+
import org.hswebframework.web.system.authorization.api.entity.UserEntity;
7+
8+
/**
9+
* @author zhouhao
10+
* @since 3.0.4
11+
*/
12+
@Getter
13+
@AllArgsConstructor
14+
public class UserBeforeCreateEvent extends DefaultAsyncEvent {
15+
UserEntity userEntity;
16+
}

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

Lines changed: 99 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import reactor.core.publisher.Mono;
2828

2929
import jakarta.validation.ValidationException;
30+
3031
import java.util.Objects;
3132

3233

@@ -59,14 +60,14 @@ public Mono<UserEntity> newUserInstance() {
5960
@Transactional(rollbackFor = Exception.class, transactionManager = TransactionManagers.reactiveTransactionManager)
6061
public Mono<Boolean> saveUser(Mono<UserEntity> request) {
6162
return request
62-
.flatMap(userEntity -> {
63-
if (ObjectUtils.isEmpty(userEntity.getId())) {
64-
return doAdd(userEntity);
65-
}
66-
return findById(userEntity.getId())
67-
.flatMap(old -> doUpdate(old, userEntity))
68-
.switchIfEmpty(doAdd(userEntity));
69-
}).thenReturn(true);
63+
.flatMap(userEntity -> {
64+
if (ObjectUtils.isEmpty(userEntity.getId())) {
65+
return doAdd(userEntity);
66+
}
67+
return findById(userEntity.getId())
68+
.flatMap(old -> doUpdate(old, userEntity))
69+
.switchIfEmpty(doAdd(userEntity));
70+
}).thenReturn(true);
7071
}
7172

7273
@Override
@@ -75,15 +76,17 @@ public Mono<UserEntity> addUser(UserEntity userEntity) {
7576
}
7677

7778
protected Mono<UserEntity> doAdd(UserEntity userEntity) {
78-
79-
return Mono
80-
.defer(() -> {
81-
usernameValidator.validate(userEntity.getUsername());
82-
passwordValidator.validate(userEntity.getPassword());
83-
userEntity.generateId();
84-
userEntity.setSalt(IDGenerator.RANDOM.generate());
85-
userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
86-
return this
79+
return new UserBeforeCreateEvent(userEntity)
80+
.publish(eventPublisher)
81+
.then(
82+
Mono
83+
.defer(() -> {
84+
usernameValidator.validate(userEntity.getUsername());
85+
passwordValidator.validate(userEntity.getPassword());
86+
userEntity.generateId();
87+
userEntity.setSalt(IDGenerator.RANDOM.generate());
88+
userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword(), userEntity.getSalt()));
89+
return this
8790
.createQuery()
8891
.where(userEntity::getUsername)
8992
.fetch()
@@ -98,43 +101,43 @@ protected Mono<UserEntity> doAdd(UserEntity userEntity) {
98101
.thenReturn(userEntity)
99102
.flatMap(user -> new UserCreatedEvent(user).publish(eventPublisher))
100103
.thenReturn(userEntity);
101-
});
104+
}));
102105

103106
}
104107

105108

106109
protected Mono<UserEntity> doUpdate(UserEntity old, UserEntity newer) {
107110
return Mono
108-
.defer(() -> {
109-
boolean updatePassword = StringUtils.hasText(newer.getPassword());
110-
111-
boolean passwordChanged = updatePassword &&
112-
!Objects.equals(
113-
passwordEncoder.encode(newer.getPassword(), old.getSalt()),
114-
old.getPassword()
115-
);
116-
117-
String newPassword = passwordChanged ? newer.getPassword() : null;
118-
if (updatePassword) {
119-
newer.setSalt(IDGenerator.RANDOM.generate());
120-
passwordValidator.validate(newer.getPassword());
121-
newer.setPassword(passwordEncoder.encode(newer.getPassword(), newer.getSalt()));
122-
}
123-
UserEntity copyEntity = old.copyTo(new UserEntity());
124-
UserEntity newEntity = newer.copyTo(copyEntity);
125-
return getRepository()
126-
.createUpdate()
127-
.set(newer)
128-
.where(newer::getId)
129-
.execute()
130-
.flatMap(__ -> new UserModifiedEvent(old, newEntity, passwordChanged, newPassword)
131-
.publish(eventPublisher)
132-
.thenReturn(newEntity))
133-
.flatMap(e -> ClearUserAuthorizationCacheEvent
134-
.of(e.getId())
135-
.publish(eventPublisher)
136-
.thenReturn(e));
137-
});
111+
.defer(() -> {
112+
boolean updatePassword = StringUtils.hasText(newer.getPassword());
113+
114+
boolean passwordChanged = updatePassword &&
115+
!Objects.equals(
116+
passwordEncoder.encode(newer.getPassword(), old.getSalt()),
117+
old.getPassword()
118+
);
119+
120+
String newPassword = passwordChanged ? newer.getPassword() : null;
121+
if (updatePassword) {
122+
newer.setSalt(IDGenerator.RANDOM.generate());
123+
passwordValidator.validate(newer.getPassword());
124+
newer.setPassword(passwordEncoder.encode(newer.getPassword(), newer.getSalt()));
125+
}
126+
UserEntity copyEntity = old.copyTo(new UserEntity());
127+
UserEntity newEntity = newer.copyTo(copyEntity);
128+
return getRepository()
129+
.createUpdate()
130+
.set(newer)
131+
.where(newer::getId)
132+
.execute()
133+
.flatMap(__ -> new UserModifiedEvent(old, newEntity, passwordChanged, newPassword)
134+
.publish(eventPublisher)
135+
.thenReturn(newEntity))
136+
.flatMap(e -> ClearUserAuthorizationCacheEvent
137+
.of(e.getId())
138+
.publish(eventPublisher)
139+
.thenReturn(e));
140+
});
138141

139142
}
140143

@@ -149,22 +152,22 @@ public Mono<UserEntity> findById(String id) {
149152
public Mono<UserEntity> findByUsername(String username) {
150153
return Mono.justOrEmpty(username)
151154
.flatMap(_name -> repository
152-
.createQuery()
153-
.where(UserEntity::getUsername, _name)
154-
.fetchOne());
155+
.createQuery()
156+
.where(UserEntity::getUsername, _name)
157+
.fetchOne());
155158
}
156159

157160
@Override
158161
@Transactional(readOnly = true, transactionManager = TransactionManagers.reactiveTransactionManager)
159162
public Mono<UserEntity> findByUsernameAndPassword(String username, String plainPassword) {
160163
return Mono.justOrEmpty(username)
161164
.flatMap(_name -> repository
162-
.createQuery()
163-
.where(UserEntity::getUsername, _name)
164-
.fetchOne())
165+
.createQuery()
166+
.where(UserEntity::getUsername, _name)
167+
.fetchOne())
165168
.filter(user -> passwordEncoder
166-
.encode(plainPassword, user.getSalt())
167-
.equals(user.getPassword()));
169+
.encode(plainPassword, user.getSalt())
170+
.equals(user.getPassword()));
168171
}
169172

170173
@Override
@@ -174,16 +177,16 @@ public Mono<Integer> changeState(Publisher<String> userId, byte state) {
174177
.collectList()
175178
.filter(CollectionUtils::isNotEmpty)
176179
.flatMap(list -> repository
177-
.createUpdate()
178-
.set(UserEntity::getStatus, state)
179-
.where()
180-
.in(UserEntity::getId, list)
181-
.execute()
182-
.flatMap(i -> UserStateChangedEvent
183-
.of(list, state)
184-
.publish(eventPublisher)
185-
.thenReturn(i)
186-
)
180+
.createUpdate()
181+
.set(UserEntity::getStatus, state)
182+
.where()
183+
.in(UserEntity::getId, list)
184+
.execute()
185+
.flatMap(i -> UserStateChangedEvent
186+
.of(list, state)
187+
.publish(eventPublisher)
188+
.thenReturn(i)
189+
)
187190
)
188191
.defaultIfEmpty(0);
189192
}
@@ -193,54 +196,54 @@ public Mono<Integer> changeState(Publisher<String> userId, byte state) {
193196
public Mono<Boolean> changePassword(String userId, String oldPassword, String newPassword) {
194197
passwordValidator.validate(newPassword);
195198
return findById(userId)
196-
.switchIfEmpty(Mono.error(NotFoundException.NoStackTrace::new))
197-
.filter(user -> passwordEncoder.encode(oldPassword, user.getSalt()).equals(user.getPassword()))
198-
.switchIfEmpty(Mono.error(() -> new ValidationException("error.illegal_user_password")))
199-
.flatMap(old -> {
200-
String encodePwd = passwordEncoder.encode(newPassword, old.getSalt());
201-
202-
boolean passwordChanged = !Objects.equals(encodePwd, old.getPassword());
203-
UserEntity newer = old.copyTo(new UserEntity());
204-
newer.setPassword(encodePwd);
205-
return repository
206-
.createUpdate()
207-
.set(newer::getPassword)
208-
.where(newer::getId)
209-
.execute()
210-
.flatMap(e -> new UserModifiedEvent(old, newer, passwordChanged, newPassword)
211-
.publish(eventPublisher)
212-
.thenReturn(e));
213-
})
214-
.map(i -> i > 0);
199+
.switchIfEmpty(Mono.error(NotFoundException.NoStackTrace::new))
200+
.filter(user -> passwordEncoder.encode(oldPassword, user.getSalt()).equals(user.getPassword()))
201+
.switchIfEmpty(Mono.error(() -> new ValidationException("error.illegal_user_password")))
202+
.flatMap(old -> {
203+
String encodePwd = passwordEncoder.encode(newPassword, old.getSalt());
204+
205+
boolean passwordChanged = !Objects.equals(encodePwd, old.getPassword());
206+
UserEntity newer = old.copyTo(new UserEntity());
207+
newer.setPassword(encodePwd);
208+
return repository
209+
.createUpdate()
210+
.set(newer::getPassword)
211+
.where(newer::getId)
212+
.execute()
213+
.flatMap(e -> new UserModifiedEvent(old, newer, passwordChanged, newPassword)
214+
.publish(eventPublisher)
215+
.thenReturn(e));
216+
})
217+
.map(i -> i > 0);
215218
}
216219

217220
@Override
218221
@Transactional(readOnly = true, transactionManager = TransactionManagers.reactiveTransactionManager)
219222
public Flux<UserEntity> findUser(QueryParam queryParam) {
220223
return repository
221-
.createQuery()
222-
.setParam(queryParam)
223-
.fetch();
224+
.createQuery()
225+
.setParam(queryParam)
226+
.fetch();
224227
}
225228

226229
@Override
227230
@Transactional(readOnly = true, transactionManager = TransactionManagers.reactiveTransactionManager)
228231
public Mono<Integer> countUser(QueryParam queryParam) {
229232
return repository
230-
.createQuery()
231-
.setParam(queryParam)
232-
.count();
233+
.createQuery()
234+
.setParam(queryParam)
235+
.count();
233236
}
234237

235238
@Override
236239
@Transactional(transactionManager = TransactionManagers.reactiveTransactionManager)
237240
public Mono<Boolean> deleteUser(String userId) {
238241
return this
239-
.findById(userId)
240-
.flatMap(user -> this
241-
.deleteById(Mono.just(userId))
242-
.flatMap(i -> new UserDeletedEvent(user).publish(eventPublisher))
243-
.thenReturn(true));
242+
.findById(userId)
243+
.flatMap(user -> this
244+
.deleteById(Mono.just(userId))
245+
.flatMap(i -> new UserDeletedEvent(user).publish(eventPublisher))
246+
.thenReturn(true));
244247
}
245248

246249
@Override

0 commit comments

Comments
 (0)