[Kotlin, Spring Boot] จะลบบางอย่างออกจาก log เช่น password, token เพราะไม่อยากให้เห็น และไม่ควรเก็บไว้
มันเกิดจากอุบัติเหตุในการหาวิธีการของ blog ที่แล้ว ที่มีความต้องการจะเข้าหรัาแค่บางส่วน และอยากรู้ว่าเราจะเอาออกได้ไหมเผื่อมี member หรือ properties ที่ไม่ต้องการเก็บไว้เช่น password, token
ย้อนกลับไปอ่าน blog ก่อนหน้า https://medium.com/@phai/1644d6c0f2fc เพราะบางเรื่องไม่ได้เขียนซ้ำใน blog นี้
Implement
จากตอนแรกที่เรามีแค่ Views.Secure
ที่ไว้ระบุว่า properties ต่อไปนี้เราจะเข้ารหัา วันนี้เรามาเพิ่ม Views.Secret
แยกกันให้ดีนะชื่อคล้ายกันมาก Secure
, Secret
seal class Views {
seal class Secure
seal class Secret
}
แล้วก็ไปใส่ไว้ที่ field นั้น ๆ ว่า @JsonView(Views.Secret::class)
data class Login { val username: String
@JsonView(Views.Secret::class)
val password: String
}
ไปดูที่ configs จะเห็นว่าสั่งให้เขียนแค่ Views.Secure
ไว้เท่านั้น เพราะฉะนั้น JsonView
ตัวอื่น ๆ ก็จะไม่ถูกเขียนลง log
@Configuration
class SecureWriterConfig { @Bean
fun secureWriter(mapper: ObjectMapper): ObjectWriter {
return mapper
.writerWithView(Views.Secure::class.java)
}
}
เท่านี้อะไรที่ไม่ควรลง log เช่น token, password ก็หายออกไปจาก log แล้ว หรือถ้าต้องการ override เป็นค่าว่าง ก็ทำได้ที่ JsonSerializer
เช่นกัน
class SecretJsonSerializer: JsonSerializer<String>() {
override fun serialize(
value: String,
gen: JsonGenerator,
provider: SerializerProvider
) {
if (provider.activeView == Views.Secret::class.java) {
gen.writeString("ไม่ให้ดูหรอก ความลับลูกค้า")
} else {
gen.writeString(value)
}
}
}
เป็นอย่างไรกันบ้างครับ อย่าลืมตรวจเชคดีว่า เรา log สิ่งไม่ควร log หรือไม่
ข่าวที่เกี่ยวข้อง
แต่อย่ากังวลไป ทั้ง Facebook, และ Twitter ก็เคยทำพลาดจุดนี้มาแล้ว
ถ้าเราเจอแบบนี้ในระบบให้ทำการปิดช่องโหว่นี้ ลบส่วนที่ไม่ควรจะเก็บออกไป และทำการแจ้งผู้ใช้งานให้ทรายถึงผลกระทบ และแนะนำให้ผู้ใช้งานเปลี่ยนรหัสผ่านด้วย