การรับรองความถูกต้องแบบกำหนดเองของ 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 ตอนนี้ก่อนที่จะทำงานกับตรรกะของคุณภายในแอป spring-boot คุณจะตรวจสอบคีย์ของคุณ แบบนี้ -

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
แต่ฉันจะตรวจสอบกุญแจใน Spring ได้ที่ไหนและอย่างไร? - 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