SORU
11 Aralık 2008, PERŞEMBE


Bahar Güvenlik birimi ile test

Şirketim Spring MVC eğer bir sonraki projemiz olarak bunu kullanmalıyız olmadığını belirlemek için değerlendirilmiştir. Şu ana kadar gördüğüm şeyi seviyorum, ve şu anda Bahar Güvenlik modülüne bir göz varsa biz/kullanması gereken bir şey olup olmadığını öğrenmek için alıyorum.

Bizim güvenlik gereksinimleri oldukça basit; kullanıcı sadece ihtiyacı sağlayabilmek için kullanıcı adı ve şifre olmak üzere erişim bazı parçaların site (gibi bilgi al hakkında, onların hesabı); ve orada bir avuç sayfalarında site (SSS, Destek, vb.) bir anonim kullanıcı verilmelidir erişim.

Bu prototip oldum oluşturma, ben saklamak bir "LoginCredentials" nesne (hangi sadece içerir kullanıcı adı ve parola) Oturum için bir kullanıcı kimliği doğrulanmış; bazı denetleyicileri kontrol edin eğer bu nesne oturum için bir başvuru almak için, oturum açan kullanıcı adı, örneğin. Bakıyorum yerine ev yapımı bu mantık ile Bahar Güvenlik yerine, ki bu güzel bir avantaj kaldırma herhangi bir tür "nasıl bulacağız giriş yapmış kullanıcılar?" ve "nasıl tanıtması?" benim denetleyicisi/ticari kodu.

Bahar Güvenlik "bağlam" nesne uygulaması... ... her yerden kullanıcı adı/Müdür bilgi erişebilmeleri için bir (başına iş parçacığı) sağlar gibi görünüyor

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();

... bu nesne gibi-Bahar un gibi olan bir (küresel) singleton, bir şekilde.

Benim sorum şu: eğer bu standart yol erişim hakkında bilgi doğrulanmış kullanıcı Bahar Güvenlik, kabul şekilde enjekte bir Kimlik nesnesi haline SecurityContext olduğu için benim birim testleri birim testleri gerektiren bir kimliği doğrulanmış bir kullanıcı?

Bu, her bir test başlatma yönteminde Tel gerek var mı?

protected void setUp() throws Exception {
    ...
    SecurityContextHolder.getContext().setAuthentication(
		new UsernamePasswordAuthenticationToken(testUser.getLogin(), testUser.getPassword()));
    ...
}

Bu aşırı ayrıntılı görünüyor. Daha kolay bir yolu var mı?

SecurityContextHolder BM-Bahar-kendisi gibi görünüyor... çok nesne

CEVAP
28 Aralık 2008, Pazar


Çok haklısın endişelenmekte - statik yöntem çağrıları kolayca bağımlılıkları alay edemez gibi birim test için özellikle sorunludur. Size göstermek için gidiyorum ne Bahar IoC konteyneri sizin için kirli işler yapmak, temiz, test edilebilir kod ile mi terk edelim. SecurityContextHolder bir çerçeve sınıf ve süre olabilir Tamam için düşük-seviye güvenlik kodu için bağlı, muhtemelen maruz istediğiniz bir kıvrımlara arayüzü için UI bileşenleri (yani denetleyicileri).

cliff.meyers bunu yapmanın tek yolu - "Müdür" yazın ve tüketicilere bir örnek enjekte. kendi oluşturmak bahsedilen Bahar <aop:scoped-proxy^/. tag 2 tanıtıldı.x bir istek bean tanımı kapsamı ile birlikte, ve fabrika yöntemi desteği en okunabilir kod için bilet olabilir.

Aşağıdaki gibi olabilir:

public class MyUserDetails implements UserDetails {
    // this is your custom UserDetails implementation to serve as a principal
    // implement the Spring methods and add your own methods as appropriate
}

public class MyUserHolder {
    public static MyUserDetails getUserDetails() {
        Authentication a = SecurityContextHolder.getContext().getAuthentication();
        if (a == null) {
            return null;
        } else {
            return (MyUserDetails) a.getPrincipal();
        }
    }
}

public class MyUserAwareController {        
    MyUserDetails currentUser;

    public void setCurrentUser(MyUserDetails currentUser) { 
        this.currentUser = currentUser;
    }

    // controller code
}

Şimdilik bir şey yok, değil mi karışık? Aslında muhtemelen bu çoğu zaten vardı. Sonraki, fasulye kendi bağlamında asıl tutma isteği kapsamlı bir fasulye tanımlayın:

<bean id="userDetails" class="MyUserHolder" factory-method="getUserDetails" scope="request">
    <aop:scoped-proxy/>
</bean>

<bean id="controller" class="MyUserAwareController">
    <property name="currentUser" ref="userDetails"/>
    <!-- other props -->
</bean>

CurrentUser özelliği için kullanilir büyüsü:kapsamlı-proxy etiketi, getUserDetails yeni bir HTTP isteği geliyor her zaman çağrılır statik yöntem ve referanslar sayesinde doğru bir şekilde çözülecek. Şimdi birim test önemsiz hale gelir:

protected void setUp() {
    // existing init code

    MyUserDetails user = new MyUserDetails();
    // set up user as you wish
    controller.setCurrentUser(user);
}

Bu yardımcı olur umarım!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • RD

    RD

    19 NİSAN 2006
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006
  • Vladimir Jenko

    Vladimir Jen

    1 Mart 2010