Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- JsonSerializer
- 백트래킹
- 리소스핸들러
- 다익스트라
- OAuth2
- HttpMessageConverters
- 백기선
- Spring Security
- 리소스 서버
- EnableAutoConfiguration
- @Profile
- 백준
- Application Event
- @ConfigurationProperties
- cors
- 브루트포스
- 외부설정
- AuthenticationPrincipal
- 스프링부트
- rest api
- 알고리즘
- 스프링 부트
- webjar
- Application Argument
- 정적 리소스
- WebApplication Type
- Application Runner
- JPA
- application.properties
- HATEOAS
Archives
- Today
- Total
아카이브
[스프링 기반 REST API 개발] 시큐리티 OAuth2 리소스 서버 설정하기 본문
리소스 서버
- OAuth2 인증 서버와 연동해서 사용한다.
- 리소스 인증 서버는 리소스를 제공하는 서버와 같이 두고, OAuth2 인증 서버는 따로 분리하는 게 맞다.
- 리소스에 대한 요청이 들어오면, OAuth2 서버에 access_token이 존재하는지 확인하고 없으면 접근을 제한한다.
ResourceServer 설정
- @EnableResourceServer
- extends ResourceServerConfigurerAdapter
- configure(ResourceServerSecurityConfigurer resources)
- resource_id
- configure(HttpSecurity http)
- anonymous
- GET /api/** : permit all
- POST /api/**: authenticated
- PUT /api/**: authenticated
- 에러 처리
- accessDeniedHandler(OAuth2AccessDeniedHandler())
ResourceServiceConfig 클래스 추가
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
resources.resourceId("event");
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.anonymous().and()
.authorizeRequests().mvcMatchers(HttpMethod.GET, "/api/**").permitAll()
.anyRequest().authenticated()
.and()
.exceptionHandling().accessDeniedHandler(new OAuth2AccessDeniedHandler())
;
}
}
getBearerToken(), getAccessToken(), 모든 POST /api/** 요청 Test 코드에 token을 넣어주는 코드 작성
private String getBearerToken(boolean needToCreateAccount) throws Exception {
return "Bearer " + getAccessToken(needToCreateAccount);
}
private String getAccessToken(boolean needToCreateAccount) throws Exception {
// Given
if (needToCreateAccount) {
createAccount();
}
ResultActions perform = this.mockMvc.perform(post("/oauth/token")
.with(httpBasic(appProperties.getClientId(), appProperties.getClientSecret()))
.param("username", appProperties.getUserUsername())
.param("password", appProperties.getUserPassword())
.param("grant_type", "password")
);
return (String) new Jackson2JsonParser().parseMap(perform.andReturn().getResponse().getContentAsString()).get("access_token");
}
@Test
@DisplayName("이벤트를 정상적으로 수정하기")
void updateEvent() throws Exception {
// Given
Account account = this.createAccount();
Event event = this.generateEvent(200, account);
EventDto eventDto = this.modelMapper.map(event, EventDto.class);
String eventName = "Updated Event";
eventDto.setName(eventName);
// When & Then
this.mockMvc.perform(put("/api/events/{id}", event.getId())
.header(HttpHeaders.AUTHORIZATION, getBearerToken(false))
.contentType(MediaType.APPLICATION_JSON)
.content(this.objectMapper.writeValueAsString(eventDto))
)
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("name").value(eventName))
.andExpect(jsonPath("_links.self").exists())
;
}
'Spring > 스프링 기반 REST API 개발' 카테고리의 다른 글
[스프링 기반 REST API 개발] 출력값 제한하기 JsonSerializer<T> (0) | 2021.01.09 |
---|---|
[스프링 기반 REST API 개발] 시큐리티 현재 사용자 조회하기 (0) | 2021.01.09 |
[스프링 기반 REST API 개발] 시큐리티 OAuth2 인증 서버 설정하기 (0) | 2021.01.09 |
[스프링 기반 REST API 개발] 시큐리티 폼 인증 설정하기 (0) | 2021.01.09 |
[스프링 기반 REST API 개발] 시큐리티 기본 설정하기 (0) | 2021.01.09 |