У меня есть приложение, которое использует Spring Security для аутентификации пользователей. Теперь клиенту необходимо добавить SSO Login с использованием Active Directory для аутентификации и имеет условие, что если учетные данные пользователя аутентифицированы с использованием SSO, нам нужно еще раз проверить, присутствует ли пользователь в базе данных приложения, если да, то мы разрешаем пользователю доступ приложение, в противном случае пользователю не разрешено, и если AD возвращается как не аутентифицированный, тогда пользователь проверяется только по базе данных приложения с использованием безопасности Spring. То же самое, что и мы, мы вызвали URL-адрес безопасности Spring из формы входа и реализовали код, как показано ниже
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
try {
User domainUser = null;
logger.info("[LOGIN] - login with user :" + username);
SSOUserInfo ssoUserInfo = SSOAuthentication.AuthenticateWithSSO(username, password);
if (ssoUserInfo.getResponseStatusCode() == HttpStatus.OK.value()) {
sgId = ssoUserInfo.getStGoSGI();
domainUser = repository.findByLogin(sgId);
} else {
domainUser = repository.findByLogin(username);
}
if (domainUser != null) {
if (domainUser.getProfile().getProfileType().equals(Role.ROLE_MOBILE.getMessageKey())) {
logger.info("[LOGIN] - user : " + username + " : not Authorized to login");
throw new UserNotAuthorizedException(Credentials.NOT_VALID_PROFILE.getMessageKey());
} else {
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new CustomUser(domainUser, domainUser.isState(), accountNonExpired, credentialsNonExpired, accountNonLocked, getGrantedAuthorities(domainUser.getProfile().getRoles()));
}
}
}
public class CustomUser extends org.springframework.security.core.userdetails.User {
private static final long serialVersionUID = 1L;
private Long userId;
private static final Logger logger = LoggerFactory.getLogger(CustomUser.class);
public CustomUser(User principal, boolean enabled, boolean accountNonExpired, boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities) {
super(principal.getLogin(), principal.getPassword(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
logger.info("[LOGIN] - login with user :" + principal.getLogin());
logger.info("[LOGIN] Users :" + principal.getLogin() + ":state: " + enabled);
this.setUserId(principal.getIdUser());
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
}
Но в этом случае мы сталкиваемся с проблемой, потому что в большинстве случаев пароль Пользователь в AD отличается от пароля в приложении, из-за которого происходит сбой входа в систему безопасности Spring, если проверка подлинности sso прошла успешно.
Есть ли лучший способ реализовать вышеупомянутый сценарий или есть ли какой-либо способ я может обойти безопасность Spring для авторизации и только проверить, существует ли пользователь с именем пользователя, если sso auth успешна?