Помогите мне решить эту головоломку с реактором проекта.
В основном два оператора нуждаются в разных типах, я, казалось бы, не могу сохранить их как вниз по течению. Тем не менее, это кажется сомнительным с точки зрения дизайна.UserDto, user , usersvive , userauthenticationtoken -это пользовательские, но не относящиеся к нему типам, поэтому я не буду их включать.import org.springframework.security.authentication.ReactiveAuthenticationManager;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import reactor.core.publisher.Mono;
import java.util.Optional;
public class UserReactiveAuthenticationManager implements ReactiveAuthenticationManager {
private final UserService userService;
private final PasswordEncoder passwordEncoder;
private UserReactiveAuthenticationManager(UserService userService, PasswordEncoder passwordEncoder) {
this.userService = userService;
this.passwordEncoder = passwordEncoder;
}
public static UserReactiveAuthenticationManager of(UserService userService, PasswordEncoder passwordEncoder) {
return new UserReactiveAuthenticationManager(userService, passwordEncoder);
}
@Override
public Mono authenticate(Authentication authentication) {
return Mono.just(authentication.getPrincipal())
.ofType(UserDto.class)
.filter(this::matchesExistingUser) // needs DTO
.map(UserAuthenticationToken::from); // needs User, but loaded User no longer in scope, doesn't compile
}
private boolean matchesExistingUser(UserDto userDto) {
Optional userOptional = userService.find(userDto); // DB call
if (userOptional.isEmpty()) return false;
User user = userOptional.get();
return passwordEncoder.matches(userDto.getPassword(), user.getPassword());
}
}
< /code>
Вот сомнительное решение, которое я упомянул: < /p>
@Override
public Mono authenticate(Authentication authentication) {
return Mono.just(authentication.getPrincipal())
.ofType(UserDto.class)
.map(AuthenticationContext::from)
.filter(this::matchConfirmed)
.map(AuthenticationContext::getUser)
.map(UserAuthenticationToken::from);
}
private boolean matchConfirmed(AuthenticationContext authenticationContext) {
UserDto userDto = authenticationContext.getUserDto();
Optional userOptional = userService.find(userDto);
if (userOptional.isEmpty()) return false;
User user = userOptional.get();
authenticationContext.setUser(user); // cares about downstream operator, that's nice of them
return passwordEncoder.matches(userDto.getPassword(), user.getPassword());
}
@Setter
@Getter
private static class AuthenticationContext {
UserDto userDto;
User user;
static AuthenticationContext from(UserDto userDto) {
AuthenticationContext authenticationContext = new AuthenticationContext();
authenticationContext.setUserDto(userDto);
return authenticationContext;
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... -operators
Сохранение различных типов вниз по течению для разных операторов ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Parallelflux - параллельное выполнение с несколькими вызовами API вниз по течению
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как правильный способ сделать HTTP -запросы вниз по течению внутри Uvicorn/Fastapi?
Anonymous » » в форуме Python - 0 Ответы
- 7 Просмотры
-
Последнее сообщение Anonymous
-