Пользовательская аутентификация SpringBoot Rest API

Я создаю Rest Api, используя SpringBoot, и аутентификацию, которую я реализовал с помощью Firebase.

Моя проблема сейчас заключается в том, что я хочу контролировать клиентские приложения, которые будут получать доступ к моему приложению. Проблема использования SpringSecurity заключается в том, что, насколько я знаю, мне нужно выполнить аутентификацию для него, и я просто хочу «разрешить клиентское приложение».

Кто-нибудь знает, как это сделать?


person Danilo Andrade    schedule 03.11.2016    source источник
comment
Вы имеете в виду, что не хотите выполнять аутентификацию для определенного набора клиентов?   -  person Yasin    schedule 03.11.2016
comment
Не надо. Все клиенты должны быть аутентифицированы, но этой задачей будет Firebase. На своем сервере я просто проверю, разрешено ли приложению доступ к серверу. Моя проблема заключается именно в проверке приложения.   -  person Danilo Andrade    schedule 03.11.2016


Ответы (3)


Предоставьте уникальный ключ вашему клиенту. Какой ваш микросервис распознает и аутентифицирует любой запрос на основе этого ключа. Это также может быть указано как request parameter.

скажем, вы добавили свой ключ в параметр с именем my-key, теперь, прежде чем работать над своей логикой внутри вашего приложения с весенней загрузкой, проверьте свой ключ. как это -

ваш Rest Controller будет выглядеть так:

@RestController
class MyRest{

    private static final String KEY = "someValue";

    @RequestMapping("/some-mapping")
    public @ResponseBody myMethod(@RequestParam(value="my-key", required=true) String key){
        if(!validateRequest(key)){
            //return error as response
        }
        System.out.println("Key Validation Successful!");
        //here goes your logic
    }

    private boolean validateRequest(String key){
        return key.equals(KEY);
    }
}

чтобы получить доступ к этому отдыху, используйте - http://your-host:port/some-mapping?my-key=someValue

person Abbas Kararawala    schedule 03.11.2016
comment
Но где и как мне сделать эту проверку ключа в Весне? - person Danilo Andrade; 03.11.2016
comment
Таким образом, любой может получить доступ к API. Лучшим способом было бы отправить данные в POST. Но опять же, если клиент может отправить ключ, он может легко использовать обычный механизм аутентификации. - person Yasin; 03.11.2016
comment
@yasin - это просто демонстрация того, что пользователь может попробовать. другие модификации на его усмотрение :) - person Abbas Kararawala; 03.11.2016
comment
Большое спасибо за ответ. Чтобы немного улучшить, реализуем фильтр, который будет фильтровать все запросы и проверять ключ. Что вы думаете? - person Danilo Andrade; 03.11.2016
comment
Звучит здорово :) - person Abbas Kararawala; 04.11.2016
comment
stackoverflow.com/questions/31082981/ - это должно пригодиться. - person Abbas Kararawala; 04.11.2016

Если вы хотите разрешить некоторым клиентам обходить аутентификацию, создайте список IP-адресов из белого списка и проверяйте IP-адрес каждого входящего запроса. если IP-адрес находится в списке API-интерфейсов, внесенных в белый список, аутентификация не требуется.

Используйте HttpServletRequest.getRemoteAddr(), чтобы получить IP-адрес.

person Yasin    schedule 03.11.2016

Решение 1

Пользовательский перехватчик MyHandlerInterceptor.java:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

public class MyHandlerInterceptor implements HandlerInterceptor {
    private static final String YOUR_KEY = "KEY_VALUE";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        String key = request.getHeader("X-Key");
        boolean isValid = YOUR_KEY.equals(key);
        if (!isValid) {
            //invalid key
            response.setStatus(401);
            PrintWriter writer = response.getWriter();
            writer.write("invalid key");
        }
        return isValid;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    }
}

Настройте перехватчик WebConfig.java:

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new MyHandlerInterceptor());
    }
}
person Alan    schedule 03.06.2018