package br.com.ec.controller.seguranca;
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import br.com.ec.domain.model.Usuario;
import br.com.ec.domain.model.UsuarioPerfil;
import br.com.ec.domain.service.usuario.UsuarioService;
import br.com.ec.domain.shared.SistemaAuthentication;
public class SistemaAuthenticationProvider
implements AuthenticationProvider
{
@Autowired
private UsuarioService usuarioService
;
public boolean supports
(Class<? extends Object> authentication
) {
return UsernamePasswordAuthenticationToken.
class.
isAssignableFrom(authentication
);
}
public Authentication authenticate
(Authentication authentication
) throws AuthenticationException {
try {
Usuario usuario =
new Usuario
();
usuario.
setLogin((String)authentication.
getPrincipal());
usuario.
setSenha((String)authentication.
getCredentials());
usuario = usuarioService.
efetuarLogin(usuario
);
if (usuario ==
null) {
throw new BadCredentialsException
("Usuário inválido!");
}
Collection<GrantedAuthority
> authorities = obterPermissoes
(usuario
);
return criarAuthentication
(authentication, usuario, authorities
);
} catch (Exception e
) {
throw new BadCredentialsException
(e.
getMessage());
}
}
private SistemaAuthentication criarAuthentication
(Authentication sistemaAuthentication, Usuario usuario,
Collection<GrantedAuthority
> authorities
) {
return new SistemaAuthentication
(
String.
valueOf(sistemaAuthentication.
getPrincipal()),
String.
valueOf(sistemaAuthentication.
getCredentials()),
usuario, authorities
);
}
private Collection<GrantedAuthority
> obterPermissoes
(Usuario usuario
) throws Exception {
Collection<GrantedAuthority
> authorities =
new ArrayList<GrantedAuthority
>();
for (UsuarioPerfil perfil : usuario.
getPerfis()) {
String regra =
"ROLE_" + perfil.
getSequencial();
authorities.
add(new GrantedAuthorityImpl
(regra
));
}
return authorities
;
}
}