일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Kakao
- 서버사이드렌더링
- 카우치코딩 #couchcoding #6주포트폴리오 #6주협업프로젝트v
- khaiii
- Morphological analysis #Corpus
- 출처: 자바의 신 8장
- PID
- terminate
- 자바파이썬
- github markdown
- 카우치코딩 #couchcoding #6주포트폴리오 #6주협업프로젝트
- address
- Anaconda
- 파이썬
- expression statement is not assignment or call html
- taskkill
- github
- gitbash
- Machine Learning
- 마크다운
- 클라이언트사이드렌더링
- 플젝후체크
- Technical Writing
- SSR
- 코딩온라인
- #스파르타코딩클럽후기 #내일배움캠프후기
- 비동기
- 모바일웹스킨
- 필사
- 파이콘
- Today
- Total
개발 일기
[프로젝트] 관리자 페이지 만들기 - 관리자에게 권한 부여 본문
관리자 권한을 줄 때는,
@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 를 구분해서 생성하자.
'Java&Spring > Java' 카테고리의 다른 글
PassByReference 참조 자료형 (0) | 2022.03.07 |
---|---|
배열과 ArrayList의 차이 [더 공부 후 정리할 것] (0) | 2022.01.15 |
BJ2741_ For 문 익히기 (0) | 2021.12.17 |
[프로젝트] 에러 해결 - 일반 회원 가입/ 카카오 회원 username 의 고유값 처리 (0) | 2021.12.16 |
제네릭, 타입변수 (0) | 2021.12.13 |