Otentikasi khusus SpringBoot Rest API

Saya membangun Rest Api menggunakan SpringBoot dan otentikasi saya menerapkan menggunakan Firebase.

Masalah saya saat ini adalah saya ingin memiliki kendali atas aplikasi klien yang akan mengakses aplikasi saya. Masalah menggunakan SpringSecurity adalah sejauh yang saya tahu saya harus melakukan otentikasi untuk itu dan saya hanya ingin "mengizinkan aplikasi klien".

Adakah yang tahu bagaimana melakukannya?


person Danilo Andrade    schedule 03.11.2016    source sumber
comment
Apakah maksud Anda Anda tidak ingin melakukan otentikasi untuk sekelompok klien tertentu?   -  person Yasin    schedule 03.11.2016
comment
Tidak. Semua klien harus diautentikasi, tetapi tugas ini akan menjadi tugas Firebase. Di server saya, saya hanya akan memeriksa apakah aplikasi tersebut berwenang untuk mengakses server. Masalah saya justru memverifikasi aplikasi.   -  person Danilo Andrade    schedule 03.11.2016


Jawaban (3)


Berikan kunci unik untuk klien Anda. Yang mana layanan mikro Anda mengenali dan mengautentikasi permintaan apa pun berdasarkan kunci tersebut. Ini juga dapat diberikan sebagai request parameter.

katakanlah Anda menambahkan kunci Anda ke dalam parameter bernama my-key, sekarang sebelum mengerjakan logika Anda di dalam aplikasi spring-boot Anda, validasi kunci Anda. seperti ini -

Pengontrol Istirahat Anda akan terlihat seperti ini-

@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);
    }
}

untuk mengakses sisanya gunakan - http://your-host:port/some-mapping?my-key=someValue

person Abbas Kararawala    schedule 03.11.2016
comment
Tapi di mana dan bagaimana saya melakukan ini untuk memeriksa kunci di Musim Semi? - person Danilo Andrade; 03.11.2016
comment
Dengan cara ini, siapa pun dapat mengakses API. Cara yang lebih baik adalah dengan mengirim data dalam POST. Namun sekali lagi, jika klien dapat mengirimkan kunci, klien dapat dengan mudah menggunakan mekanisme otentikasi normal. - person Yasin; 03.11.2016
comment
@yasin - yang ini hanyalah contoh dari apa yang dapat dicoba oleh pengguna. modifikasi lainnya terserah dia :) - person Abbas Kararawala; 03.11.2016
comment
Terima kasih banyak untuk jawabannya. Untuk sedikit meningkatkannya akan menerapkan Filter yang akan memfilter semua permintaan dan memverifikasi kunci. Bagaimana menurutmu? - person Danilo Andrade; 03.11.2016
comment
Kedengarannya bagus :) - person Abbas Kararawala; 04.11.2016
comment
stackoverflow.com/questions/31082981/ - ini akan berguna. - person Abbas Kararawala; 04.11.2016

Jika Anda ingin mengizinkan beberapa klien untuk melewati otentikasi, buatlah daftar alamat IP yang masuk daftar putih dan periksa IP setiap permintaan masuk. jika IP ada dalam daftar API yang masuk daftar putih, tidak perlu mengautentikasi.

Gunakan HttpServletRequest.getRemoteAddr() untuk mendapatkan alamat IP.

person Yasin    schedule 03.11.2016

Solusi 1

Pencegat khusus 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) {
    }
}

Konfigurasikan interseptor 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