티스토리 뷰
@PostMapping("/api/products")
public Product createProduct(@RequestBody ProductRequestDto requestDto,
@AuthenticationPrincipal UserDetailsImpl userDetails){
Long userId = userDetails.getUser().getId();
Product product = new Product(requestDto, userId);
return productRepository.save(product);
}
@AuthentiationPrincipal 로그인한 유저의 정보를 가져옴.
API 접근 권한 제어 이해
- 회원 상세정보 (UserServiceImpl) 를 통해 "권한 (Authority)" 설정 가능
- 권한을 1개 이상 설정 가능
- "권한 이름" 규칙
- "ROLE_" 로 시작해야 함
- 예) "ADMIN" 권한 부여 → "ROLE_ADMIN"
public class UserDetailsImpl implements UserDetails {
// ...
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
SimpleGrantedAuthority adminAuthority = new SimpleGrantedAuthority("ROLE_ADMIN");
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(adminAuthority);
return authorities;
}
}
스프링 시큐리티를 이용한 API 별 권한 제어 방법
- Controller 에 "@Secured" 어노테이션으로 권한 설정 가능
- @Secured("권한 이름") 선언
- 권한 1개 이상 설정 가능
- @Secured("권한 이름") 선언
@Secured("ROLE_ADMIN")
@GetMapping("/api/admin/products")
public List<Product> getAllProducts() {
return productService.getAllProducts();
}
@Configuration
@EnableWebSecurity // 스프링 Security 지원을 가능하게 함
@EnableGlobalMethodSecurity(securedEnabled = true) // @Secured 어노테이션 활성화
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
유효성 검사를 위해 Gradle에
implementation 'org.springframework.boot:spring-boot-starter-validation'
의존성 추가
JWTAuthFilter: API 요청 Header에 전달되는 JWT 유효성 인증
FilterSkipMatcher: 로그인 전 허용이 필요한 API는 예외처리 필요
public String getPosts(@AuthenticationPrincipal UserDetailsImpl userDetails, Model model, @PageableDefault(size = 10) Pageable pageable,
@RequestParam(required = false, defaultValue = "") String search)
<td th:onclick="|javascript:deletePost(${post.id}, ${post.writer})|">
Only variable expressions returning numbers or booleans are allowed in this context, any other datatypes are not trusted in the context
타임리프 오류가 떴다. post.writer가 String 값을 받아서 그런가보다,
해결이 되지 않아서 결국 deletePost에서 id값으로 writer를 받아왔다..
- 로그인 토큰을 전달하지 않은 채로 로그인이 필요한 API를 호출한 경우 "로그인이 필요합니다." 라는 에러 메세지를 response에 포함하기
- 로그인 토큰을 전달한 채로 로그인 API 또는 회원가입 API를 호출한 경우 "이미 로그인이 되어있습니다."라는 에러 메세지를 response에 포함하기
어떻게 손을 대야할 지 모르겠다.
'TIL(Today I Learn)' 카테고리의 다른 글
TIL 220603 (0) | 2022.06.03 |
---|---|
TIL 220602 (0) | 2022.06.02 |
WIL 3주차(Week I Learn) (0) | 2022.05.30 |
TIL 220527 (0) | 2022.05.27 |
TIL 220526 (0) | 2022.05.26 |
댓글