Pendaftaran dengan Spring Security - Pengekodan Kata Laluan

Artikel ini adalah sebahagian daripada siri: • Tutorial Pendaftaran Keselamatan Musim Semi

• Proses Pendaftaran Dengan Keselamatan Musim Semi

• Pendaftaran - Aktifkan Akaun Baru melalui E-mel

• Pendaftaran Keselamatan Musim Semi - Hantar semula E-mel Pengesahan

• Pendaftaran dengan Spring Security - Pengekodan Kata Laluan (artikel semasa) • API Pendaftaran menjadi RESTful

• Keselamatan Musim Semi - Tetapkan Semula Kata Laluan Anda

• Pendaftaran - Kekuatan dan Peraturan Kata Laluan

• Mengemas kini Kata Laluan anda

1. Gambaran keseluruhan

Artikel ini membincangkan bahagian penting dari proses pendaftaran - pengekodan kata laluan - pada dasarnya tidak menyimpan kata laluan dalam teks biasa.

Terdapat beberapa mekanisme pengekodan yang disokong oleh Spring Security - dan untuk artikel tersebut, kami akan menggunakan BCrypt , kerana biasanya penyelesaian terbaik yang ada.

Sebilangan besar mekanisme lain, seperti MD5PasswordEncoder dan ShaPasswordEncoder menggunakan algoritma yang lebih lemah dan kini tidak lagi digunakan.

2. Tentukan Pengekod Kata Laluan

Kami akan mulakan dengan menentukan BCryptPasswordEncoder ringkas sebagai kacang dalam konfigurasi kami:

@Bean public PasswordEncoder encoder() { return new BCryptPasswordEncoder(); }

Pelaksanaan lama - seperti SHAPasswordEncoder - memerlukan pelanggan memasukkan nilai garam semasa mengekod kata laluan.

BCrypt, bagaimanapun, secara dalaman akan menghasilkan garam rawak sebagai gantinya. Ini penting untuk difahami kerana ini bermaksud setiap panggilan akan mempunyai hasil yang berbeza, dan oleh itu kita hanya perlu mengekodkan kata laluan sekali sahaja.

Untuk membuat penghasilan garam secara rawak ini, BCrypt akan menyimpan garam di dalam nilai hash itu sendiri. Contohnya, dalam nilai hash berikut:

$2a$10$ZLhnHxdpHETcxmtEStgpI./Ri1mksgJ9iDP36FmfMdYyVg9g0b2dq

Terdapat tiga bidang yang dipisahkan oleh $:

  1. The "2a" mewakili versi algoritma Bcrypt
  2. The "10" mewakili kekuatan algoritma
  3. The "ZLhnHxdpHETcxmtEStgpI." bahagian sebenarnya adalah garam yang dihasilkan secara rawak. Pada dasarnya, 22 watak pertama adalah garam. Bahagian yang tersisa dari bidang terakhir adalah versi hash sebenarnya dari teks biasa

Juga, ketahui bahawa algoritma BCrypt menghasilkan String dengan panjang 60, jadi kita perlu memastikan bahawa kata laluan akan disimpan dalam lajur yang dapat menampungnya. Kesalahan yang biasa dilakukan ialah membuat lajur dengan panjang yang berbeza dan kemudian mendapat ralat Nama Pengguna atau Kata Laluan Tidak Sah pada masa pengesahan.

3. Encode Kata Laluan semasa Pendaftaran

Kami sekarang akan menggunakan PasswordEncoder di UserService kami untuk mencirikan kata laluan semasa proses pendaftaran pengguna:

Contoh 3.1. - The UserServic e Hash Kata Laluan yang disediakan

@Autowired private PasswordEncoder passwordEncoder; @Override public User registerNewUserAccount(UserDto accountDto) throws EmailExistsException { if (emailExist(accountDto.getEmail())) { throw new EmailExistsException( "There is an account with that email adress:" + accountDto.getEmail()); } User user = new User(); user.setFirstName(accountDto.getFirstName()); user.setLastName(accountDto.getLastName()); user.setPassword(passwordEncoder.encode(accountDto.getPassword())); user.setEmail(accountDto.getEmail()); user.setRole(new Role(Integer.valueOf(1), user)); return repository.save(user); }

4. Encode Kata Laluan pada Pengesahan

Sekarang mari kita menangani separuh proses ini dan mengekodkan kata laluan apabila pengguna mengesahkan.

Pertama, kita perlu memasukkan kata pengekod kata laluan yang kita tentukan sebelumnya ke penyedia pengesahan kami:

@Autowired private UserDetailsService userDetailsService; @Bean public DaoAuthenticationProvider authProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(encoder()); return authProvider; }

Konfigurasi keselamatannya mudah:

  • kami menyuntikkan pelaksanaan perkhidmatan perincian pengguna
  • kami menentukan penyedia pengesahan yang merujuk perkhidmatan perincian kami
  • kami juga mengaktifkan pengekod kata laluan

Dan akhirnya, kita perlu merujuk penyedia autentikasi ini dalam konfigurasi XML keselamatan kita:

Atau, sekiranya anda menggunakan konfigurasi Java:

@Configuration @ComponentScan(basePackages = { "com.baeldung.security" }) @EnableWebSecurity public class SecSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider()); } ... }

5. Kesimpulan

Tutorial ringkas ini meneruskan siri Pendaftaran dengan menunjukkan cara menyimpan kata laluan dalam pangkalan data dengan betul dengan memanfaatkan pelaksanaan BCrypt yang mudah tetapi sangat kuat.

The pelaksanaan penuh Pendaftaran ini dengan tutorial Spring Keselamatan boleh didapati lebih pada GitHub.

Seterusnya » API Pendaftaran menjadi TERBAIK « Pendaftaran Keselamatan Musim Semi Sebelumnya - Hantar semula E-mel Pengesahan