오늘은 전에 했던 포스팅 프로젝트를 새로운 기능을 넣은 과제를 받아서 처음부터 다시 만들어보기로 했다.
그랬더니 걸린게 있는데 예전 과제에선 권한부여기능을 필수기능으로 넣지 않아 모두 빼고 만들었지만, 이번엔 구현기능으로 들어가있어 새로 만들었다.
role을 이용했는데, UserRoleEnum이라는 클래스를 하나 만들어 유저와 어드민을 컨트롤 했다.
public enum UserRoleEnum {
USER(Authority.USER), // 사용자 권한
ADMIN(Authority.ADMIN); // 관리자 권한
private final String authority;
UserRoleEnum(String authority) {
this.authority = authority;
}
public String getAuthority() {
return this.authority;
}
public static class Authority {
public static final String USER = "ROLE_USER";
public static final String ADMIN = "ROLE_ADMIN";
}
}
여기서 신기했던점은 UserDetails에서 Authority를 가져올 수 있었는데, 강의내용에서 들어가있는 방법으로 가져오니 권한이 맞는지 equals로 비교가 안 됐어서 String반환형으로 새로 만들었다.
//Override받아온 코드
@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;
}
//새로 만든코드
public String getAuth(){
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
return authority;
}
아래는 비교하는 코드
//글을 쓴 사람이 현재 로그인한 유저거나, 현재 로그인한 유저의 권한이 어드민인지 확인
if (post.getUser().getUsername().equals(username)||userDetails.getAuth().equals("ROLE_ADMIN")) {//혹은 관리자일 때 추가
requestDto.setUser(userDetails.getUser());
post.update(requestDto);
return requestDto;
}
이렇게 비교하니 해결되었다.
조금 야매(?) 느낌이 있지만 일단 동작은 잘 되므로 해결....