Dados do Spring com Spring Security

Dados do Spring com Spring Security

1. Visão geral

O Spring Security fornece um bom suporte para integração com o Spring Data. Enquanto o primeiro lida com os aspectos de segurança de nosso aplicativo, o último fornece acesso conveniente ao banco de dados que contém os dados do aplicativo.

Neste artigo, discutiremos comoSpring Security can be integrated with Spring Data to enable more user-specific queries.

2. Spring Security + Configuração de Spring Data

Em nossointroduction to Spring Data JPA, vimos como configurar Spring Data em um projeto Spring. Para habilitar a segurança da primavera e os dados da primavera, como de costume, podemos adotar a configuração baseada em Java ou XML.

2.1. Configuração Java

Lembre-se de que a partir deSpring Security Login Form (seções 4 e 5), podemos adicionar Spring Security ao nosso projeto usando a configuração baseada em anotação:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    // Bean definitions
}

Outros detalhes de configuração incluiriam a definição de filtros, beans e outras regras de segurança, conforme necessário.

Para habilitar Spring Data no Spring Security, simplesmente adicionamos este bean aWebSecurityConfig:

@Bean
public SecurityEvaluationContextExtension securityEvaluationContextExtension() {
    return new SecurityEvaluationContextExtension();
}

A definição acima permite a ativação da resolução automática de expressões específicas de dados de primavera anotadas nas classes.

2.2. Configuração XML

A configuração baseada em XML começa com a inclusão do namespace Spring Security:


...

Assim como na configuração baseada em Java, para a configuração baseada em XML ou namespace, adicionaríamos o beanSecurityEvaluationContextExtension ao arquivo de configuração XML:

DefinirSecurityEvaluationContextExtension torna todas as expressões comuns em Spring Security disponíveis a partir de consultas Spring Data.

Essas expressões comuns incluemprincipal, authentication, isAnonymous(), hasRole([role]), isAuthenticated, etc.

3. Exemplo de uso

Vamos considerar alguns casos de uso de Spring Data e Spring Security.

3.1. Restringir atualização de campoAppUser

Neste exemplo, veremos como restringir a atualização do campoAppUserlastLogin para o único usuário autenticado no momento.

Com isso, queremos dizer que sempre que o métodoupdateLastLogin é acionado, ele apenas atualiza o campolastLogin do usuário autenticado no momento.

Para conseguir isso, adicionamos a consulta abaixo à nossa interfaceUserRepository:

@Query("UPDATE AppUser u SET u.lastLogin=:lastLogin WHERE"
  +" u.username = ?#{ principal?.username }")
public void updateLastLogin (Date lastLogin);

Sem a integração Spring Data e Spring Security, normalmente teríamos que passar o nome de usuário como um argumento paraupdateLastLogin.

Nos casos em que as credenciais de usuário incorretas são fornecidas, o processo de login falhará e não precisamos nos preocupar em garantir a validação do acesso.

3.2. Buscar conteúdo específicoAppUser' com paginação

Outro cenário em que o Spring Data e o Spring Security funcionam perfeitamente lado a lado é um caso em que precisamos recuperar o conteúdo do banco de dados que pertence ao usuário atualmente autenticado.

Por exemplo, se tivermos um aplicativo tweeter, convém exibir tweets criados ou curtidos pelo usuário atual em sua página de feeds personalizados.

Obviamente, isso pode envolver escrever consultas para interagir com uma ou mais tabelas em nosso banco de dados. Com o Spring Data e o Spring Security, isso é tão simples quanto escrever:

public interface TweetRepository extends PagingAndSortingRepository {
    @Query("select twt from Tweet twt  JOIN twt.likes as lk where lk ="+
      " ?#{ principal?.username } or twt.owner = ?#{ principal?.username }")
    Page getMyTweetsAndTheOnesILiked(Pageable pageable);
}

Como queremos nossos resultados paginados, nossoTweetRepository estendePagingAndSortingRepository na definição de interface acima.

4. Conclusão

A integração do Spring Data e do Spring Security oferece muita flexibilidade ao gerenciamento de estados autenticados nos aplicativos Spring.

Nesta sessão, vimos como adicionar Spring Security ao Spring Data. Mais sobre outros recursos poderosos do Spring Data ou Spring Security podem ser encontrados em nossa coleção de artigosSpring DataeSpring Security.

Como de costume, trechos de código podem ser encontradosover on GitHub.