2013-04-08 18 views
9

AccessController.doPrivileged'u AccessControlContext ile arası sınıfları/yöntemlerine erişim kısıtlamasıyla kullanabileceğim bir yöntem var mı? Dosya sistemine dokunmadan veya soket açmadan güvenilmeyen kodu arayabilen bir alt rutine sahip olmak isterim.Kısıtlanmış izinlerle Java'da bir yöntem yürütme

Belirli kullanım durumu, son kullanıcıların sınırlı izinlerle yürütülebilen kod veya komut parçaları (örneğin, Javascript veya Groovy) sağlamasına olanak tanır.

Aradığım şey, tüm JVM yerine kullanıcı tarafından sağlanan kodun kapsamına giren normal güvenlik ilkesi dosyası gibi bir şey.

+0

Bump! Bu konuda başka bir şey buldun mu? – Lii

cevap

1

Artık AccessController yolu hakkında değilim. Ama muhtemelen aşağıdaki şemayı kullanarak durumu kontrol edebilirsiniz. Birden fazla sınıf yükleyicisine sahip olmanız gerekir: önce sınıfları olduğu gibi yükler. İkinci sınıf (ya da güvenilmeyen kod kaynakları tarafından ideal olarak), sınıfları yamalı ya da normal sınıflar yerine özel yamalı baskısı yerine dönüştürecek. Ve aslında rutin yapacak olan Sistem Klasörü için son. Ayrıca, Classloader.getSystemClassLoader öğesini korumayı da unutmayın. Ve nesneleri dönüştürmek için java yansıma API'sini veya objectweb asm kütüphanesini kullanabilirsiniz.

+0

ClassLoader, doğru yolda olabileceği gibi görünüyor. Sınıfları doğrudan dönüştürmekle ilgilenmiyorum. – wrschneider

+0

Neden değil? En basit ve net bir şekilde görünüyor. – cdkrot

+0

Bu sizin ihtiyaçlarınız için uygun mu? [link] (http://stackoverflow.com/questions/17045334/restrict-execution-of-a-method-with-java-annotations?rq=1) – cdkrot

0

bu bir şey mi

@PreAuthorize("hasRole('ROLE_USER')") 
public void create(Contact contact); 
Spring Security bir göz atmak isteyebilirsiniz

aradığınız ise, Expression-Based Access Control

+0

Hayır, Yöntemi kimin yürütebileceğini arıyorum - Yöntemin gerçekleştirildikten sonra yapabileceği şeyi arıyorum. – wrschneider

1

Java-Sandbox tam bunun için bir araçtır. Kısıtlı yöntemler için yalnızca beyaz listedeki sınıf ve kaynak kümesine erişim sağlamak için kullanılabilir. Bunu başarmak için özel bir sınıf yükleyici ve güvenlik yöneticisi ile bir sistem kullanır. Bayt kod manipülasyonu veya benzeri numaralar gerekli değildir.

Kullanmıyorum ama iyi tasarlanmış ve makul şekilde iyi belgelenmiş görünüyor. kendi web sitesinden

örnek kod:

class Untrusted extends SandboxedEnvironment<Object>() { 
    @Override 
    public Object execute() { 
     /* untrusted code */ 
     return null; 
    } 
}; 

service.runSandboxed(Untrusted.class, context); 
İlgili konular