Spring security - доступ к частным конечным точкам без аутентификации - PullRequest
0 голосов
/ 08 января 2020

Я создаю свой бэкэнд с микросервисной архитектурой с использованием Spring. у меня есть сервер eureka, сервер шлюза zuul и другие микросервисы, которые взаимодействуют друг с другом через прокси-сервер feing. Что я хочу знать, так это как проверять безопасность и авторизацию только один раз для каждого запроса? что я имею в виду, если у меня есть микросервис A , который вызывает микросервис B через частную конечную точку, как проверить безопасность и авторизацию только для первого вызова микросервиса A и игнорировать безопасность для микросервиса B ? зная, что проверка безопасности должна выполняться, когда вызов является прямым для той же конечной точки микросервиса B .

, например, при аутентификации микросервис Login с общедоступной c authentication () конечная точка, вызовите микросервис Account для получения информации о пользователе через частную getUserInfo () конечную точку. в этом случае проверка безопасности должна быть проигнорирована для 2 конечных точек, потому что authentication () endpoint is publi c.

второй пример, при проверке аутентификации, Login микросервис с частной validateAuthentication () конечная точка, вызов той же частной конечной точки getUserInfo () учетной записи микросервиса. в этом случае проверка безопасности должна выполняться для конечной точки validateAuthentication () и игнорироваться для getUserInfo () конечной точки.

, зная, что getUserInfo ( ) конечная точка может быть вызвана напрямую, и в этом случае необходимо выполнить проверку безопасности.

Это мой SecurityConfig class

@Configuration
@EnableWebSecurity
class SecurityConfig : WebSecurityConfigurerAdapter()
{
    companion object
    {
        val PUBLIC_END_POINTS = arrayOf(
                "/auth/identification"
        )
    }


    override fun configure(http : HttpSecurity)
    {
        http
            .cors().and().csrf().disable()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
            .authorizeRequests()
                .antMatchers(*PUBLIC_END_POINTS).permitAll()
                .anyRequest().authenticated()
            .addFilterBefore(AuthenticationFilter() , UsernamePasswordAuthenticationFilter::class.java)
    }
}

, и это мой AuthenticationFilter класс

class AuthenticationFilter : OncePerRequestFilter()
{

    override fun doFilterInternal(request : HttpServletRequest , response : HttpServletResponse , filterChain : FilterChain)
    {
        // validate token and user's info
        filterChain.doFilter(request, response)
    }
}

Кто-нибудь может мне помочь? я потратил много времени на поиск в inte rnet и не нашел решения ..

1 Ответ

0 голосов
/ 15 января 2020

Вы должны обеспечить аутентификацию только через шлюз и удалить защиту пружины от других микросервисов. Вы должны выполнить эти puli c microservices в intr anet и предоставить inte rnet только шлюз. Вы должны реализовать AuthenticationEntryPoint и установить его в конфигурации HttpSecurity. Конечные точки микросервисов следует настраивать как частные, кроме точки для аутентификации.

...