· 오늘 공부한 것

- 접근 불가 페이지 만들기

- 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 음수
@Email 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

+ Recent posts