2012-01-15 23 views
7

Kullanıcıların farklı web tarayıcıları (tarayıcı, yerel mobil uygulama, vb.) Kullanmasına izin vermesi gereken bir web uygulamasına sahibim. Oturum açtıktan sonra, kısıtlanmış içeriğe veya kendi içeriğine erişebilirler (oluşturdukları girişler, vb.). Ben aşağıdaki yöntemleri gösterir bir jax-rs dinlenme webservice (ı GlassFish başvurumu ev sahipliği yapıyorum) oluşturuldu: Şimdiye kadar ne yaptıkjax-rs webservice kimlik doğrulaması ve yetkilendirme

  • kayıt - Kullanıcı POST en onun istenilen kullanıcı adı/şifre/e-posta/vs; kullanıcı adı/e-posta benzersiz ise, bu kullanıcı için bir giriş veritabanında oluşturulur (Kalıcılık için Hazırda Bekletme özelliğini kullanıyorum)
  • oturum açma - kullanıcı POST kullanıcı adı ve parola. Tamamlarsa UUID oluşturulur ve kullanıcıya gönderilir (bu, gelecekteki talepler için bir belirteç olarak kullanılacaktır). Ben userID, token, validSince sütun olarak logedusers adında bir tablo var.

İşte benim için kafa karıştırıcı oluyor.

Kullanıcı tarafından yapılan tüm girdileri döndürmesi gereken başka bir yöntemin, getUserEntries olduğumu varsayalım. Bunu daha açık hale getirmek için, aşağıdaki alanları içeren bir Giriş tablosu olacaktır: inputId, userId, text.

Buradaki en iyi yaklaşım nedir?

ben şimdi ne yaparsak, ben bir get istek yapmak ve bu gibi belirteci geçmek: belirteci geçerli olup olmadığını, ben logedusers masa ve dayansın gelen kullanıcı kimliği almak,

localhost:8080/myApp/getUserEntries?token=erf34c34

Ardından o userId üzerinde, tüm girdileri alın ve json olarak döndürün. Böyle

şey: Ancak

@GET 
@Path("getUserEntries") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getUserEntries(@QueryParam("token") String token) {  
    String userId=getUserIdFromToken(token); 
    if (userId == null){ 
     return Response.status(Response.Status.UNAUTHORIZED).build(); 
    } else { 
     //get some data associated with that userId, put it in the response object and send it back 
     return Response.ok().entity(response).build(); 
    } 
} 

, onlar geçerli bir kullanıcı tarafından çağrılan eğer veri sağlar daha yöntemleri var ne olur?

Bu denetimi her yöntemin başında yapmak zorundayım.

Ben şeffaf bu yetkilendirme işlemini yapmak istiyorum

Yani, iki büyük soru burada:

  1. bu tasarım tamam mı? Kullanıcı/pass ile tüm kimlik doğrulaması, sunucu, kullanıcı için belirteçler gönderir ve depolar ve gönderir, kullanıcı gelecekteki istekleri üzerinde belirteci gönderir. i arayan kullanıcı kimliğini belirlemek gerekir birçok uç noktaları varsa
  2. ne yapmalıyım? Bunları bazı ek açıklamalarla işaretleyebilir, bir çeşit güvenlik sağlayıcısı/kimlik doğrulayıcısı kullanabilir miyim (doğrulama için kendi mantığımı ekleyebileceğim - örneğin belirtecin 5 günden eski olmaması vb.).

Teşekkür

cevap

2

bu tasarım tamam mı? Kullanıcı/pass ile tüm kimlik doğrulaması, sunucu, kullanıcı için belirteçler gönderir ve depolar ve gönderir, kullanıcı gelecekteki istekleri üzerinde belirteci gönderir.

Biraz sorun yok. Kavramsal seviye çok kötü değil (tamamen kendi kendine kayıt olmanız şartıyla) ancak arayüzün çok fazla ayarlanması gerekiyor. Evet, POST kayıt olmak ve giriş yapmak doğrudur, web sunucunuzun geri kalanı için ihtiyacınız olduğunda kimlik bilgisini bağlamdan dışarı çekmeniz ve yapabileceğiniz yöntem seviyesinde rol tabanlı erişim kontrolünü kullanmanız gerekir.

Konteynerin yerleşik bir dizi kimlik doğrulama ve yetkilendirme destek mekanizmasına sahip olduğunu unutmayın. Bunları kullanın.

Çağrılan kullanıcının kimliğini belirlemeniz gereken çok sayıda uç noktam varsa ne yapmalıyım? Bunları bazı ek açıklamalarla işaretleyebilir, bir çeşit güvenlik sağlayıcısı/kimlik doğrulayıcısı kullanabilir miyim (doğrulama için kendi mantığımı ekleyebileceğim - örneğin belirtecin 5 günden eski olmaması vb.).

kimliğine ihtiyaç duyarlar mı? Yoksa sadece kullanıcının onlara erişmesine izin verildiğini bilmeleri gerekiyor mu? Eğer ikincisiyse, en kolay yöntem, uygun bir @RolesAllowed ek açıklamasını yönteme koymaktır, bu noktada (uygun konfigürasyonda; JEE5 security docs'a bakın). Birincisi, geçerli eylem için HttpServletRequest nesnesini almanız ve kullanıcının kimliğini (veya henüz giriş yapmamışsanız null) almak için getUserPrincipal() yöntemini çağırmanız gerekir. This SO question, istek nesnesinin nasıl alınacağını açıklar; Bunu yapmanın birkaç yolu vardır ancak @Resource ek açıklama yoluyla enjeksiyon yapılmasını öneririm.

Ne yapmam, kullanıcıların normal olarak kendi kimliklerini @QueryParam aracılığıyla sağlamaları; Bu sadece kötüye kullanıma açık. Bunlara diğer kullanıcılara'u sormalarına izin verebilirsiniz, ancak daha sonra, geçerli kullanıcının diğer kullanıcı hakkında herhangi bir şey öğrenmesine izin verip vermediğine bağlı olarak onlara bir şey söyleyip söylemeyeceğinize karar vermeniz gerekir. Bu, gerçek bir uygulamada ortaya çıkan karmaşık güvenlik problemidir ve mevcut doğrulanmış kullanıcı kimliğine ihtiyaç duymak için iyi bir noktadır.