Proces registrácie s jarnou bezpečnosťou

Tento článok je súčasťou série: • Výukový program pre jarnú registráciu zabezpečenia

• Proces registrácie s jarným zabezpečením (aktuálny článok) • Registrácia - aktivácia nového účtu e-mailom

• Jarná bezpečnostná registrácia - opätovné odoslanie overovacieho e-mailu

• Registrácia s Spring Security - kódovanie hesla

• Registračné API sa stáva RESTful

• Jarná bezpečnosť - obnovte svoje heslo

• Registrácia - sila hesla a pravidlá

• Aktualizácia hesla

1. Prehľad

V tomto článku implementujeme základný proces registrácie pomocou Spring Security. Nadväzuje to na koncepty skúmané v predchádzajúcom článku, kde sme sa zaoberali prihlásením.

Cieľom je pridať úplný proces registrácie ktorá umožňuje používateľovi prihlásiť sa, overuje a pretrváva údaje používateľa.

2. Registračná stránka

Najskôr - poďme implementovať jednoduchú registračnú stránku, ktorá sa zobrazí nasledujúce polia:

  • názov (meno a priezvisko)
  • e-mail
  • heslo (a pole na potvrdenie hesla)

Nasledujúci príklad ukazuje jednoduchý registrace.html stránka:

Príklad 2.1.

formulár

najprv

Chyba overenia

posledný

Chyba overenia

e-mail

Chyba overenia

heslo

Chyba overenia

potvrďte odoslanie prihlásenia

3.Objekt DTO používateľa

Potrebujeme Objekt prenosu údajov poslať všetky registračné informácie do nášho jarného backendu. The DTO objekt by mal mať všetky informácie, ktoré budeme vyžadovať neskôr, keď vytvoríme a naplníme svoje Používateľ objekt:

