1
resposta

Acesso negado ao Swagger no navegador (código 403)

Olá, mesmo seguindo os passos executados pelo professor na parte 5 do curso para integrar o Swagger no projeto, não consigo acessar a url com a interface da biblioteca.

build.gradle:

dependencies { // Kotlin implementation 'org.jetbrains.kotlin:kotlin-reflect' implementation 'org.jetbrains.kotlin:kotlin-stdlib'

// Spring
implementation 'org.springframework.boot:spring-boot-starter-web'

// Validation
implementation 'org.springframework.boot:spring-boot-starter-validation'

// Data
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-cache'
implementation 'org.springframework.data:spring-data-jpa'
implementation 'mysql:mysql-connector-java:8.0.33'
implementation 'org.liquibase:liquibase-core'
implementation 'io.github.serpro69:kotlin-faker:1.13.0'

// Request/Response serialization
implementation 'com.fasterxml.jackson.module:jackson-module-kotlin'
implementation 'com.google.code.gson:gson:2.8.9'

// Security
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'io.jsonwebtoken:jjwt:0.2'

// Documentation
implementation 'org.springdoc:springdoc-openapi-ui:1.7.0'

// Helper
developmentOnly 'org.springframework.boot:spring-boot-devtools'

// Test
implementation platform('org.testcontainers:testcontainers-bom:1.19.3')

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'org.springframework.security:spring-security-test:6.2.1'
testImplementation 'org.testcontainers:testcontainers'
testImplementation 'org.testcontainers:junit-jupiter'
testImplementation 'org.testcontainers:mysql'

// Test Helpers
implementation "io.github.serpro69:kotlin-faker:1.13.0"
testImplementation "org.amshove.kluent:kluent-android:1.72"
testImplementation "io.mockk:mockk:1.13.8"

}

SecurityConfiguration.kt:

@Configuration @EnableWebSecurity class SecurityConfiguration( private val authConfig: AuthenticationConfiguration, private val jwtUtil: JwtUtil, ) { @Bean fun filterChain(http: HttpSecurity): SecurityFilterChain { http { authorizeHttpRequests { // Set authorities (user roles) for each endpoint authorize(HttpMethod.POST, "/login", permitAll) authorize(HttpMethod.GET, "/swagger-ui/", permitAll) authorize(HttpMethod.GET, "/v3/api-docs/", permitAll)

            // Domain endpoints
            authorize("/topics", hasAuthority("READ_WRITE"))

            // Only accept requests sent by authenticated users
            authorize(anyRequest, authenticated)
        }

        // Disable CSRF to make JWT work properly
        csrf { disable() }

        // Disable state saves between requests when logged in a user session
        sessionManagement {
            sessionCreationPolicy = SessionCreationPolicy.STATELESS
        }

        // Intercept all incoming requests
        setUpFilterChain()
    }

    return http.build()
}

private fun HttpSecurityDsl.setUpFilterChain() {
    // Token generation filter
    addFilterBefore<UsernamePasswordAuthenticationFilter>(JwtLoginFilter(authConfig.authenticationManager, jwtUtil))

    // Endpoint authentication/authorization filter
    addFilterBefore<UsernamePasswordAuthenticationFilter>(JwtAuthFilter(jwtUtil))
}

@Bean
fun getPasswordEncoder() = BCryptPasswordEncoder()

}

Ao executar na url "http://localhost:8080/swagger-ui/index.html":

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Como pode ser que existam vários fatores que podem estar levando ao problema, vou deixar o projeto no GitHub linkado.

1 resposta

E aí, Marcelo!

Beleza? Pelo que você falou e pelo código de segurança que mostrou, tá parecendo que você tá fazendo as coisas direitinho pro Swagger UI, né? Mas essa história do erro 403 indica que tem alguma coisa bloqueando o acesso, sacou?

Primeiro, verifica a ordem das regras de segurança. É fundamental que as regras pro Swagger UI estejam antes de qualquer outra que possa barrar o caminho. Ah, e não esquece de conferir se não tem outras configurações de segurança dando uma atrapalhada nas permissões.

Se você tá usando os perfis do Spring, confere se a segurança tá atrelada ao perfil certo. E sobre o Springdoc, dá uma checada pra ver se tá tudo alinhado com a versão do Spring Boot que você tá usando, beleza?

Ah, e não custa nada limpar o cache do projeto e fazer um rebuild do zero. Às vezes, builds antigos dão uns problemas chatos. E ativa os logs de segurança pra ver se eles te dão alguma pista. Coloca em DEBUG pra org.springframework.security.

Tenta também acessar a URL do Swagger UI usando Postman ou Curl. Pode ser que o problema seja só no navegador. E como você mandou o link do projeto no GitHub, seria bom dar uma olhada geral no código relacionado à segurança, sabe?

Por fim, dá uma espiada no console de desenvolvedor do navegador. Às vezes, ele mostra alguma informação que pode te ajudar a entender o que tá rolando.

Espero que essas dicas te ajudem a resolver essa parada do Swagger UI. Boa sorte aí nos estudos!