· 오늘 공부한 것
- 접근 불가 페이지 만들기
- Validation
· 공부한 내용, 궁금한 내용, 부족한 내용
접근 불가 페이지
회원 가입을 할 때 일반유저(USER)와 관리자(ADMIN)를 구분했었다. 그러면 이것을 가지고 일반유저가 관리자권한이 있는 페이지에 접근하려 할 때 막는 과정이 필요하다. 유저에게는 접근불가 페이지라는 것을 보여주는 html을 띄워줘야 한다. 전에 강의를 통해 만든 UserDetailsImple에서 권한 설정이 가능했다. 권한 이름에는 규칙이 있는데 "ROLE_" 로 시작해야 한다. 그래서 UserRoleEnum에서 "ROLE_USER"와 "ROLE_ADMIN"으로 만들어 두었다.
public class UserDetailsImpl implements UserDetails {
// ...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(simpleGrantedAuthority);
return authorities;
}
}
그리고 controller 에서 @Secured 애너테이션으로 권한 설정이 가능하다.
@Secured(UserRoleEnum.Authority.ADMIN) // 관리자용
@GetMapping("/products/secured")
public String getProductsByAdmin(@AuthenticationPrincipal UserDetailsImpl userDetails) {
System.out.println("userDetails.getUsername() = " + userDetails.getUsername());
for (GrantedAuthority authority : userDetails.getAuthorities()) {
System.out.println("authority.getAuthority() = " + authority.getAuthority());
}
return "redirect:/";
}
이렇게 애너테이션을 걸어두었으면 활성화를 해야 하는데 이것은 전에 만든 WebSecurityConfig 파일에서 @EnableGlobalMethodSecurity(securedEnabled = true) 해주면 된다.
@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 애너테이션 활성화
public class WebSecurityConfig {
// ...
http.exceptionHandling((exceptionHandling) ->
exceptionHandling.accessDeniedPage("/forbidden.html")
);
}
그러면 미리 만들어 둔 resources/static/forbidden.html 에 있는 파일을 보여준다.
Validation
프로그래밍을 하는데에 있어서 가장 중요한 부분으로 특히 null 값에 대한 부분에서 NullPointerException 오류가 발생할 수 있기 때문에 검증 과정이 필요하다.
그래서 Spring에는 Bean Validation 을 제공하고 있다. 밑에는 Bean Validation에서 제공하는 애너테이션의 일부이다.
@NotNull | null, “” 불가 |
@NotEmpty | null, “”. “ “ 불가 |
@NotBlank | null, “”. “ “ 불가 |
@Size | 문자 길이 측정 |
@Max | 최대값 |
@Min | 최소값 |
@Positive | 양수 |
@Negative | 음수 |
E-mail 형식 | |
@Pattern | 정규 표현식 |
SignupRequestDto 에 validation을 적용한 모습이다.
public class SignupRequestDto {
@NotBlank // 공백금지
private String username;
@NotBlank
private String password;
// 정규표현식 조건
@Pattern(regexp = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$")
@NotBlank
private String email;
private boolean admin = false;
private String adminToken = "";
}
이메일 부분 검증할 때 사용한 정규표현식은 아래와 같은 단계로 이해할 수 있다.
// @ 기호를 확인합니다. 기호 앞과 뒤 문자는 신경쓰지 않습니다.
String regx1 = "^(.+)@(.+)$";
// @ 기호 앞에 오는 방식에 제한을 추가합니다.
// A-Z, a-z, 0-9, ., _ 를 사용할 수 있습니다.
String regx2 = "^[A-Za-z0-9+_.-]+@(.+)$";
// 이메일 형식에 허용되는 문자를 모두 사용할 수 있습니다.
String regx3 = "^[a-zA-Z0-9_!#$%&'*+/=?`{|}~^.-]+@[a-zA-Z0-9.-]+$";
· 오늘 서칭 한 자료
· 느낀 점
- 접근 불가 페이지를 만들어서 유저에게 알려주는 것도 유저들에게 있어서 서비스 만족도를 높일 수 있다.
- 보통 결과가 없는 404페이지를 많이 봤었는데 403페이지도 신경 써야겠다.
- 검증 부분을 프런트에서 하고 넘기면 될 것이라고 생각하고 있었는데 백엔드에서도 검증 부분의 필요성을 느꼈다. 검증을 확실히 할수록 빈틈이 없기 때문에 무조건 하면 좋다고 생각한다.
'Today I Learned' 카테고리의 다른 글
2023-11-16 TIL (0) | 2023.11.16 |
---|---|
2023-11-15 TIL (0) | 2023.11.15 |
2023-11-13 TIL (0) | 2023.11.13 |
2023-11-07 TIL (0) | 2023.11.07 |
2023-11-06 TIL (0) | 2023.11.06 |