Fornecedor de autenticação de segurança Spring

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.