1
resposta

[Dúvida] Stateless(JWT) e Stateful (Session) juntos no Monolito Spring MVC, é possível?

Olá pessoal! Estou enfrentando um desafio em minha aplicação Spring Boot com Spring MVC. Atualmente, estou usando autenticação stateful com Spring Security em um monolito, onde a autenticação e o controle de acessos são baseados em sessões. Agora, quero adicionar a autenticação baseada em JWT (JSON Web Token) à minha aplicação para fornecer APIs públicas que possam ser consumidas por outros clientes. No entanto, estou um pouco confuso sobre como implementar a autorização usando JWT e Spring Security em conjunto, especialmente considerando que minha aplicação atualmente está configurada em modo stateful. Gostaria de saber se é possível trabalhar com autenticação stateless e stateful na mesma aplicação. Caso seja possível, como posso reconfigurar minhas propriedades de autorização/segurança para permitir essa coexistência? Agradeço antecipadamente por qualquer ajuda e orientação que possam oferecer!

1 resposta

Olá Ailton!

Obrigado por compartilhar sua dúvida conosco! É possível sim trabalhar com autenticação stateless e stateful na mesma aplicação Spring Boot com Spring MVC. Para fazer isso, você precisará configurar o Spring Security para reconhecer tanto as sessões quanto os tokens JWT.

Uma maneira de fazer isso é criar dois filtros de segurança diferentes: um para a autenticação stateful e outro para a autenticação stateless. O filtro de autenticação stateful seria responsável por gerenciar as sessões e o filtro de autenticação stateless seria responsável por validar os tokens JWT.

Para configurar o filtro de autenticação stateful, você pode usar a classe SessionManagementConfigurer do Spring Security. Para configurar o filtro de autenticação stateless, você pode usar a classe JwtConfigurer do Spring Security.

Aqui está um exemplo de como você pode configurar o Spring Security para trabalhar com autenticação stateful e stateless na mesma aplicação:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtTokenProvider jwtTokenProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/api/public/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .apply(new SessionManagementConfigurer<HttpSecurity>()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED))
                .and()
            .apply(new JwtConfigurer(jwtTokenProvider));
    }

    // Outras configurações de segurança aqui...
}

Observe que o método configure está configurando o Spring Security para permitir o acesso a todas as URLs que começam com /api/public/ sem autenticação. Isso significa que essas URLs serão acessíveis sem a necessidade de um token JWT. Todas as outras URLs exigirão autenticação.

Espero ter ajudado e bons estudos!