1. Überblick
In diesem kurzen Artikel implementieren wir eine einfache Funktion zum Ändern des eigenen Passworts, die dem Benutzer nach der Registrierung und Anmeldung zur Verfügung steht.
2. Client-Seite - Passwortseite ändern
Schauen wir uns die sehr einfache Seite des Kunden an:
<html>
<body>
<div id="errormsg" style="display:none"></div>
<div>
<input id="oldpass" name="oldpassword" type="password"/>
<input id="pass" name="password" type="password"/>
<input id="passConfirm" type="password"/>
<span id="error" style="display:none">Password mismatch</span>
<button type="submit" onclick="savePass()">Change Password</button>
</div>
<script src="jquery.min.js"></script>
<script type="text/javascript">
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);
});
}
</script>
</body>
</html>
3. Benutzerpasswort aktualisieren
Lassen Sie uns nun auch die serverseitige Operation implementieren:
@RequestMapping(value = "/user/updatePassword", method = RequestMethod.POST)
@PreAuthorize("hasRole('READ__PRIVILEGE')")
@ResponseBody
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));
}
Beachten Sie, wie die Methode durch die Annotation @ PreAuthorize gesichert wird, da sie nur für angemeldete Benutzer zugänglich sein sollte.
4. API-Tests
Schließlich wollen wir die API mit einigen API-Tests verwenden, um sicherzustellen, dass alles einwandfrei funktioniert. Wir beginnen mit der einfachen Konfiguration des Tests und der Dateninitialisierung:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
classes = { ConfigTest.class, PersistenceJPAConfig.class },
loader = AnnotationConfigContextLoader.class)
public class ChangePasswordApiTest {
private final String URL__PREFIX = "http://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);
}
}
}
Nun - versuchen wir das Passwort eines angemeldeten Benutzers zu ändern :
@Test
public void givenLoggedInUser__whenChangingPassword__thenCorrect() {
RequestSpecification request = RestAssured.given().auth()
.form("[email protected]", "test", formConfig);
Map<String, String> params = new HashMap<String, String>();
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"));
}
Weiter - versuchen wir, das Passwort zu ändern mit einem falschen alten Passwort :
@Test
public void givenWrongOldPassword__whenChangingPassword__thenBadRequest() {
RequestSpecification request = RestAssured.given().auth()
.form("[email protected]", "test", formConfig);
Map<String, String> params = new HashMap<String, String>();
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"));
}
Schließlich - versuchen wir, das Kennwort ohne Authentifizierung zu ändern:
@Test
public void givenNotAuthenticatedUser__whenChangingPassword__thenRedirect() {
Map<String, String> params = new HashMap<String, String>();
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"));
}
Beachten Sie, wie wir für jeden Test ein FormAuthConfig zur Verfügung stellen, um die Authentifizierung durchzuführen.
Wir setzen das Passwort auch über init () zurück, um sicherzustellen, dass vor dem Test das richtige Passwort verwendet wird.
5. Fazit
Und das ist ein Wrap - eine unkomplizierte Möglichkeit, dass der Benutzer sein eigenes Passwort nach der Registrierung und Anmeldung bei der Anwendung ändern kann
Die vollständige Implementierung dieses Tutorials finden Sie unter https://github.com/eugenp/spring-security-registration (das github-Projekt) - Dies ist ein auf Eclipse basierendes Projekt es ist.
-
"** Bisherige
https://www.baeldung.com/registrierungs-kennwort-kraft-und-regeln__registrierung - Passwortstärke und Regeln]