A regisztráció folyamata a tavaszi biztonsággal

Ez a cikk egy sorozat része: • Tavaszi biztonsági regisztráció bemutató

• 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)
  • email
  • 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:

  1. Az összes kötelező mező kitöltve van (nincs üres vagy üres mező)
  2. Az e-mail cím érvényes (jól formázott)
  3. A jelszó megerősítő mező megegyezik a jelszó mezővel
  4. 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.

6. Tartós adatok és az űrlapfeldolgozás befejezése

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

@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); } 

A fenti kódban észrevehető dolgok:

  1. A vezérlő visszatér a ModelAndView objektum, amely a kényelmes adat a modelladatok küldéséhez (felhasználó) a nézethez kötve.
  2. A vezérlő átirányítja a regisztrációs űrlapra, ha az érvényesítéskor hibát állítottak be.

7.A UserService - Művelet regisztrálása

Fejezzük be a regisztrációs művelet végrehajtását a UserService:

7.1. Példa A IUserService Felület

nyilvános felület IUserService {Felhasználói regisztrációNewUserAccount (UserDto userDto) dobja UserAlreadyExistException; }

7.2. Példa - A UserService Osztály

@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

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.

8.1. A szokás UserDetailsService

Kezdjük az egyéni felhasználói adatok szolgáltatás megvalósításával:

@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

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:

@Autowired private MyUserDetailsService userDetailsService; A @Orride védett void konfiguráció (AuthenticationManagerBuilder auth) dobja a Kivételt {auth.userDetailsService (userDetailsService); }

9. Következtetés

É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.

Következő » Regisztráció - Új fiók aktiválása e-mailben « Előző tavaszi biztonsági regisztráció bemutató