Saya memiliki pengaturan di mana kami menggunakan JAX-RS / RestEasy bersama dengan Spring Security. Untuk sebagian besar, ini berfungsi dengan baik, tetapi saya mengalami cegukan yang tidak terduga dengan menangani pengecualian yang dilemparkan oleh @PreAuthorize.

Kami sedang melakukan beberapa evaluasi izin menggunakan SpEL, seperti:

@POST
@PreAuthorize("@permHandler.canUserUpdate(#request, authentication)")

Kasus itu akan mengevaluasi ke true, atau melemparkan pengecualian, UnauthorizedException, dengan beberapa informasi.

Masalah dalam hal ini adalah menangani Exception dengan benar dan mengembalikan kode kesalahan yang benar ke klien.

Saya memiliki pengaturan mapper ekspresi JAX-RS yang khas seperti:

@Provider
public static class UnauthorizedExceptionMapper implements ExceptionMapper<UnauthorizedException> {
  @Override
  public Response toResponse(UnauthorizedException exception) {
    ...
    return Response.status(403).entity(error).build();
  }
}

Handler ini tidak pernah terkena, karena @PreAuthorize tidak menggelembungkan UnauthorizedException saya. Sebaliknya, ia tidak yakin apa yang harus dilakukan dan melempar IllegalArgumentException sebagai gantinya. Memetakan IllegalArgumentException untuk mendapatkan respons 403 saya tidak akan berhasil karena alasan yang jelas.

Apakah ada cara yang diterima untuk membuatnya berfungsi dengan pengaturan ini? Sebagian besar dokumentasi penanganan pengecualian keamanan pegas membuat referensi khusus ke utilitas untuk web pegas atau mvc, yang bukan merupakan kasus kami di sini.

Setiap bantuan atau anggukan ke arah yang benar akan dihargai.

1
bvulaj 12 Desember 2017, 02:03

1 menjawab

Jawaban Terbaik

Solusinya adalah memastikan Exception kami diperpanjang AccessDeniedException - dalam hal ini Keamanan Musim Semi cukup pintar untuk menggelembungkannya daripada melemparkan IllegalArgumentException

Contoh: public class UnauthorizedException extends AccessDeniedException

1
bvulaj 12 Desember 2017, 15:05