I end up using AbstractUserDetailsAuthenticationProvider, I don't know if it is the best way but is working.
Code:
public class AuthenticationProvider extends AbstractUserDetailsAuthenticationProvider
{
private SecurityDao securityDao;
@Override
protected UserDetails retrieveUser(String username,
UsernamePasswordAuthenticationToken authentication)
throws AuthenticationException
{
final String password = authentication.getCredentials().toString();
boolean isValidUser = SecurityDao.isValidUser(username, password);
if (isValidUser)
{
final List<GrantedAuthorityImpl> authorities = SecurityDao.getAuthoritiesByUser(username);
return new User(username, password, true, true, true, true, authorities);
}
else
{
authentication.setAuthenticated(false);
throw new BadCredentialsException("Username/Password does not match for "
+ authentication.getPrincipal());
}
}
}