Como autenticar usuários em uma aplicação Java web?

Autenticar usuários em uma aplicação Java web pode ser feito com Spring Security, garantindo segurança e controle de acesso.

Como autenticar usuários em uma aplicação Java web?

A autenticação de usuários é fundamental para garantir segurança em aplicações web. No Java, a forma mais eficiente de implementar autenticação é usando Spring Security, um framework que simplifica o controle de acesso baseado em usuários e permissões.

1. Configurando Spring Security no Projeto

Se estiver usando Spring Boot, adicione a dependência no pom.xml:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

Por padrão, o Spring Security ativa a autenticação automática, exigindo um login na inicialização da aplicação. O usuário e senha padrão são exibidos no console.

2. Criando um Serviço de Autenticação Personalizado

Para autenticar usuários a partir de um banco de dados, crie um serviço de usuários:

import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;

@Service
public class MeuUserDetailsService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        if ("admin".equals(username)) {
            return new User("admin", "{noop}123456", new ArrayList<>());
        } else {
            throw new UsernameNotFoundException("Usuário não encontrado");
        }
    }
}

Explicação:

  • O método loadUserByUsername verifica se o usuário existe e retorna os detalhes dele.
  • {noop} significa que a senha não está encriptada (apenas para testes).
  • Se o usuário não for encontrado, uma exceção é lançada.

3. Configurando a Segurança da Aplicação

Crie uma classe de configuração para definir permissões e autenticação:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/public/**").permitAll()
                .anyRequest().authenticated()
            )
            .formLogin()
            .and()
            .httpBasic();
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        return new InMemoryUserDetailsManager();
    }
}

Explicação:

  • requestMatchers("/public/**").permitAll() permite acesso público a algumas rotas.
  • .anyRequest().authenticated() exige login para outras páginas.
  • .formLogin() ativa a tela de login padrão do Spring Security.
  • .httpBasic() permite autenticação via headers HTTP.

4. Testando a Autenticação

Agora, quando acessar sua aplicação, o Spring Security exigirá login. Para testar:

  1. Acesse http://localhost:8080 no navegador.
  2. O Spring mostrará a tela de login.
  3. Digite admin e senha 123456.
  4. O acesso será concedido.

Se estiver usando Postman, envie uma requisição GET para qualquer endpoint protegido e, na aba "Authorization", selecione Basic Auth e insira as credenciais.

5. Melhorando a Segurança com JWT

Para autenticação sem estado (sem sessões), use JSON Web Token (JWT). Isso permite que a API gere um token no login e o cliente use esse token nas requisições subsequentes.

Adicione a dependência no pom.xml:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.5</version>
</dependency>

Crie um método para gerar tokens JWT:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

public class JwtUtil {
    private static final String SECRET_KEY = "minhaChaveSecreta";

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
}

Explicação:

  • Gera um token JWT com validade de 1 hora.
  • O token pode ser enviado pelo cliente nas requisições futuras.

Conclusão

Autenticar usuários em uma aplicação Java web é essencial para proteger dados e garantir que apenas usuários autorizados tenham acesso. O Spring Security simplifica esse processo, oferecendo suporte para autenticação via login/senha, Basic Auth e JWT.

A segurança é um dos aspectos mais importantes no desenvolvimento web. Sem autenticação adequada, aplicações Java podem ficar vulneráveis a ataques como roubo de credenciais e acessos não autorizados. O Spring Security fornece uma abordagem robusta para controle de acesso, integrando-se facilmente com bancos de dados, autenticação via JWT e OAuth2.

Algumas aplicações:

  • Controle de acesso a áreas restritas
  • Proteção de APIs REST contra acessos não autorizados
  • Autenticação de usuários via banco de dados
  • Integração com JWT para autenticação sem estado

Dicas para quem está começando

  • Use Spring Security para implementar autenticação de forma segura
  • Evite armazenar senhas sem encriptação
  • Se precisar de autenticação sem estado, utilize JWT
  • Teste a autenticação usando Postman ou Curl

Contribuições de Rodrigo Farias

Compartilhe este tutorial: Como autenticar usuários em uma aplicação Java web

Compartilhe este tutorial

Continue aprendendo:

Como configurar o CORS em uma API Java

O CORS (Cross-Origin Resource Sharing) é uma política de segurança que controla quais domínios podem acessar recursos de uma API Java.

Tutorial anterior

Como criar login com JWT em Java

O JWT (JSON Web Token) é usado para autenticação sem estado em aplicações Java, permitindo login seguro e proteção de APIs.

Próximo tutorial