728x90
스프링 기반 REST API 개발
5. REST API 보안 적용
포스팅 참조 정보
GitHub
공부한 내용은 GitHub에 공부용 Organizations에 정리 하고 있습니다
해당 포스팅에 대한 내용의 GitHub 주소
실습 내용이나 자세한 소스코드는 GitHub에 있습니다
포스팅 내용은 간략하게 추린 핵심 내용만 포스팅되어 있습니다
https://github.com/freespringlecture/spring-rest-api-study/tree/chap05-08_string_refectoring
해당 포스팅 참고 인프런 강의
https://www.inflearn.com/course/spring_rest-api/dashboard
실습 환경
- Java Version: Java 11
- SpringBoot Version: 2.1.2.RELEASE
8. 문자열을 외부 설정으로 빼내기
유저 이메일 unique 설정
유저 저장시 겹치지 않도록 설정
Account email unique 설정
@Column(unique = true)
private String email;
Properties 자동완성 의존성 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
외부 설정으로 기본 유저와 클라이언트 정보 빼내기
AppProperties 클래스 생성
외부 설정으로 기본 유저와 클라이언트 정보를 빼내기 위한 프로퍼티 설정
package me.freelife.rest.common;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotEmpty;
@Component
@ConfigurationProperties(prefix = "my-app")
@Getter @Setter
public class AppProperties {
@NotEmpty
private String adminUsername;
@NotEmpty
private String adminPassword;
@NotEmpty
private String userUsername;
@NotEmpty
private String userPassword;
@NotEmpty
private String clientId;
@NotEmpty
private String clientSecret;
}
application.properties
에 프로퍼티 값 추가
my-app.admin-username=admin@email.com
my-app.admin-password=admin
my-app.user-username=user@email.com
my-app.user-password=user
my-app.client-id=myApp
my-app.client-secret=pass
기본 유저 만들기
ApplicationRunner
- Admin
- User
AppConfig 에 기본유저 admin, user 생성되도록 수정하고 프로퍼티 설정추가
//임의의 유저정보 생성
@Bean
public ApplicationRunner applicationRunner() {
return new ApplicationRunner() {
@Autowired
AccountService accountService;
@Autowired
AppProperties appProperties;
@Override
public void run(ApplicationArguments args) throws Exception {
Account admin = Account.builder()
.email(appProperties.getAdminUsername())
.password(appProperties.getAdminPassword())
.roles(Set.of(AccountRole.ADMIN, AccountRole.USER))
.build();
accountService.saveAccount(admin);
Account user = Account.builder()
.email(appProperties.getUserUsername())
.password(appProperties.getUserPassword())
.roles(Set.of(AccountRole.USER))
.build();
accountService.saveAccount(user);
}
};
}
AuthServerConfig에 프로퍼티 설정 추가
OAuth2 서버 설정 부분에 프로퍼티 설정 추가
@Autowired
AppProperties appProperties;
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory() // inMemory 용으로 생성 원래는 jdbc로 DB로 생성해야됨
.withClient(appProperties.getClientId()) // myApp에 대한 클라이언트를 하나 생성
.authorizedGrantTypes("password", "refresh_token") // 지원하는 grant_Type
.scopes("read", "write") // 임의 값
.secret(this.passwordEncoder.encode(appProperties.getClientSecret()))
.accessTokenValiditySeconds(10 * 60) // 엑세스 토큰의 유효시간 10분
.refreshTokenValiditySeconds(6 * 10 * 60); // refresh_token의 유효시간
}
테스트 코드에 프로퍼티 설정 추가
AuthServerConfigTest 에 프로퍼티 설정 추가
...
import me.freelife.rest.common.AppProperties;
public class AuthServerConfigTest extends BaseControllerTest {
...
@Autowired
AppProperties appProperties;
@Test
@TestDescription("인증 토큰을 발급 받는 테스트")
public void getAuthToken() throws Exception {
this.mockMvc.perform(post("/oauth/token")
.with(httpBasic(appProperties.getClientId(), appProperties.getClientSecret())) // Basic OAuth Header
.param("username", appProperties.getUserUsername())
.param("password", appProperties.getUserPassword())
...
}
}
EventControllerTests 에 프로퍼티 설정 추가
...
import me.freelife.rest.common.AppProperties;
public class EventControllerTests extends BaseControllerTest {
...
@Autowired
AppProperties appProperties;
/**
* 인증 토큰을 발급
* @return
* @throws Exception
*/
private String getAccessToken() throws Exception {
// Given
Account freelife = Account.builder()
.email(appProperties.getUserUsername())
.password(appProperties.getUserPassword())
...
ResultActions perform = this.mockMvc.perform(post("/oauth/token")
.with(httpBasic(appProperties.getClientId(), appProperties.getClientSecret())) // Basic OAuth Header
.param("username", appProperties.getUserUsername())
.param("password", appProperties.getUserPassword())
.param("grant_type", "password"));
...
}
...
728x90
'개발강의정리 > Spring' 카테고리의 다른 글
[스프링 기반 REST API 개발] 5-10. 스프링 시큐리티 현재 사용자 조회 (0) | 2020.04.10 |
---|---|
[스프링 기반 REST API 개발] 5-9. 이벤트 API 점검 (0) | 2020.04.09 |
[스프링 기반 REST API 개발] 5-7. 스프링 시큐리티 OAuth 2 설정: 리소스 서버 설정 (0) | 2020.04.07 |
[스프링 기반 REST API 개발] 5-6. 스프링 시큐리티 OAuth 2 설정: 인증 서버 설정 (0) | 2020.04.06 |
[스프링 기반 REST API 개발] 5-5. 스프링 시큐리티 폼 인증 설정 (0) | 2020.04.05 |
댓글