itsm_ysm/src/main/java/com/urpsys/kccfbat/config/Oauth2ResourceConfig.java
2026-05-26 11:03:41 +09:00

167 lines
5.0 KiB
Java

package com.urpsys.kccfbat.config;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;
import org.springframework.security.oauth2.provider.token.store.JwtTokenStore;
import com.google.gson.Gson;
import kong.unirest.JsonNode;
import kong.unirest.Unirest;
import lombok.extern.slf4j.Slf4j;
import com.urpsys.kccfbat.common.exception.CustomException;
import com.urpsys.kccfbat.domain.CommonVO;
import com.urpsys.kccfbat.domain.JWTKey;
import com.urpsys.kccfbat.service.CommonService;
/**
* Resource 서버 기본세팅
*
* @author 나혁제
* @since 2023.02.28
* @version 1.0.0
* @see
* @comment :
*
* <pre>
*
* << 개정이력(Modification information) >>
*
* 수정일 수정자 수정내용
* ----------- --------- ------------------------
* 2023.02.28 나혁제 최초작성
*
* </pre>
*/
@Slf4j
@Configuration
public class Oauth2ResourceConfig extends ResourceServerConfigurerAdapter
{
@Autowired
CommonService commonService; // 공통 서비스
@Override
public void configure(ResourceServerSecurityConfigurer resources) throws Exception
{
resources.resourceId("event"); // 최소한 리소스ID 정도는 설정 필요
}
@Value("${spring.security.oauth2.resourceserver.jwt.jwk-set-uri}")
private String publicKeyUri; // key 정보를 받아오기 위한 인증서버 URL 선언
@Override
public void configure(HttpSecurity http) throws Exception
{
http.authorizeRequests().mvcMatchers("/test/**" ).permitAll(); // test API
http.authorizeRequests().mvcMatchers("/api/**" ).permitAll(); // test API
http.authorizeRequests().mvcMatchers("/server/**" ).permitAll(); // test API
http.authorizeRequests().mvcMatchers("/swagger-resources/**" ).permitAll(); // api 문서 관련
http.authorizeRequests().mvcMatchers("/swagger-ui**" ).permitAll(); // api 문서 관련
http.authorizeRequests().mvcMatchers("/swagger-ui/**" ).permitAll(); // api 문서 관련
http.authorizeRequests().mvcMatchers("/webjars/**" ).permitAll(); // api 문서 관련
http.authorizeRequests().mvcMatchers("/v2/**" ).permitAll(); // api 문서 관련
http.authorizeRequests().mvcMatchers("/swagger/**" ).permitAll(); // api 문서 관련
http.authorizeRequests().anyRequest().authenticated();
}
@Bean
public TokenStore tokenStore()
{
log.info(">>>>>>>>>> Oauth2ResourceConfig tokenStore <<<<<<<<<<");
log.info("<<<<<<<<<< Oauth2ResourceConfig tokenStore >>>>>>>>>>");
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter()
{
log.info(">>>>>>>>>> Oauth2ResourceConfig jwtAccessTokenConverter <<<<<<<<<<");
try
{
/*** * 직접 oauth 서버를 호출하여 공개키 읽어서 jwt 디코드 키 등록 */
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
// 보안키 획득
String strPrivKey = getPublicKeyValue(publicKeyUri);
//
if(strPrivKey==null || strPrivKey.equals(""))
{
throw new CustomException("보안키 획득 실패1");
}
converter.setVerifierKey(strPrivKey);
log.info("<<<<<<<<<< Oauth2ResourceConfig jwtAccessTokenConverter >>>>>>>>>>");
return converter;
}
catch (Exception e)
{
log.info("보안키 획득 실패2");
log.info("<<<<<<<<<< Oauth2ResourceConfig jwtAccessTokenConverter >>>>>>>>>>");
return new JwtAccessTokenConverter();
}
}
private String getPublicKeyValue(String uriKey)
{
log.info(">>>>>>>>>> Oauth2ResourceConfig getPublicKeyValue <<<<<<<<<<");
String strReturn = "";
JsonNode response = null;
try
{
response = Unirest.get(uriKey)
.asJson().getBody();
strReturn = response.toString();
}
catch(Exception e)
{
return strReturn;
}
if(StringUtils.isEmpty(strReturn))
{
strReturn ="";
}
else
{
strReturn =new Gson().fromJson(response.toString(), JWTKey.class).getValue();;
}
log.info("<<<<<<<<<< Oauth2ResourceConfig getPublicKeyValue : {} >>>>>>>>>>", strReturn);
return strReturn;
}
}