2011-12-15 20 views
31

Var yapılandırma (ApplicationContext-security.xml):Bahar Güvenlik: DB ve ApplicationContext şifre kodlama

... 
    public static final String DEF_USERS_BY_USERNAME_QUERY = 
      "select username,password,enabled " + 
      "from users " + 
      "where username = ?"; 
... 

: diğer taraftan

<authentication-manager alias="authenticationManager"> 
    <authentication-provider> 
    <password-encoder hash="sha"/> 
     <jdbc-user-service data-source-ref="dataSource"/> 
    </authentication-provider> 
</authentication-manager> 

benim dataSource (o JdbcDaoImpl var) den SQLs var Bu kodda şu anda sha hakkında bir kelime var, bu yüzden şifrelenmemiş standart Spring Security users tablosundan şifre seçildi. olduğu gibi DB kaydedilen şimdi şifre için

<class name="model.UserDetails" table="users"> 
    <id name="id"> 
     <generator class="increment"/> 
    </id> 
    <property name="username" column="username"/> 
    <property name="password" column="password"/> 
    <property name="enabled" column="enabled"/> 
    <property name="mail" column="mail"/> 
    <property name="city" column="city"/> 
    <property name="confirmed" column="confirmed"/> 
    <property name="confirmationCode" column="confirmation_code"/> 

    <set name="authorities" cascade="all" inverse="true"> 
     <key column="id" not-null="true"/> 
     <one-to-many class="model.Authority"/> 
    </set> 

</class> 

ancak kodlanmış olmalıdır:

Belki, burada benim hazırda eşleme config password sütun için bazı sha niteliğini sağlamalıdır.

applicationContext nasıl yapılandırılır ve DB sorguları aynı parola kodlamada olur? Bahar güvenlik 3.1 Kullanılması

cevap

73

bir karma sistemi kendini seçerek yerine zaten karma şifreleri içeren mevcut veritabanı kullanarak bir uygulama oluşturuyorsanız, o zaman karma algoritması aynı zamanda bir tuz kullandığından emin olun. Sadece sade bir özet kullanmayın.

İyi bir seçenek, şu anda doğrudan Spring Security 3.1'de BCryptPasswordEncoder (jBCrypt kullanılarak gerçekleştirilmiştir) aracılığıyla desteklediğimiz iyi bir seçimdir. Bu otomatik olarak bir tuz üretir ve bunu tek bir String'de karma değeriyle birleştirir. Bazı veritabanlarında hashleme için yerleşik destek (ör. Postgres) bulunmaktadır. Aksi takdirde, JDBC geçirmeden önce şifreyi kendiniz karma gerekir: Eğer bir kullanıcı oluştururken şifreleri kodlamak için yapmanız gereken tek şey

String password = "plaintextPassword"; 
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String hashedPassword = passwordEncoder.encode(password); 

.kabul edilen cevap

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

<bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <property name="userDetailsService" ref="yourJdbcUserService" /> 
    <property name="passwordEncoder" ref="encoder" /> 
</bean> 
+0

Luke Taylor, teşekkürler, bilmek istediğim - DB'ye eklemeden önce kendimi şifreye eklemem gerektiğini söyledi. – sergionni

+0

tuz hakkında, biliyorum, bu benim güvenlik sorunumun bir sonraki aşamasıdır)) – sergionni

+4

Eğer bcrypt gibi bir şey kullanırsanız, o zaman sizin için otomatik olarak ele alınır, bu yüzden gerçekten herhangi bir meydan okuma yoktur :-). Tuzu kendiniz işlemek zorunda değilsiniz. –

5

, şunu deneyin:

yenilikler
<authentication-manager alias="authenticationManager"> 
    <authentication-provider user-service-ref="service"> 
     <password-encoder hash="sha"/> 
     <jdbc-user-service data-source-ref="dataSource"/> 
    </authentication-provider> 
</authentication-manager> 

<beans:bean id="dataSource" ...> 
    ... 
</beans:bean> 

<beans:bean id="service" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> 
     <beans:property name="dataSource" ref="dataSource"/> 
     ... 
</beans:bean> 

: authentication-provider puan service ve service puana datasource için.

Düzenleme: Java'da böyle bir şey ile şifreyi kodlamak zorunda kalacak:

DigestUtils.sha(request.getParameter("password")); 

uyar: Dikkatli olun! SHA'u MD5 ile karıştırmayın! Eğer SHAauthentication-providerolarak bir password-encoder ayarlarsanız

, sen Java tutarlı tutmak için aynı şekilde kodlamak gerekiyor. Ancak Java'yı MD5 olarak bulduğunuz örnek olarak, hash değerini "md5" olarak ayarlamayı unutmayın. DigestUtils da md5 kodlayıcı sağlamaktadır:

