package mujina.idp; import mujina.api.IdpConfiguration; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.authority.SimpleGrantedAuthority; import java.util.Arrays; import static mujina.api.AuthenticationMethod.ALL; public class AuthenticationProvider implements org.springframework.security.authentication.AuthenticationProvider { private final IdpConfiguration idpConfiguration; public AuthenticationProvider(IdpConfiguration idpConfiguration) { this.idpConfiguration = idpConfiguration; } @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { if (idpConfiguration.getAuthenticationMethod().equals(ALL)) { return new UsernamePasswordAuthenticationToken(authentication.getPrincipal(), authentication.getCredentials(), Arrays.asList( new SimpleGrantedAuthority("ROLE_ADMIN"), new SimpleGrantedAuthority("ROLE_USER") )); } else { return idpConfiguration.getUsers().stream() .filter(token -> token.getPrincipal().equals(authentication.getPrincipal()) && token.getCredentials().equals(authentication.getCredentials())) .findFirst().map(usernamePasswordAuthenticationToken -> new UsernamePasswordAuthenticationToken( //need top copy or else credentials are erased for future logins usernamePasswordAuthenticationToken.getPrincipal(), usernamePasswordAuthenticationToken.getCredentials(), usernamePasswordAuthenticationToken.getAuthorities() )) .orElseThrow(() -> new AuthenticationException("User not found or bad credentials") { }); } } @Override public boolean supports(Class<?> authentication) { return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication); } }