2017-07-12 19 views
5

Yay ve yay-security-3.2 kullanıyoruz. Son zamanlarda RestAPI'lara @PreAuthorize ek açıklamaları ekliyoruz (daha önce URL tabanlıydı).Özel Hata mesajı @Preauthorize ve @@ ControllerAdvice ile

 @PreAuthorize("hasPermission('salesorder','ViewSalesOrder')") 
    @RequestMapping(value = "/restapi/salesorders/", method = RequestMethod.GET) 
    public ModelAndView getSalesOrders(){} 

Biz zaten not verilmiş Küresel istisna işleyicisi var - yerinde @ControllerAdvice ve özel PermissionEvaluator, her şey hata mesajı dışında çalışıyor.

Bazı kullanıcıların API'ye eriştiğini bildirir Şu anda 'ViewSalesOrder' iznine sahip olmadan, ilkbaharda varsayılan olarak 'Erişim reddedilir' özel durumu atar, ancak hangi iznin eksik olduğunu anlatmadı (Buradaki izinlerden bahsetmemiz gerekir) eksik).

İzin adı da dahil olmak üzere bir istisna atmak mümkün mü, bu nedenle son hata iletisinin "Erişim reddedildi, ViewSalesOrder iznine ihtiyacınız var" gibi görünmelidir (burada izin adı @PreAuthorize ek açıklamasından olmalıdır)?

Lütfen jenerik çözümün çok takdir edileceği için bu tür bir restAPI uygulamasına sahip olduğumuzu unutmayın.

cevap

0

PermissionEvaluator arabirimi beklediğiniz sonucu elde etmenin güzel bir yolu yoktur, eksik olan sonucu değerlendirme sonucuyla birlikte iletmenize izin vermez.
Ayrıca, AccessDecisionManager, AccessDecisionVoter örneklerinin oyları ile ilgili olarak numaralı oylar ile ilgili olarak, @PreAuthorize değerinin değerlendirmesine göre oy kullanan bir karar alır.

Özel bir PermissionEvaluator, hasPermission numaralı çağrıya geri döndüğünde, isteğinizle ilgili PreInvocationAuthorizationAdviceVoter oyu (istekte bulunarak -11 puan) oylama. Gördüğünüz gibi, bu akıştaki başarısızlığın nedenini yaymanın bir yolu yoktur.

Diğer taraftan, istediğinizi elde etmek için bazı geçici çözümler deneyebilirsiniz.

Izin verilmediginde, özel PermissionEvaluator arasinda bir istisna atmanin bir yolu olabilir. Bu istisnayı, eksik izni genel istisna işleyicinize yaymak için kullanabilirsiniz. Orada, eksik izni mesaj tanımlayıcılarınıza bir parametre olarak iletebilirsiniz. Bunun, AccessDecisionManager yürütme işlemini durduracağına dikkat edin; bu, ardışık seçmenlerin çalıştırılmayacağı anlamına gelir (varsayılan değerler RoleVoter ve AuthenticatedVoter). Bu yoldan gitmeyi seçerseniz dikkatli olmalısınız.

Özel bir AccessDeniedHandler numaralı özel uygulamayı uygulamak ve 403 ile yanıt vermeden önce hata iletisini özelleştirmek olabilir. AccessDeniedHandler, istek URI'sini almak için kullanılabilecek geçerli HttpServletRequest sağlar. Ancak, bu durumda kötü haber, eksik izni bulmak için haritaya izin vermek için bir URI'ye ihtiyacınız var.

İlgili konular