Обход SpringSecurity в случае аутентификации SSO - PullRequest
0 голосов
/ 06 августа 2020

У меня есть приложение, которое использует 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 успешна?

...