2017-04-06 20 views
5

Yay profilim "DEV" var ve sahip olduğum tek profil ve "üretim" profili oluşturmak istemiyorum. Bu yüzden sadece profil "DEV" olduğunda, yay güvenliği için belirli türde bir fasulye ister (bu, bir bellek konuk kullanıcısı ve bir kullanıcı kaşığıdır)Yay profili varsayılan davranışı

Ancak benim tomcat başlatımda hiçbir yay profili sağlanmamışsa, Bu, üretimdeki durumdur. Uygulamamın halihazırda ne yaptığını sürdürmesini istiyorum (ldap authenticatin sağlayıcısı kullanarak).

Başlangıçta bir profil sağlamadan "varsayılan" fasülye davranışını tanımlamanın bir yolu var mı? Veya aşağıdaki koduma bakabilirsiniz ve belki farklı bir çözüm önerebilirsin.

@Autowired 
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception { 

     auth 
       .eraseCredentials(false) 
       .authenticationProvider(provider) 
       .authenticationProvider(jwtConfig.jwtAuthenticationProvider()); 
} 


@Bean 
public UserDetailsService userDetailsService() { 
    final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator()); 
    return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService)); 
} 

@Bean 
@Profile("DEV") 
public UserDetailsService devUserDetailsService() { 
useAnonymous = true; 
     InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder() 
       .withUser("user").password("password").authorities(ROLE_USER, ROLE_ADMIN).and(); 

     return new CompositeUserDetailsService(Arrays.asList(b.build(), 
       technicalUserDetailsService())); 

} 
@Bean 
public AuthenticationProvider ldapAuthenticationProvider() { 
    final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource()); 
    ba.setUserSearch(ldapUserSearch()); 
    return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator()); 
} 
+0

Zaten denedin mi? Eğer öyleyse, bir şeyler ters gitti mi? – john16384

+0

Sadece fasulye tanımlayarak ve profil aktif olduğunda geçersiz kıl ...Temel olarak varsayılan davranış olan W. –

cevap

6

@Profile'un yaptığı yanlış anlaşılma olduğunu düşünüyorum. @Profile ile işaretlenmiş olan fasulye, yalnızca bu profil aktif olduğunda yüklenir, ancak seçilen profile bakılmaksızın diğer tüm fasulyeler (@Profile olmadan) yine de her zaman yüklenir.

1) Mark @Primary böylece Bahar istediğiniz bağışta bulunan kimse bu yana (aynı türden iki fasulye yüklendiğinde almaya hangisinin bilir de @Profile("dev") ile tüm bu fasulye:

Bunu çözmek için birkaç yollarını görmek üretim profili kullanmak için).

2) profil dev @Profile("!dev") aktif olduğunda yüklenmemelidir fasulye Mark - sadece Bahar 3.2 uygulanabilir ve daha yüksek (https://github.com/spring-projects/spring-framework/commit/bcd44f3798ed06c0704d2a3564b8a9735e747e87 bakınız).

Ya da ...

3) Bir üretim profilini kullanın ve sadece örneğin web.xml dosya (muhtemelen yerel olarak kullanmayın şey) onu içinde aktif hale getirin.

Birden çok @Configuration sınıfını oluşturun ve tüm sınıfı bir profille işaretleyin (ayrıca ilgili öğeleri bir arada tutmaya da yardımcı olur). Tipik bir örnek veritabanı içindir. Üretim veritabanı (JNDI ve Oracle ile bir şey) ve bir yerel geliştirme ve test (HSQLDB) için bir yapılandırma sınıfı oluşturun. Sadece iki farklı @Configuration sınıflar arasında mantıksal olarak onları bölmek, bireysel fasulye işaretlemek için gerek -

Sen @Profile("production") ile Jndi Yapılandırma sınıf ve @Profile("dev") ile diğer işaretler. Bütünleştirme testi ile birleştirildiğinde, bu bizim için gerçekten işe yaradı.

+0

tnx, ilk çözümünüz doğru fasulyeleri toplamak için iyi çalışıyor gibi görünüyor, ancak bir şekilde hala misafir kullanıcıyla giriş yapamıyorum. "auth.userDetailsService (userDetailsService())" kullanıldığında bir dev profili ve "auth.authenticationProvider (sağlayıcı)" ise ne zaman dev? Örnekte – Spring

+0

örneğimdeki ilk yöntemde yapılandırılmış. Buna cevap vermek için biraz eksik görünüyor ... ancak, bence iki 'AuthenticationManager' fasulye, biri dev' profili ve bir tane (ya da' ile) yapmalısınız. dev'). Bu iki yöntemde, fasulyeyi profile göre farklı şekilde yapılandırabilirsiniz. – john16384

+0

teşekkürler. Btw Birincil açıklama benim için işe yaramadı ve ben "! DEV" sözdizimini kullandım – Spring

1

ben bu şekilde fasulye tanımını geçersiz olacaktır:

@Autowired 
public void configureGlobal(final AuthenticationManagerBuilder auth, final AuthenticationProvider provider) throws Exception { 

     auth 
       .eraseCredentials(false) 
       .authenticationProvider(provider) 
       .authenticationProvider(jwtConfig.jwtAuthenticationProvider()); 
} 


@Bean("myUserDetailService") 
public UserDetailsService userDetailsService() { 
    final LdapUserDetailsService ldapUserDetailsService = new LdapUserDetailsService(ldapUserSearch(), ldapAuthoritiesPopulator()); 
    return new CompositeUserDetailsService(Arrays.asList(technicalUserDetailsService(), ldapUserDetailsService)); 
} 

@Bean("myUserDetailService") 
@Profile("DEV") 
public UserDetailsService devUserDetailsService() { 
useAnonymous = true; 
     InMemoryUserDetailsManagerBuilder b = new InMemoryUserDetailsManagerBuilder() 
       .withUser("guest").password("guest").authorities(ROLE_USER, ROLE_ADMIN).and(); 

     return new CompositeUserDetailsService(Arrays.asList(b.build(), 
       technicalUserDetailsService())); 

} 
@Bean("myAuthProvider") 
public AuthenticationProvider ldapAuthenticationProvider() { 
    final BindAuthenticator ba = new BindAuthenticator((BaseLdapPathContextSource) contextSource()); 
    ba.setUserSearch(ldapUserSearch()); 
    return new LdapAuthenticationProvider(ba, ldapAuthoritiesPopulator()); 
} 

@Bean("myAuthProvider") 
@Profile("DEV") 
public AuthenticationProvider devAuthenticationProvider() { 

    //find a way to return userdetails here 

} 

Bu şekilde "DEV" profil varsayılan fasulye geçersiz gerektiğini profilde tanımlanan fasulye başlatıldığında

Fasulyeyi otomatik olarak bağladığınızda, @Qualifier ek belirtimini kullanmalısınız

Umarız yararlı olur

Angelo

İlgili konular