Fornecedor de autenticação de segurança Spring
1. Visão geral
Este tutorial mostrará como configurar umAuthentication Provider in Spring Security para permitir flexibilidade adicional em comparação com o cenário padrão usando umUserDetailsService simples.
2. O provedor de autenticação
O Spring Security fornece uma variedade de opções para executar a autenticação. Eles seguem um contrato simples -an Authentication request is processed by an AuthenticationProvidere um objeto totalmente autenticado com credenciais completas é retornado.
A implementação padrão e mais comum éDaoAuthenticationProvider - que recupera os detalhes do usuário de um DAO de usuário simples e somente leitura - oUserDetailsService. Este serviço de detalhes do usuárioonly has access to the username para recuperar a entidade de usuário completa. Isso é suficiente para a maioria dos cenários.
Mais cenários personalizados ainda precisarão acessar a solicitaçãoAuthentication completa para poder realizar o processo de autenticação. Por exemplo, ao autenticar em algum serviço externo de terceiros (comoCrowd) -both the username and the password from the authentication request will be necessary.
Para esses cenários mais avançados, precisaremosdefine a custom Authentication Provider:
@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
String name = authentication.getName();
String password = authentication.getCredentials().toString();
if (shouldAuthenticateAgainstThirdPartySystem()) {
// use the credentials
// and authenticate against the third-party system
return new UsernamePasswordAuthenticationToken(
name, password, new ArrayList<>());
} else {
return null;
}
}
@Override
public boolean supports(Class> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
Observe que as autoridades concedidas definidas no objetoAuthentication retornado estão vazias. Isso ocorre porque as autoridades são obviamente específicas da aplicação.
3. Registre o provedor de autenticação
Agora que definimos o provedor de autenticação, precisamos especificá-lo na configuração de segurança XML, usando o suporte de namespace disponível:
4. Configuração Java
A seguir, vamos dar uma olhada na configuração Java correspondente:
@Configuration
@EnableWebSecurity
@ComponentScan("org.example.security")
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private CustomAuthenticationProvider authProvider;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(authProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated()
.and().httpBasic();
}
}
5. Executando Autenticação
Solicitar autenticação do cliente é basicamente o mesmo com ou sem esse provedor de autenticação personalizado no back-end.
Vamos usar um comandocurl simples para enviar uma solicitação autenticada:
curl --header "Accept:application/json" -i --user user1:user1Pass
http://localhost:8080/spring-security-custom/api/foo/1
Para os fins deste exemplo, protegemos a API REST com autenticação básica.
E recebemos de volta os 200 OK esperados do servidor:
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 02 Jun 2013 17:50:40 GMT
6. Conclusão
Neste artigo, discutimos um exemplo de um provedor de autenticação personalizado para o Spring Security.
A implementação completa deste tutorial pode ser encontrada emthe GitHub project.