• 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
• API Pendaftaran menjadi RESTful
• Keselamatan Musim Semi - Tetapkan Semula Kata Laluan Anda
• Pendaftaran - Kekuatan dan Peraturan Kata Laluan
• Mengemas kini Kata Laluan anda (artikel semasa)
1. Gambaran keseluruhan
Dalam artikel ringkas ini, kami akan melaksanakan fungsi "Ubah kata laluan saya sendiri" yang tersedia untuk pengguna setelah mereka mendaftar dan log masuk.
2. Bahagian Pelanggan - Tukar Halaman Kata Laluan Saya
Mari lihat halaman sisi pelanggan yang sangat mudah:
Password mismatch Change Password var serverContext = [[@{/}]]; function savePass(){ var pass = $("#pass").val(); var valid = pass == $("#passConfirm").val(); if(!valid) { $("#error").show(); return; } $.post(serverContext + "user/updatePassword", {password: pass, oldpassword: $("#oldpass").val()} ,function(data){ window.location.href = serverContext +"/home.html?message="+data.message; }) .fail(function(data) { $("#errormsg").show().html(data.responseJSON.message); }); }
3. Kemas kini Kata Laluan Pengguna
Sekarang mari kita laksanakan operasi sisi pelayan:
@PostMapping("/user/updatePassword") @PreAuthorize("hasRole('READ_PRIVILEGE')") public GenericResponse changeUserPassword(Locale locale, @RequestParam("password") String password, @RequestParam("oldpassword") String oldPassword) { User user = userService.findUserByEmail( SecurityContextHolder.getContext().getAuthentication().getName()); if (!userService.checkIfValidOldPassword(user, oldPassword)) { throw new InvalidOldPasswordException(); } userService.changeUserPassword(user, password); return new GenericResponse(messages.getMessage("message.updatePasswordSuc", null, locale)); }
Perhatikan bagaimana kaedah dijamin melalui anotasi @PreAuthorize , kerana kaedah ini hanya boleh diakses oleh pengguna yang log masuk .
4. Ujian API
Akhirnya, mari kita gunakan API dengan beberapa ujian API untuk memastikan semuanya berfungsi dengan baik; kita akan mulakan dengan konfigurasi mudah ujian dan inisialisasi data:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( classes = { ConfigTest.class, PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) public class ChangePasswordApiTest { private final String URL_PREFIX = "//localhost:8080/"; private final String URL = URL_PREFIX + "/user/updatePassword"; @Autowired private UserRepository userRepository; @Autowired private PasswordEncoder passwordEncoder; FormAuthConfig formConfig = new FormAuthConfig( URL_PREFIX + "/login", "username", "password"); @Before public void init() { User user = userRepository.findByEmail("[email protected]"); if (user == null) { user = new User(); user.setFirstName("Test"); user.setLastName("Test"); user.setPassword(passwordEncoder.encode("test")); user.setEmail("[email protected]"); user.setEnabled(true); userRepository.save(user); } else { user.setPassword(passwordEncoder.encode("test")); userRepository.save(user); } } }
Sekarang - mari cuba menukar kata laluan untuk pengguna yang log masuk :
@Test public void givenLoggedInUser_whenChangingPassword_thenCorrect() { RequestSpecification request = RestAssured.given().auth() .form("[email protected]", "test", formConfig); Map params = new HashMap(); params.put("oldpassword", "test"); params.put("password", "newtest"); Response response = request.with().params(params).post(URL); assertEquals(200, response.statusCode()); assertTrue(response.body().asString().contains("Password updated successfully")); }
Seterusnya - mari kita cuba menukar kata laluan dengan kata laluan lama yang salah :
@Test public void givenWrongOldPassword_whenChangingPassword_thenBadRequest() { RequestSpecification request = RestAssured.given().auth() .form("[email protected]", "test", formConfig); Map params = new HashMap(); params.put("oldpassword", "abc"); params.put("password", "newtest"); Response response = request.with().params(params).post(URL); assertEquals(400, response.statusCode()); assertTrue(response.body().asString().contains("Invalid Old Password")); }
Akhirnya - mari cuba menukar kata laluan tanpa pengesahan :
@Test public void givenNotAuthenticatedUser_whenChangingPassword_thenRedirect() { Map params = new HashMap(); params.put("oldpassword", "abc"); params.put("password", "xyz"); Response response = RestAssured.with().params(params).post(URL); assertEquals(302, response.statusCode()); assertFalse(response.body().asString().contains("Password updated successfully")); }
Perhatikan bagaimana - untuk setiap ujian - kami menyediakan FormAuthConfig untuk menangani pengesahan.
Kami juga menetapkan semula kata laluan melalui init () untuk memastikan kami menggunakan kata laluan yang betul sebelum ujian.
5. Kesimpulan
Dan itu adalah bungkus - cara mudah untuk membolehkan pengguna menukar kata laluan mereka sendiri setelah mendaftar dan masuk ke aplikasi.
The pelaksanaan penuh tutorial ini boleh didapati dalam projek github - ini adalah projek berasaskan Eclipse, jadi ia harus mudah untuk import dan berjalan kerana ia adalah.
« Pendaftaran Sebelumnya - Kekuatan dan Peraturan Kata Laluan