DigestUtils.md5(request.getParameter("password")); 
+0

evet, biliyorum ek açıklamalarla bunu yapmak için sadece bir ipucu, ancak bu kullanıcı şifresi DB – sergionni

+1

Pınarı'na kodlanmış kaydedilmiş sağlamak için nasıl benim soru üzerine sormadı, bilmiyorum Sağlamak için ne demek istediğini biliyorum, ancak devam etmek için [DigestUtils] 'i kullandım (http://commons.apache.org/codec/apidocs/org/apache/commons/codec/digest/DigestUtils.html). – falsarella

+1

@sergionni: Üzgünüm, ama şifrelenmiş şifreyi otomatik olarak kaydetmek için applicationContext'in bir yapılandırmasını bilmiyorum, dediğim gibi Apache commons'tan DigestUtils'i kullandım. – falsarella

8

Biraz daha açıklama:

kimlik doğrulaması için, böyle bir şey kullanmak. Umarım birisine yardım eder.

Hash veritabanına koymadan önce şifre kendiniz:

String password = "plaintextPassword"; 
PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String hashedPassword = passwordEncoder.encode(password); 

Kimlik Sağlayıcı sınıfına bir özellik olarak passwordEncoder ekle güvenlik-config.xml için BCryptPasswordEncoder fasulye ekleyin. Otomatik olarak yönlendirin veya setter ve getter yöntemleri sağlayın.

@AutoWired 
private BCryptPasswordEncoder passwordEncoder; 

mülkü al ederken hem şifreleri 3.1.x ile

new BCryptPasswordEncoder().matches(plainTextPasswdFromUserInput, hashedPasswdFromDb) 
1

kimlik denetimiyle bu haritalama çalışmıyor giriş

<bean id="dbAuthenticationProvider" class="mypackage.auth.spring.DBAuthenticationProvider" > 
    <property name="dataSource" ref="routingDataSource"></property> 
    <property name="passwordEncoder" ref="encoder" /> 
    <property name="passwordQuery" 
     value="select password as password from tbl where username=:username"> 
    </property> 
</bean> 

için Ve kimlik doğrulama sınıfı maçında sen authendicate kullanıcı. Çalışma yoludur: Basit bir şekilde

<beans:bean id='bCryptPasswordEncoder' class='org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder'></beans:bean> 

<authentication-manager> 
    <authentication-provider user-service-ref="userDetailsService"> 
      <password-encoder ref="bCryptPasswordEncoder"/> 
    </authentication-provider> 
</authentication-manager> 
5

Java'da

<authentication-manager alias="authenticationManager"> 
    <authentication-provider> 
    <password-encoder ref="encoder"/> 
    <jdbc-user-service data-source-ref="dataSource" 
     users-by-username-query=" 
      select username,password, enabled 
      from principal where username=?" 
     authorities-by-username-query=" 
      select p.username, a.authority from principal p, authority a 
      where p.id = a.principal_id and p.username=?" 
    /> 
    </authentication-provider> 
</authentication-manager> 

    <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

public static String encodePasswordWithBCrypt(String plainPassword){ 
    return new BCryptPasswordEncoder().encode(plainPassword); 
} 

Sonra o

System.out.println(encodePasswordWithBCrypt("fsdfd")); 
sınamak Eğer ApplicationContext-security.xml gibi bir şey yapabilirsiniz
2

Kabul edilen cevap doğru. yayın 3.1 ve BCrypt kodlama algoritmasıyla test ettim.

Bir kullanıcı oluştururken.

PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
userEntity.setPassword(passwordEncoder.encode(userEntity.getPassword())); 
userDao.save(userEntity); 

kullanıcı girişi Unutmayın

, açık şifresi ( karma değil) kullanın. tıpkı:

İşte
Authentication request = new UsernamePasswordAuthenticationToken(user.getUserName(), user.getPassword()); 
Authentication result = authenticationManager.authenticate(request); 
SecurityContextHolder.getContext().setAuthentication(result); 

güvenlik-config geçerli:

<bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
     <property name="userDetailsService" ref="userService" /> 
     <property name="hideUserNotFoundExceptions" value="false" /> 
     <property name="passwordEncoder" ref="encoder" /> 
    </bean> 

Birini yardımcı olacaktır Umut!

2

@Configuration 
@EnableWebSecurity 
@PropertySource("classpath://configs.properties") 
public class SecurityContextConfig extends WebSecurityConfigurerAdapter { 


@Autowired 
@Qualifier("userDetailsService") 
private UserDetailsService userDetailsService; 

@Autowired 
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(getPasswordEncoder()); 
} 


@Bean(name = "passwordEncoder") 
public PasswordEncoder getPasswordEncoder(){ 
    return new BCryptPasswordEncoder();  
} 

} 
İlgili konular