티스토리 뷰

TIL(Today I Learn)

TIL 220531

minji_6119 2022. 6. 1. 12:24
@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 접근 권한 제어 이해

  1. 회원 상세정보 (UserServiceImpl) 를 통해 "권한 (Authority)" 설정 가능
  2. 권한을 1개 이상 설정 가능
  3. "권한 이름" 규칙
    • "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("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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함