개발 일기

[프로젝트] 관리자 페이지 만들기 - 관리자에게 권한 부여 본문

Java&Spring/Java

[프로젝트] 관리자 페이지 만들기 - 관리자에게 권한 부여

flow123 2021. 12. 24. 11:41

관리자 권한을 줄 때는, 

@Secured 와 

hasRole 을 사용한다. 

 

우선 Admin Controller 에 @Secured 어노테이션을 달아준다 ("ROLE_ADMIN")권한을 가진 사람만 접근할 수 있다는 뜻이다. 

    @Secured("ROLE_ADMIN")
    @GetMapping("/adminposting")
    public AdminDto getAdminPosting() {
        return adminService.toAdminPosting();
    }
}

 

Admin Controller 에 @Secured 를 하는 대신 Web Security Config 에 아래 코드를 넣어도 작동한다. 

.antMatchers("/adminposting").hasRole("ADMIN")
.anyRequest().authenticated()

 

 

UserDetails 를 구현하는 클래스인 UserDetailsImpl 의 설정을 바꿔주자. 

먼저 상단에 다음과 같이 ROLE_PREFIX 를 멤버변수로 선언해준다. 

현재 UserEntity 의 Column 은 ADMIN, USER 이런 식으로 되어있다. 

Spring Security는 “ROLE_” 형태로 인식하기 때문에, 데이터 형태를 바꿔줘야한다.

public class UserDetailsImpl implements UserDetails {

    private final User user;
    private static final String ROLE_PREFIX = "ROLE_";

Collection<? extends GrantedAuthority> getAuthorities 는 계정이 갖고 있는 권한 목록 리턴하는 메서드다. 

SimpleGrantedAuthority란? 
Granted Authority 를 implement 한 클래스다. 

"basic concrete implementation of a GrantedAuthority stores a string representation of an authority granted to the authentication object" 권한을 string으로 변환해주는 것이 포인트다. 

 

  @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
    UserRole userRole = user.getRole();

    SimpleGrantedAuthority authority = new SimpleGrantedAuthority(ROLE_PREFIX + userRole.toString());
    Collection<GrantedAuthority> authorities = new ArrayList<>();
    authorities.add(authority);
    return authorities;
//        return Collections.emptyList();
    }

 

UsernamePasswordAuthenticationToken란? 

 

-Authentication 인터페이스의 구현체다. 

-pricipal: 사용자 본인

credentials: 그에따른 자격을 뜻한다. 

 

위에서 authority를 새로 생성하게 되는데, Entity의 USER/ADMIN 칼럼과는 별개로 ROLE_PREFIX 를 추가한 "ROLE_ADMIN"형태의 AUTHORITY 를 생성하고 추가해준다. 이미 userRole 이라는 칼럼에 admin/user 로 식별이 되어 있는상황이다. 그러니 credentials 가 들어갈 필요가 없다. (null이 들어가있다) 

 

JwtAuthenticationFilter 코드

 

principal 에 해당하는 userdetails, 그리고 또 다른 권한인 authority 를 추가해서 usernamepassword authenticationtoken 을 생성해준다. 

if (jwtTokenUtil.validateToken(authToken, userDetails)) {
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
    authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(req));
    logger.info("authenticated user " + username + ", setting security context");
    SecurityContextHolder.getContext().setAuthentication(authentication);
}

<참고: 에러코드> 

UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN")));

원래 getAuthorities 가 아닌 Arrays.asList(new SimpleGrantedAuthority("ROLE_ADMIN") 을 넣었었다. 이렇게 되면 모든 사용자의 롤에 ROLE_ADMIN 을 넣는 셈이 된다. UserRole 이 생성되어있으니 이를 활용해서 admin 과 user authority 를 구분해서 생성하자. 

Comments