verejná trieda UserDto {@NotNull @NotEmpty súkromný reťazec firstName; @NotNull @NotEmpty private String priezvisko; @NotNull @NotEmpty súkromné ​​reťazcové heslo; private String matchingPassword; @NotNull @NotEmpty private String email; // štandardné getre a setre}

Všimnite si, že sme použili štandard javax.validation anotácie k poliam objektu DTO. Neskôr sa chystáme tiež implementujte naše vlastné anotácie vlastného overenia na overenie formátu e-mailovej adresy, ako aj na potvrdenie hesla. (viď Oddiel 5)

4. Registračný kontrolór

A Prihlásiť Se odkaz na Prihlásiť sa stránka prevedie používateľa na stránku registrácia stránke. Tento zadný koniec pre túto stránku žije v radiči registrácie a je namapovaný na "/registrácia používateľa":

Príklad 4.1. - showRegistrácia Metóda

@GetMapping ("/ user / registration") public String showRegistrationForm (požiadavka WebRequest, modelový model) {UserDto userDto = nový UserDto (); model.addAttribute ("užívateľ", userDto); vrátiť "registráciu"; }

Keď kontrolór prijme požiadavku "/registrácia používateľa", vytvára nové UserDto objekt, ktorý podporí registrácia formulára, zaviaže ho a vráti sa - pekne priamo.

5. Overenie registračných údajov

Ďalej - pozrime sa na overenia, ktoré kontrolór vykoná pri registrácii nového účtu:

  1. Všetky povinné polia sú vyplnené (žiadne prázdne alebo nulové polia)
  2. E-mailová adresa je platná (správne tvarovaná)
  3. Pole na potvrdenie hesla sa zhoduje s poľom pre heslo
  4. Účet ešte neexistuje

5.1. Integrované overenie

Na jednoduché kontroly použijeme anotácie overenia fazule mimo objektu DTO - anotácie ako @NotNull, @Nie prázdny, atď.

Ak chcete spustiť proces overovania, jednoducho urobíme anotáciu objektu vo vrstve radiča znakom @ Platné anotácia:

verejný ModelAndView registerUserAccount (@ModelAttribute ("používateľ") @Valid UserDto userDto, požiadavka HttpServletRequest, chyby chýb) {...}

5.2. Vlastné overenie na kontrolu platnosti e-mailu

Ďalej - overme e-mailovú adresu a uistite sa, že je správne tvarovaná. Budeme stavať a vlastný validátor za to, ako aj a anotácia vlastnej validácie - nazvime to @Platný email.

Stručný úvodník - pripravujeme vlastnú poznámku namiesto režimu dlhodobého spánku@Email pretože Hibernate považuje starý formát intranetových adries: [chránené e-mailom] ako platné (pozri článok Stackoverflow), čo nie je dobré.

Tu je anotácia e-mailovej validácie a vlastný validátor:

Príklad 5.2.1. - Vlastná anotácia pre overenie e-mailu

@Target ({TYPE, FIELD, ANNOTATION_TYPE}) @Retention (RUNTIME) @Constraint (validatedBy = EmailValidator.class) @Documented public @interface ValidEmail {String message () default "Invalid email"; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; }

Všimnite si, že sme definovali anotáciu na LÚKA úrovni - keďže tam to platí koncepčne.

Príklad 5.2.2. - Vlastné EmailValidator:

verejná trieda EmailValidator implementuje ConstraintValidator {súkromný vzor vzoru; súkromný Matcher Matcher; súkromný statický konečný reťazec 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 initialize (ValidEmail constraintAnnotation) {} @Override public boolean isValid (String email, ConstraintValidatorContext context) {return (validateEmail (email)); } private boolean validateEmail (reťazcový e-mail) {vzor = Pattern.compile (EMAIL_PATTERN); matcher = pattern.matcher (e-mail); návrat matcher.matches (); }}

Poďme teraz použite novú anotáciu na našom UserDto implementácia:

@ValidEmail @NotNull @NotEmpty súkromný e-mail s reťazcom;

5.3. Používanie vlastného overenia na potvrdenie hesla

Potrebujeme tiež vlastnú anotáciu a validátor, aby sme sa uistili, že heslo a zodpovedajúce heslo polia sa zhodujú:

Príklad 5.3.1. - Vlastná anotácia na overenie potvrdenia hesla

@Target ({TYPE, ANNOTATION_TYPE}) @Retention (RUNTIME) @Constraint (validatedBy = PasswordMatchesValidator.class) @Documented public @interface PasswordMatches {String message () predvolené "Heslá sa nezhodujú"; Skupiny [] skupiny () predvolené {}; Trieda [] užitočné zaťaženie () predvolené {}; }

Všimnite si, že @ Cieľ anotácia naznačuje, že sa jedná o a TYP anotácia úrovne. Je to preto, lebo potrebujeme všetko UserDto objekt na vykonanie validácie.

Vlastný validátor, ktorý sa bude volať touto anotáciou, je uvedený nižšie:

Príklad 5.3.2. The PasswordMatchesValidator Vlastný validátor

verejná trieda PasswordMatchesValidator implementuje ConstraintValidator {@Override public void initialize (PasswordMatches constraintAnnotation) {} @Override public boolean isValid (Object obj, ConstraintValidatorContext context) {UserDto user = (UserDto) obj; návrat user.getPassword (). equals (user.getMatchingPassword ()); }}

Teraz @PasswordMatches anotácia by sa mala vzťahovať na našu UserDto objekt:

@PasswordMatches verejná trieda UserDto {...}

Všetky vlastné validácie sa samozrejme vyhodnotia spolu so všetkými štandardnými anotáciami, keď beží celý proces validácie.

5.4. Skontrolujte, či účet už neexistuje

Štvrtá kontrola, ktorú implementujeme, je overenie, či e-mail účet v databáze ešte neexistuje.

Vykonáva sa to po overení formulára a pomocou nástroja UserService implementácia.

Príklad 5.4.1. - Kontrolór createUserAccount Metóda volá UserService Object

@PostMapping ("/ user / registration") public ModelAndView registerUserAccount (@ModelAttribute ("user") @Valid UserDto userDto, požiadavka HttpServletRequest, chyby chýb) {try {User registered = userService.registerNewUserAccount (userDto); } catch (UserAlreadyExistException uaeEx) {mav.addObject ("správa", "Účet pre toto používateľské meno / e-mail už existuje."); návrat mav; } // zvyšok implementácie} 

Príklad 5.4.2. - PoužívateľSlužby Kontroly duplicitných e-mailov

@ Verejná trieda @Service UserService implementuje IUserService {@Autowired súkromné ​​úložisko UserRepository; @Transactional @Override public User registerNewUserAccount (UserDto userDto) hodí UserAlreadyExistException {if (emailExist (userDto.getEmail ())) {throw new UserAlreadyExistException ("Existuje účet s touto e-mailovou adresou:" + userDto.getEmail ()); } ... // zvyšok operácie registrácie} private boolean emailExist (String email) {return userRepository.findByEmail (email)! = null; }}

UserService sa spolieha na UserRepository triedy na kontrolu, či používateľ s danou e-mailovou adresou už v databáze existuje.

Teraz - skutočná implementácia UserRepository vo vrstve perzistencie nie je pre aktuálny článok relevantný. Jedným z rýchlych spôsobov je samozrejme použitie Spring Data na vygenerovanie vrstvy úložiska.

6. Trvalé údaje a dokončovacie spracovanie formulára

Na záver - implementujme logiku registrácie do našej vrstvy ovládača:

Príklad 6.1.1. - Registrovať účet Metóda v ovládači

@PostMapping ("/ user / registration") public ModelAndView registerUserAccount (@ModelAttribute ("user") @Valid UserDto userDto, požiadavka HttpServletRequest, chyby chýb) {try {User registered = userService.registerNewUserAccount (userDto); } catch (UserAlreadyExistException uaeEx) {mav.addObject ("správa", "Účet pre toto používateľské meno / e-mail už existuje."); návrat mav; } vrátiť nový ModelAndView ("successRegister", "user", userDto); } 

Čo si treba všimnúť v kóde vyššie:

  1. Kontrolór vracia a ModelAndView objekt, ktorý je pohodlnou triedou na odosielanie údajov modelu (používateľ) viazané na výhľad.
  2. Prevádzkovateľ presmeruje na registračný formulár, ak sa v čase validácie vyskytnú chyby.

7.The UserService - Registrovať operáciu

Dokončime implementáciu operácie registrácie v UserService:

Príklad 7.1. The IUserService Rozhranie

verejné rozhranie IUserService {User registerNewUserAccount (UserDto userDto) hodí UserAlreadyExistException; }

Príklad 7.2. - UserService Trieda

@ Verejná trieda @Service UserService implementuje IUserService {@Autowired súkromné ​​úložisko UserRepository; @Transactional @Override public User registerNewUserAccount (UserDto userDto) hodí UserAlreadyExistException {if (emailExists (userDto.getEmail ())) {throw new UserAlreadyExistException ("Existuje účet s touto e-mailovou adresou: + userDto.getEmail ());} Používateľ 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. Načítanie podrobností používateľa pre bezpečnostné prihlásenie

V predchádzajúcom článku sme sa prihlasovali pomocou pevne kódovaných údajov. Zmeňme to a použiť informácie o novo zaregistrovanom používateľovi a poverovacie listiny. Implementujeme zvyk UserDetailsService skontrolovať prihlasovacie údaje z vrstvy vytrvalosti.

8.1. Zvyk UserDetailsService

Začnime s implementáciou služby vlastných detailov používateľa:

@Service @Transactional verejná trieda MyUserDetailsService implementuje UserDetailsService {@Autowired private UserRepository userRepository; // verejné UserDetails loadUserByUsername (reťazcový e-mail) vyvolá UsernameNotFoundException {User user = userRepository.findByEmail (email); if (user == null) {throw new UsernameNotFoundException ("No user found with username:" + email); } boolean enabled = true; boolean accountNonExpired = true; boolean credentialsNonExpired = true; boolean accountNonLocked = true; vrátiť nový org.springframework.security.core.userdetails.User (user.getEmail (), user.getPassword (). toLowerCase (), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthorities (user.getRoles ())); } private static Zoznam getAuthorities (Zoznam rolí) {Zoznam oprávnení = nový ArrayList (); pre (Reťazcová rola: role) {Authority.add (new SimpleGrantedAuthority (role)); } návratové orgány; }}

8.2. Povoľte nového poskytovateľa autentifikácie

Ak chcete povoliť novú službu pre používateľov v konfigurácii Spring Security - stačí pridať odkaz na UserDetailsService vnútri správca autentifikácie prvok a pridať UserDetailsService fazuľa:

Príklad 8.2.- Správca autentifikácie a UserDetailsService

Alebo prostredníctvom konfigurácie Java:

@Autowired private MyUserDetailsService userDetailsService; @Override protected void configure (AuthenticationManagerBuilder auth) vyvolá výnimku {auth.userDetailsService (userDetailsService); }

9. Záver

A sme hotoví - úplní a takmer proces registrácie pripravený na výrobu implementované pomocou Spring Security a Spring MVC. Ďalej sa chystáme diskutovať o procese aktivácie novo registrovaného účtu overením e-mailu nového používateľa.

Implementáciu tohto jarného programu REST Security REST nájdete v projekte GitHub - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.

Ďalšie » Registrácia - aktivujte nový účet e-mailom « Výučba predchádzajúcej jarnej registrácie bezpečnosti

$config[zx-auto] not found$config[zx-overlay] not found