6
respostas

Spring security com rotas do angular

Estou com uma aplicação em que o a back-end esta no modo api rest e o front em AngularJs porem ao adotar a autenticação de requisições com o security ele não permite mais acesso as minhas rotas definidas no angular por mais que essas rotas façam requisições get ou post nos caminhos que tem acesso liberado para geral, que foram definidos no security,como faço para resolver ?? Obrigada!

6 respostas

Oi Larissa,

Para utilizar uma aplicação Frontend em JavaScript você precisará configurar o CORS na API com Spring Boot.

Basta criar a seguinte classe no projeto:

@Configuration
public class CorsConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
            .allowedOrigins("http://localhost:3000")
            .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD", "TRACE", "CONNECT");
    }
}

Sendo que no exemplo acima o localhost:3000 seria endereço da app frontend.

Além disso, na classe SecurityConfiguration precisamos avisar ao Spring que a aplicação vai receber requisições CORS, adicionando a seguinte configuração no método configure(HttpSecurity http):

...
.and().csrf().disable().and().cors()
...

O restante continua igual.

Bons estudos!

Olá professor, obrigada pela resposta deu certo ele está retornando com status 403 para as rotas do client, mas no caso gostaria de deixar algumas com acesso liberado, como faço ??? porque dessa maneira precisa de autenticação para todas as rotas do front.

Ai você configura o permitAll() na classe SecurityConfigurations.

Por exemplo, para liberar o cadastro de topicos:

.antMatchers(HttpMethod.POST, "/topicos").permitAll()

Certo, porém ele continua não dando certo, por exemplo liberei essa requisição : http.authorizeRequests() .antMatchers(HttpMethod.GET, "/treinos").permitAll()

A minha página no angularJs tem a seguinte rota: $routeProvider.when('/home', { templateUrl: 'angular/public/view/home.html', controller: 'HomeController', titulo : 'home' }); que por sua vez o HomeController faz uma requisição para o /treinos mas ao acessar o localhost com a seguinte rota: http://localhost:8080/#/home ele não exibe as chamadas do angular para essa rota (controllerJs, view.html), tudo está retornado no console com status 403 exemplo GET http://localhost:8080/angular/public/js/service (chamada da service para essa rota /home) como faço para que o security não bloqueie as minhas chamadas dentro do angularJs???

Oi Larissa,

Você precisa analisar então no Angular quais endereços ele está chamando na API backend, pois acho que deve ter outros endereços sendo chamados, que não foram liberados nas configurações de segurança.

Certo, muito obrigada pela atenção. O que fiz foi inverter a logica ao invés de usar o .anyRequest().authenticated(); disse quais precisam de autenticação assim ele deu acesso novamente as rotas do angular, parece que quando digo que o restante das requisições precisam ser autenticadas ele bloqueia todas as rotas do angular, que são diversas.

Obrigada!!!