7
respostas

Nova Versão do Spring Security | Autorização

Agora com a nova versão, ao inves de configurar oq cada role pode acessar na classe de configuração do spring security, podemos anotar com a nova anotação @PreAuthorize em cima do end-point( Controller) indicando oq cada role pode acessar. Porém, como seria feito isso no nosso projeto? Pois temos 2 ambientes diferentes, 2 classes de segurança diferente, para dev e outra pra test e prod.

7 respostas

Oi Victor,

O Spring vai respeitar o profile ativo do momento e carregar apenas os controllers de acordo com o profile atual. Se tiver anotações @PreAuthorize em controllers, elas somente vão funcionar se o controller for carregado.

Mas pensa comigo, o end-point do controller topicos por exemplo, o AMBIENTE de DEV,TEST e prod, esse controller roda em todos os ambientes e o método findAll desse controller também, Só q no ambiente de dev eu quero configurar para esse metodo estar liberado para qualquer ROLE, n precisa estar logado nem nada, mas no ambiente de prod e test precisa estar logado, com limitações e tudo. Como eu vou avisar isso dentro do annotation @PreAuthroize? Porque dentro de um profile, esse @PreAuthrorize era pra fazer algo, dentro de outro profile, era pra fazer outra coisa.

Alguém poderia responder?

Oi Victor,

Nesse cenário que você mencionou não vai ter como resolver, pois uma mesma URL teria que ter 2 comportamentos distintos(liberado ou bloqueado), de acordo com o profile ativo.

O jeito então seria ter 2 configurações de segurança distintas, uma para cada profile, e em cada uma delas teria a sua própria regra. Similar ao que foi demonstrado no curso com as duas classes securityconfigurations.

Atualizei o Spring Boot para a versão 3.0 e agora estou tendo problemas para acessar recursos estáticos como /h2-console e /swagger-ui .

Comecei a ter esses problemas depois da atualização. Não consigo acessar nenhum dos recursos ditos anteriormente, falam que estão bloqueados, ou seja, o spring security está bloqueando.

@Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { // Configurações de Autorização.

    http.authorizeHttpRequests()
            .requestMatchers("/auth","/users/register").permitAll()
            .requestMatchers("/users" , "/users/**").hasRole("ADMIN") 
            .anyRequest().authenticated() 
            .and().cors() 
            .and().headers().frameOptions().disable() 
            .and().csrf().disable() 
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().addFilterBefore(new AuthenticationJWTFilter(tokenService, userRepository), UsernamePasswordAuthenticationFilter.class) 
            .exceptionHandling().authenticationEntryPoint(new UnauthorizedHandler()) 
            .and().exceptionHandling().accessDeniedHandler(new ForbiddenHandler());

    return http.build();
}

@Override
@Bean
public WebSecurityCustomizer webSecurityCustomizer() { 
    return (web) -> web.ignoring().requestMatchers
            ("/swagger-ui/**", "/v3/api-docs/**", "/h2-console/**");
}



  <dependency>
        <groupId>org.springdoc</groupId>
        <artifactId>springdoc-openapi-ui</artifactId>
        <version>1.6.14</version>
    </dependency>

Alguém poderia ajudar por favor?

Coloca esse tratamento no próprio método filterChain:

.requestMatchers("/v3/api-docs/**", "/swagger-ui.html", "/swagger-ui/**").permitAll()
.requestMatchers("/h2-console/**").permitAll()

Obs: Spring Boot na versão 3 exige o springdoc na versão 2:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>