A regisztráció folyamata a tavaszi biztonsággal
• A regisztráció folyamata tavaszi biztonsággal (aktuális cikk) • Regisztráció - Új fiók aktiválása e-mailben
• Tavaszi biztonsági regisztráció - Ellenőrző e-mail újraküldése
• Regisztráció a Spring Security-nél - Jelszó kódolás
• A Registration API RESTful lesz
• Tavaszi biztonság - állítsa vissza jelszavát
• Regisztráció - A jelszó erőssége és szabályai
• Jelszavának frissítése
1. Áttekintés
Ebben a cikkben egy alapvető regisztrációs folyamatot valósítunk meg a Spring Security alkalmazással. Ez az előző cikkben feltárt fogalmakra épít, ahol a bejelentkezést néztük meg.
A cél itt a hozzáadás a teljes regisztráció folyamata amely lehetővé teszi a felhasználó számára a regisztrációt, érvényesíti és kitartja a felhasználói adatokat.
2. A regisztrációs oldal
Először - valósítsunk meg egy egyszerű regisztrációs oldalt a következő mezőket:
- név (kereszt-és vezetéknév)
- Jelszó (és jelszó megerősítő mező)
A következő példa egyszerű regisztráció.html oldal:
2.1. Példa
forma
első Érvényesítési hiba
utolsó Érvényesítési hiba
email Érvényesítési hiba
Jelszó Érvényesítési hiba
erősítse meg a bejelentkezés benyújtását
3.A felhasználói DTO objektum
Szükségünk van egy Adatátviteli objektum hogy az összes regisztrációs információt elküldjük tavaszi háttérprogramunknak. A DTO Az objektumnak rendelkeznie kell minden olyan információval, amelyre később szükségünk lesz, amikor létrehozzuk és feltöltjük az objektumunkat Felhasználó tárgy:
public class UserDto {@NotNull @NotEmpty private String keresztnév; @NotNull @NotEmpty privát karakterlánc vezetéknév; @NotNull @NotEmpty private String jelszó; privát String matchingPassword; @NotNull @NotEmpty privát karakterlánc e-mail; // szabványos mérőeszközök és beállítók}
Vegye figyelembe, hogy szabványt használtunk javax.validálás annotációk a DTO objektum mezején. Később mi is fogunk valósítsuk meg saját egyéni validációs jegyzeteinket az e-mail cím formátumának érvényesítéséhez, valamint a jelszó megerősítéséhez. (lát 5. szakasz)
4. A Regisztráció Adatkezelő
A Regisztrálj link a Belépés oldal a felhasználót a bejegyzés oldalt. Az oldalnak ez a hátsó része a regisztrációs vezérlőben található, és hozzá van rendelve "/felhasználó regisztráció":
4.1. Példa - A showRegistration Módszer
@GetMapping ("/ user / registration") public String showRegistrationForm (WebRequest kérés, modell modell) {UserDto userDto = new UserDto (); model.addAttribute ("felhasználó", userDto); return "regisztráció"; }
Amikor a vezérlő megkapja a kérést "/felhasználó regisztráció", létrehozza az újat UserDto objektum, amely vissza fogja állítani a bejegyzés formában, összeköti és visszatér - elég egyértelmű.
5. A regisztrációs adatok ellenőrzése
Következő - nézzük meg azokat az érvényesítéseket, amelyeket a vezérlő végrehajt egy új fiók regisztrálásakor:
- Az összes kötelező mező kitöltve van (nincs üres vagy üres mező)
- Az e-mail cím érvényes (jól formázott)
- A jelszó megerősítő mező megegyezik a jelszó mezővel
- A fiók még nem létezik
5.1. A beépített érvényesítés
Az egyszerű ellenőrzésekhez a dobozon kívüli bab-ellenőrzési jelöléseket használjuk a DTO objektumon - @Nem nulla, @Nem üresstb.
Az érvényesítési folyamat elindításához egyszerűen fel kell tüntetni a vezérlő réteg objektumát a @Érvényes kommentár:
public ModelAndView registerUserAccount (@ModelAttribute ("user") @Valid UserDto userDto, HttpServletRequest kérés, hibák hibái) {...}
5.2. Egyéni ellenőrzés az e-mail érvényességének ellenőrzéséhez
Következő - ellenőrizzük az e-mail címet, és győződjünk meg arról, hogy jól formált. Építünk egy egyedi érvényesítő erre, valamint a egyedi érvényesítési kommentár - hívjuk @Érvényes email.
Gyors bemutató itt - a saját egyéni feljegyzésünket készítjük Hibernate-é helyett@Email mert Hibernate a régi intranetes címformátumot veszi figyelembe: [e-mail védett] érvényesnek (lásd a Stackoverflow cikket), ami nem jó.
Itt található az e-mail ellenőrzési kommentár és az egyéni ellenőrző:
5.2.1. Példa - Az e-mail-hitelesítés egyéni kommentárja
@Target ({TÍPUS, TERÜLET, ANNOTATION_TYPE}) @Retention (RUNTIME) @Constraint (validatedBy = EmailValidator.class) @Dokumentált nyilvános @interface ValidEmail {String üzenet () alapértelmezett "Érvénytelen e-mail"; Osztály [] csoportok () alapértelmezett {}; Class [] hasznos teher () alapértelmezett {}; }
Ne feledje, hogy a jelölést a TERÜLET szint - mivel ez fogalmilag érvényes.
5.2.2. Példa - A szokás EmailValidator:
public class EmailValidator megvalósítja a ConstraintValidator {private Pattern pattern; privát Matcher matcher; privát statikus végleges karakterlánc EMAIL_PATTERN = "^ [_ A-Za-z0-9 - +] + (. [_ A-Za-z0-9 -] +) * @" + "[A-Za-z0-9 -] + (. [A-Za-z0-9] +) * (. [A-Za-z] {2,}) $ "; @Override public void inicializálás (ValidEmail constraintAnnotation) {} @Orride public logikai isValid (String email, ConstraintValidatorContext context) {return (validateEmail (email)); } private boolean validateEmail (String email) {pattern = Pattern.compile (EMAIL_PATTERN); egyező = minta.matcher (e-mail); return matcher.matches (); }}
Nézzük most használja az új megjegyzéseket miénken UserDto végrehajtás:
@ValidEmail @NotNull @NotEmpty privát karakterlánc e-mail;
5.3. Az egyedi ellenőrzés használata a jelszó megerősítéséhez
Szükségünk van egy egyedi feljegyzésre és validátorra is, hogy megbizonyosodjunk arról, hogy a Jelszó és matchingPassword mezők egyeznek:
5.3.1. Példa - Az egyedi megjegyzés a jelszó megerősítésének érvényesítéséhez
@Target ({TÍPUS, ANNOTATION_TYPE}) @Retention (RUNTIME) @Constraint (validatedBy = PasswordMatchesValidator.class) @Dokumentált nyilvános @interface PasswordMatches {String üzenet () alapértelmezett "A jelszavak nem egyeznek"; Osztály [] csoportok () alapértelmezett {}; Class [] hasznos teher () alapértelmezett {}; }
Figyeljük meg, hogy a @Cél az annotáció azt jelzi, hogy ez a TÍPUS szint annotáció. Ez azért van, mert szükségünk van az egészre UserDto objektum az érvényesítés elvégzéséhez.
Az alábbi jelöléssel meghívható egyéni ellenőrző az alábbiakban látható:
5.3.2. Példa A PasswordMatchesValidator Custom Validator
public class PasswordMatchesValidator implementálja a ConstraintValidator {@Override public void inicializálás (PasswordMatches constraintAnnotation) {} @Orride nyilvános logikai isValid (Object obj, ConstraintValidatorContext context) {UserDto user = (UserDto) obj; return user.getPassword (). egyenlő (user.getMatchingPassword ()); }}
Most a @PasswordMatches annotációt kell alkalmazni a mi UserDto tárgy:
@PasswordMatches nyilvános osztály UserDto {...}
Az összes érvényesítést természetesen az összes szabványos kommentárral együtt értékelik, amikor a teljes érvényesítési folyamat lefut.
5.4. Ellenőrizze, hogy a fiók még nem létezik-e
A negyedik ellenőrzés, amelyet végrehajtunk, annak ellenőrzése, hogy a email fiók még nem létezik az adatbázisban.
Ezt az űrlap érvényesítése után hajtják végre, és a UserService végrehajtás.
5.4.1. Példa - A vezérlő createUserAccount Módszer a UserService Otárgy
@PostMapping ("/ user / registration") public ModelAndView registerUserAccount (@ModelAttribute ("user") @Valid UserDto userDto, HttpServletRequest kérés, hibák hibák) {try {Felhasználó regisztrált = userService.registerNewUserAccount (userDto); } catch (UserAlreadyExistException uaeEx) {mav.addObject ("üzenet", "Már létezik fiók az adott felhasználónévhez / e-mailhez."); return mav; } // a megvalósítás többi része}
5.4.2. Példa - FelhasználóSzolgáltatás Ellenőrzi az ismétlődő e-maileket
@Service public class A UserService megvalósítja az IUserService {@Autowired private UserRepository adattárat; @Transactional @Orride public User registerNewUserAccount (UserDto userDto) dobja a UserAlreadyExistException {if (emailExist (userDto.getEmail ())) {dob új UserAlreadyExistException ("Van egy fiók azzal az e-mail címmel:" + userDto.getEmail (); } ... // a regisztrációs művelet többi része} privát logikai e-mailExist (String email) {return userRepository.findByEmail (email)! = null; }}
A UserService a UserRepository osztály annak ellenőrzésére, hogy egy adott e-mail címmel rendelkező felhasználó már létezik-e az adatbázisban.
Most - a tényleges végrehajtása UserRepository a perzisztencia rétegben nem releváns az aktuális cikk szempontjából. Az egyik gyors módszer természetesen a Spring Data használata a tároló réteg előállításához. Végül - valósítsuk meg a regisztrációs logikát a kontroller rétegünkben: 6.1.1. Példa - A RegisterAccount Módszer a vezérlőben A fenti kódban észrevehető dolgok: Fejezzük be a regisztrációs művelet végrehajtását a UserService: 7.1. Példa A IUserService Felület 7.2. Példa - A UserService Osztály Előző cikkünkben a bejelentkezés hardveresen kódolt hitelesítő adatokkal történt. Változtassunk ezen és használja az újonnan regisztrált felhasználói információkat és hitelesítő adatok. Megvalósítunk egy szokást UserDetailsService hogy ellenőrizze a bejelentkezési adatokat a perzisztencia rétegből. Kezdjük az egyéni felhasználói adatok szolgáltatás megvalósításával: Az új felhasználói szolgáltatás engedélyezéséhez a Spring Security konfigurációban - egyszerűen hozzá kell adnunk egy hivatkozást a UserDetailsService benne hitelesítés-kezelő elemet, és adja hozzá a UserDetailsService bab: 8.2. Példa - Az Authentication Manager és a UserDetailsService Vagy Java konfiguráción keresztül: És készen vagyunk - teljes és majdnem gyártási kész regisztrációs folyamat a Spring Security és a Spring MVC együttműködésben valósult meg. Ezután megvitatjuk az újonnan regisztrált fiók aktiválásának folyamatát az új felhasználó e-mail-címének ellenőrzésével. A tavaszi biztonsági REST oktatóanyag megvalósítása megtalálható a GitHub projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.6. Tartós adatok és az űrlapfeldolgozás befejezése
@PostMapping ("/ user / registration") public ModelAndView registerUserAccount (@ModelAttribute ("user") @Valid UserDto userDto, HttpServletRequest kérés, hibák hibák) {try {Felhasználó regisztrált = userService.registerNewUserAccount (userDto); } catch (UserAlreadyExistException uaeEx) {mav.addObject ("üzenet", "Már létezik fiók az adott felhasználónévhez / e-mailhez."); return mav; } return new ModelAndView ("successRegister", "user", userDto); }
7.A UserService - Művelet regisztrálása
nyilvános felület IUserService {Felhasználói regisztrációNewUserAccount (UserDto userDto) dobja UserAlreadyExistException; }
@Service public class A UserService megvalósítja az IUserService {@Autowired private UserRepository adattárat; @Transactional @Orride public User registerNewUserAccount (UserDto userDto) dobja a UserAlreadyExistException {if (emailExists (userDto.getEmail ())) {dob új UserAlreadyExistException ("Van egy fiók azzal az e-mail címmel: + userDto.getEmail ()); user = new User (); user.setFirstName (userDto.getFirstName ()); user.setLastName (userDto.getLastName ()); user.setPassword (userDto.getPassword ()); user.setEmail (userDto.getEmail ()) ; user.setRoles (Arrays.asList ("ROLE_USER")); return repository.save (user);} private boolean emailExists (String email) {return userRepository.findByEmail (email)! = null;}}
8. Felhasználói adatok betöltése a biztonsági bejelentkezéshez
8.1. A szokás UserDetailsService
@Service @Transactional public class A MyUserDetailsService megvalósítja a UserDetailsService {@Autowired private UserRepository userRepository; // public UserDetails loadUserByUsername (karakterlánc e-mail) dob FelhasználónévNotFoundException {Felhasználó felhasználó = userRepository.findByEmail (e-mail); if (user == null) {dob új felhasználónévNotFoundException ("Nem található felhasználó a felhasználónévvel:" + e-mail); } logikai érték engedélyezve = igaz; logikai számlaNonExpired = true; logikai hitelesítő adatokNonExpired = true; logikai számlaNLLocked = true; adja vissza az új org.springframework.security.core.userdetails.User (user.getEmail (), user.getPassword (). toLowerCase () lehetőséget, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthorities (user.getRoles ()); } privát statikus List getAuthorities (List szerepkörök) {List hatóságok = new ArrayList (); for (String role: szerepek) {hatóságok.add (új SimpleGrantedAuthority (szerep)); } visszatérési hatóságok; }}
8.2. Engedélyezze az új hitelesítés-szolgáltatót
@Autowired private MyUserDetailsService userDetailsService; A @Orride védett void konfiguráció (AuthenticationManagerBuilder auth) dobja a Kivételt {auth.userDetailsService (userDetailsService); }
9. Következtetés