2011-07-26 23 views
9

Web uygulamamın basit bir dinlendirici arabirimi oluşturmak için JAX-RS'yi kullanmaya başladım. Şu anda, yalnızca tüm uygulama verilerine erişimi olan bir iç istemci tarafından kullanılıyor (salt okunur) ve erişim için http temel kimlik doğrulamasını kullanıyorum. Uygulamamın görünüm katmanının bir parçası olarak kullanmaya başlamak istiyorum ve belirli işlemlere yalnızca bir kullanıcı web uygulaması aracılığıyla giriş yaptığında izin verilir. Çok sayıda kodu tekrar etmeden, her iki kimlik doğrulama biçimini zarif bir şekilde kullanmamı sağlayan bir desen bulmaya çalışıyorum. İşte kabaca şu ki:Java Restful Web Services (jax rs) kimlik doğrulama modeli

Veritabanında saklanan bir uygulama oturumu yüklemek için ilk önce bir sınıf.

@Path("/protected/resource") 
public class ProtectedResource { 
    @GET 
    @Produces(MediaType.TEXT_JSON) 
    @Path("{userId}") 
    public String getProtectedResourceJson(@Context HttpServletRequest request, @PathParam("userId") Integer userId) { 
     // Return Charity List XML 
     AppSession session = RestUtil.getAuthenticatedSession(request); 

     if (session.canAccessUser(userId)) //get Json... 
    } 
} 

İşte amacıyla, AppSession en temel bakış var:

public class RestUtil { 
    public static AppSession getAuthenticatedSession(HttpServletRequest request) { 
     AppSession session; 
     String remoteUser = request.getRemoteUser(); 
     if (remoteUser != null) { 
      session = SessionRepository.loadSessionByRemoteUser(remoteUser); 
     } else { 
      session = SessionRepository.loadSessionById(request.getSession().getId()); 
     } 
     return session; 
    } 
} 

İşte bir kimliği doğrulanmış kullanıcı için erişilebilir olduğu veya bizim http temel kimlik doğrulaması istemci bir yöntemle, bizim bir kaynak Bu soru:

public class AppSession { 
    User authenticatedUser; 
    String remoteUser; 

    public boolean canAccessUser(Integer userId) { 
     if (remoteUser != null) { 
      //this client has access to all users 
      return true; 
     } else if (authenticatedUser.getId().equals(userId)) { 
      //this is local client, calling the service from a view 
      //only has access to authenticatedUser 
      return true; 
     } else { 
      return false; 
     } 
    } 
} 

Dahası, sadece url işaret yetkisiz üçüncü kişilerin, nasıl kimlik doğrulama her türlü gerektirmeyen hizmetleri ve g için Verileri boş zamanlarında mı kullanıyorlar?

cevap

5

Nesnelerin güvenlik tarafını iş mantığınızdan ayırmak için yönelimli yönelimi kullanmayı düşünmeye değer bir noktaya geliyorsunuz. Uygulamanızın parçalarını (karmaşık sunucular için önerdiğim) birleştirmek için Spring'i kullanıyorsanız, o zaman güvenlik mantığını enjekte etmek için Spring AOP'ye eklemeniz yeterlidir. Aksi halde AspectJ'i doğrudan kullanın. Çoklu oturum açma modlarını işlemek için gerçek mantık muhtemelen özel olmalı, ancak en azından bunu karantinada tutabilirsiniz.

İlkbahar kullanılıyorsa, Bahar Güvenliğini kullanmayı düşünün; İlkbahar AOP'nin üzerine inşa edilir ve size daha fazla çözüm sunar. Sadece bahar olsaydı

+0

. Artı tarafta, her zaman Aspectj içine bakmak için bir bahane istedim. –

İlgili konular