티스토리 뷰
Spring Advanced : Web MVC + Security + Hibernate with Java Config - 유저 인증 및 등록 구현하기 4
Korean Eagle 2020. 5. 19. 19:101. 이 포스트는 Spring : Web MVC + Security + JDBC 시리즈에 연장이다. xml파일 설정은 사용하지 않는다.
1-1 하려는 것은 우선 in-memory로 인증을 구현한다.
1-2 Database를 생성하고 hibernate로 유저 등록을 구현한다.
1-3 가입정보에 대한 Validation처리를 작성한다. Customer Validatior로 구현한다. 이 포스트 내용
1-4 In-memory가 아닌 DaoAuthenticationProvider로 hibernate를 사용한 Spring security 인증처리로 변경
1-5 위에 것을 한번에 다 할려면 난이도가 헬이라서 이렇게 분리해서 한다.
2. 이 포스트는 Custom Validator를 만들어 Email을 검증하고 유저가 검증 비밀번호를 동일하게 입력한지를 검증한다.
2-1 Email validator 생성
2-2 비밀번호 검증
3. Email Validator를 생성한다.
3-1 Field에 사용할 ValidEmail Annotation을 생성한다.
3-1-1 이 annotation을 검증할 클래스를 @Contraint validatedBy 속성으로 지정한다.
3-1-2 이 Validator는 field에서 사용할 예정이므로 @Target은 Field만 설정하였다.
3-1-3 이메일 검증로직은 이미 정해진 룰이 있으므로 value를 따로 받을 필요가 없다. 메시지 설정만 제공하면 된다.
3-1-4 groups, payload는 boilerplate 코드라고 생각하면 된다.
package pe.pilseong.custom_registration.validation;
...
@Constraint(validatedBy = EmailValidator.class)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidEmail {
String message() default "Invalid E-mail";
Class<?>[] groups() default{};
Class<? extends Payload>[] payload() default {};
}
3-2 검증 로직을 가지고 있을 EmailValidator클래스를 생성한다.
3-2-0 하이버네이트에서 같은 이름의 Validator를 가지고 있지만 여기서는 따로 작성한다.
3-2-1 ConstraintValidator 인터페이스를 구현하고 있고
3-2-1-1 Generic에 들어갈 Type은 검증할 Annotation과 검증대상의 입력형이 된다.
3-2-2 아래 코드의 EMAIL_PATTERN은 인터넷에 regex email pattern이라고 검색하면 나온다.
3-2-2-1 자바 언어에서 String내의 \처리를 위해 중복으로 \\로 escape가 아님을 명시해 주어야 한다.
3-2-3 아래는 java에서 regex를 지원하기 위한 Pattern, Matcher를 사용하고 있다.
3-2-3-1 Java Regex에 관해 알고 싶으면 아래 링크를 참조한다.
Java Regex | Regular Expression - javatpoint
Java Regex tutorial - Regular Expression in java with examples, api, matcher, pattern, regex character classes, regex quantifiers and regex meta characters.
www.javatpoint.com
3-2-3-1 복잡하게 이런 utility를 사용하지 않고 그냥 String의 matches 메소드를 사용해도 된다.
3-2-4 isValid는 검증로직을 구현하는 메소드로 첫번째 인자는 검증할 입력값이 들어온다.
package pe.pilseong.custom_registration.validation;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class EmailValidator implements ConstraintValidator<ValidEmail, String> {
private Pattern pattern;
private Matcher matcher;
private static final String EMAIL_PATTERN =
"^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$";
@Override
public boolean isValid(String email, ConstraintValidatorContext context) {
pattern = Pattern.compile(EMAIL_PATTERN);
if (email == null) {
return false;
}
matcher = pattern.matcher(email);
return matcher.matches();
}
}
4. 이제 사용하는 부분이 남았다. UserDTO의 email을 수정한다.
4-1 제일 아래 email의 @ValidEmail annotation을 지정하고 있다.
4-2 여기에 입력 글자 수를 검증하는 @Size validator도 지정하여 일정한 길이의 입력으로 유도하고 있다.
@Data
public class UserDTO {
@NotNull(message = "is required")
@Size(min = 4, max = 30, message = "Length ranges from 4 to 30")
private String userName;
@NotNull(message = "is required")
@Size(min = 4, max = 20, message = "Length ranges from 4 to 20")
private String password;
@NotNull(message = "is required")
@Size(min = 4, max = 20, message = "Length ranges from 4 to 20")
private String matchingPassword;
@NotNull(message = "is required")
@Size(min = 3, max = 30, message = "Length ranges from 3 to 30")
private String firstName;
@NotNull(message = "is required")
@Size(max = 30, message = "Maximum is 30")
private String lastName;
@NotNull(message = "is required")
@Size(min = 5, max = 50, message = "Length ranges from 5 to 50")
@ValidEmail(message = "Invliad Email")
private String email;
}
5. 실제 화면은 다음과 같다.
6. 이번 포스트에서 한 것
6-1 이메일 항목이 정상적으로 입력되었는지를 검증하는 custom validation을 생성하였다.
'Spring > Spring Advanced' 카테고리의 다른 글
- Total
- Today
- Yesterday
- 도커 개발환경 참고
- AWS ARN 구조
- Immuability에 관한 설명
- 자바스크립트 멀티 비동기 함수 호출 참고
- WSDL 참고
- SOAP 컨슈머 참고
- MySql dump 사용법
- AWS Lambda with Addon
- NFC 드라이버 linux 설치
- electron IPC
- mifare classic 강의
- go module 관련 상세한 정보
- C 메모리 찍어보기
- C++ Addon 마이그레이션
- JAX WS Header 관련 stackoverflow
- SOAP Custom Header 설정 참고
- SOAP Custom Header
- SOAP BindingProvider
- dispatcher 사용하여 설정
- vagrant kvm으로 사용하기
- git fork, pull request to the …
- vagrant libvirt bridge network
- python, js의 async, await의 차이
- go JSON struct 생성
- Netflix Kinesis 활용 분석
- docker credential problem
- private subnet에서 outbound IP 확…
- 안드로이드 coroutine
- kotlin with, apply, also 등
- 안드로이드 초기로딩이 안되는 경우
- navigation 데이터 보내기
- 레이스 컨디션 navController
- raylib
- mapping
- Validation
- 설정
- 자바
- form
- crud
- MYSQL
- 스프링
- 매핑
- one-to-many
- Spring
- 설정하기
- one-to-one
- login
- Spring Security
- 스프링부트
- 로그인
- 상속
- jsp
- Rest
- spring boot
- RestTemplate
- WebMvc
- hibernate
- 하이버네이트
- Many-To-Many
- Angular
- 외부파일
- XML
- Security