2016-03-18 33 views
2

Bazı API'larıma yapılan bazı isteklerde üstbilgileri ve yetkilendirmeyi denetlemesi gereken bazı engelleyiciler var. Örneğin, bazı istekler kullanıcı kimlik doğrulaması gerektirmelidir (örneğin, kullanıcı bilgilerini veritabanından değiştirmek için) ve bazılarında kimlik doğrulama gerektirmez (örneğin, bir kullanıcı oluşturmak için). Ne yazık ki, engelleyicilerin yollarını dışlama yöntemleri, talep yöntemine bağlı değildir.Spring MVC Interceptor, HTTP yöntemindeki yolları hariç tut

Şu anda, doğrulamalardan çıkarılması gereken bir dizi yol ve yöntem dizisi alan bir Util sınıfı oluşturdum. Örneğin: "POST /api/users", bir kullanıcı oluşturmak için olduğu için, kimlik doğrulaması önleme cihazım tarafından engellenmemelidir, ancak varolan bir kullanıcıyı değiştirmek için (giriş yapmalıdır) "PUT /api/users" engellenmelidir. Benim interceptor yapıcısı olarak

public static Boolean skipVerification(HttpServletRequest request, String... skipRequests) { 
    for (String string : skipRequests) { 
     String[] split = string.split(" "); 
     if(split[0].equals(request.getMethod()) && split[1].equals(request.getRequestURI())) 
      return true; 
    } 
    return false; 
} 

, ben atlanır gereken ekleme isteklerini ve bana ilk yakalanan gerek yoktu olarak istek bunlardan herhangi birini eşleşirse PreHandle yönteminde ben doğru dönün yer.

public AuthenticationHeaderInterceptor(String...skipWhen) { 
    this.skipWhen = skipWhen; 
} 

@Override 
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
     throws Exception { 

    if(InterceptorUtils.skipVerification(request, skipWhen)) 
     return true; 

///Do Authentication Logic 

} 

Ben oluşturma ve kullanıcıları düzenlemek için URI değişen bu çözeceği biliyorum ama çok fazla URI'ler ile benim API yığılmayı için tercih ve bu çözmek için daha temiz bir yolu olup olmadığını merak ediyorum.

cevap

1

Kod bakıldığında, InterceptorRegistry, InterceptorRegistration ve MappedInterceptor'u genişletip genişletemeyeceğinizi kontrol ediyordum. Ayrıca PathMatcher'u genişletmeniz ve PathMatcher'un amaçlanmadığı yolları ve yöntemleri kontrol etmek için kod eklemeniz gerekir. Genel olarak, şu an yaptığınız gibi, muhtemelen en iyisidir. Aynı zamanda, Spring'in AntPathMatcher kodunun her zaman çok dağınık ve buggy olduğunu belirtmek isterim, bu yüzden muhtemelen onunla ilgilenen herhangi bir göreve katılmak istemezsiniz.

İlgili konular