--- base/Documents/BaseForMySql_v1.0.erwin
+++ base/Documents/BaseForMySql_v1.0.erwin
| Binary file is not shown |
--- base/pom.xml
+++ base/pom.xml
... | ... | @@ -10,8 +10,8 @@ |
| 10 | 10 |
<url>http://maven.apache.org</url> |
| 11 | 11 |
|
| 12 | 12 |
<properties> |
| 13 |
- <spring.maven.artifact.version>4.3.16.RELEASE</spring.maven.artifact.version> |
|
| 14 |
- <egovframework.rte.version>3.8.0</egovframework.rte.version> |
|
| 13 |
+ <spring.maven.artifact.version>4.3.22.RELEASE</spring.maven.artifact.version> |
|
| 14 |
+ <egovframework.rte.version>3.9.0</egovframework.rte.version> |
|
| 15 | 15 |
</properties> |
| 16 | 16 |
|
| 17 | 17 |
<repositories> |
... | ... | @@ -396,36 +396,6 @@ |
| 396 | 396 |
</exclusions> |
| 397 | 397 |
</dependency> --> |
| 398 | 398 |
|
| 399 |
- <!-- oauth2 login --> |
|
| 400 |
- <!-- <dependency> |
|
| 401 |
- <groupId>com.github.scribejava</groupId> |
|
| 402 |
- <artifactId>scribejava-apis</artifactId> |
|
| 403 |
- <version>5.6.0</version> |
|
| 404 |
- </dependency> |
|
| 405 |
- |
|
| 406 |
- <dependency> |
|
| 407 |
- <groupId>com.github.scribejava</groupId> |
|
| 408 |
- <artifactId>scribejava-core</artifactId> |
|
| 409 |
- <version>5.6.0</version> |
|
| 410 |
- </dependency> |
|
| 411 |
- |
|
| 412 |
- <dependency> |
|
| 413 |
- <groupId>org.apache.httpcomponents</groupId> |
|
| 414 |
- <artifactId>httpclient</artifactId> |
|
| 415 |
- <version>4.3.4</version> |
|
| 416 |
- <exclusions> |
|
| 417 |
- <exclusion> |
|
| 418 |
- <artifactId>commons-logging</artifactId> |
|
| 419 |
- <groupId>commons-logging</groupId> |
|
| 420 |
- </exclusion> |
|
| 421 |
- </exclusions> |
|
| 422 |
- </dependency> |
|
| 423 |
- <dependency> |
|
| 424 |
- <groupId>com.h2database</groupId> |
|
| 425 |
- <artifactId>h2</artifactId> |
|
| 426 |
- <version>1.4.180</version> |
|
| 427 |
- </dependency> --> |
|
| 428 |
- |
|
| 429 | 399 |
<!-- WebSocket Messenger --> |
| 430 | 400 |
<!-- <dependency> |
| 431 | 401 |
<groupId>javax.websocket</groupId> |
... | ... | @@ -580,26 +550,44 @@ |
| 580 | 550 |
<!-- 3rd party 라이브러리로 별도의 설치 필요 끝 --> |
| 581 | 551 |
|
| 582 | 552 |
<!-- 공통컴포넌트 끝 --> |
| 583 |
- |
|
| 584 |
- <!-- naver연동 --> |
|
| 585 |
- <dependency> |
|
| 586 |
- <groupId>com.github.scribejava</groupId> |
|
| 587 |
- <artifactId>scribejava-core</artifactId> |
|
| 588 |
- <version>2.8.1</version> |
|
| 589 |
- </dependency> |
|
| 590 |
- |
|
| 591 |
- <dependency> |
|
| 592 |
- <groupId>com.squareup.okhttp3</groupId> |
|
| 593 |
- <artifactId>okhttp</artifactId> |
|
| 594 |
- <version>4.2.2</version> |
|
| 595 |
- </dependency> |
|
| 596 |
- |
|
| 553 |
+ |
|
| 554 |
+ <!-- oauth2 login --> |
|
| 555 |
+ <dependency> |
|
| 556 |
+ <groupId>com.github.scribejava</groupId> |
|
| 557 |
+ <artifactId>scribejava-apis</artifactId> |
|
| 558 |
+ <version>5.6.0</version> |
|
| 559 |
+ </dependency> |
|
| 560 |
+ |
|
| 561 |
+ <dependency> |
|
| 562 |
+ <groupId>com.github.scribejava</groupId> |
|
| 563 |
+ <artifactId>scribejava-core</artifactId> |
|
| 564 |
+ <version>5.6.0</version> |
|
| 565 |
+ </dependency> |
|
| 566 |
+ |
|
| 567 |
+ <dependency> |
|
| 568 |
+ <groupId>org.apache.httpcomponents</groupId> |
|
| 569 |
+ <artifactId>httpclient</artifactId> |
|
| 570 |
+ <version>4.5.13</version> |
|
| 571 |
+ </dependency> |
|
| 572 |
+ |
|
| 573 |
+ <dependency> |
|
| 574 |
+ <groupId>com.h2database</groupId> |
|
| 575 |
+ <artifactId>h2</artifactId> |
|
| 576 |
+ <version>1.4.180</version> |
|
| 577 |
+ </dependency> |
|
| 578 |
+ |
|
| 597 | 579 |
<dependency> |
| 598 | 580 |
<groupId>com.drewnoakes</groupId> |
| 599 | 581 |
<artifactId>metadata-extractor</artifactId> |
| 600 | 582 |
<version>2.6.2</version> |
| 601 | 583 |
</dependency> |
| 602 |
- |
|
| 584 |
+ |
|
| 585 |
+ <dependency> |
|
| 586 |
+ <groupId>com.squareup.okhttp3</groupId> |
|
| 587 |
+ <artifactId>okhttp</artifactId> |
|
| 588 |
+ <version>4.2.2</version> |
|
| 589 |
+ </dependency> |
|
| 590 |
+ |
|
| 603 | 591 |
<!-- mybatis log4jdbc-log4j2 라이브러리 --> |
| 604 | 592 |
<dependency> |
| 605 | 593 |
<groupId>org.bgee.log4jdbc-log4j2</groupId> |
... | ... | @@ -668,7 +656,7 @@ |
| 668 | 656 |
<dependency> |
| 669 | 657 |
<groupId>org.hsqldb</groupId> |
| 670 | 658 |
<artifactId>hsqldb</artifactId> |
| 671 |
- <version>2.5.0</version> |
|
| 659 |
+ <!--<version>3.0.0</version>--> |
|
| 672 | 660 |
</dependency> |
| 673 | 661 |
</dependencies> |
| 674 | 662 |
</plugin> |
... | ... | @@ -756,7 +744,7 @@ |
| 756 | 744 |
</profile> |
| 757 | 745 |
</profiles> |
| 758 | 746 |
|
| 759 |
- <reporting> |
|
| 747 |
+ <!--<reporting> |
|
| 760 | 748 |
<outputDirectory>${basedir}/target/site</outputDirectory>
|
| 761 | 749 |
<plugins> |
| 762 | 750 |
<plugin> |
... | ... | @@ -778,7 +766,7 @@ |
| 778 | 766 |
</reportSet> |
| 779 | 767 |
</reportSets> |
| 780 | 768 |
</plugin> |
| 781 |
- <!-- JUnit Test Results & EMMA Coverage Reporting --> |
|
| 769 |
+ <!– JUnit Test Results & EMMA Coverage Reporting –> |
|
| 782 | 770 |
<plugin> |
| 783 | 771 |
<groupId>org.codehaus.mojo</groupId> |
| 784 | 772 |
<artifactId>emma-maven-plugin</artifactId> |
... | ... | @@ -796,7 +784,7 @@ |
| 796 | 784 |
</reportSet> |
| 797 | 785 |
</reportSets> |
| 798 | 786 |
</plugin> |
| 799 |
- <!-- Generating JavaDoc Report --> |
|
| 787 |
+ <!– Generating JavaDoc Report –> |
|
| 800 | 788 |
<plugin> |
| 801 | 789 |
<groupId>org.apache.maven.plugins</groupId> |
| 802 | 790 |
<artifactId>maven-javadoc-plugin</artifactId> |
... | ... | @@ -808,7 +796,7 @@ |
| 808 | 796 |
<charset>${encoding}</charset>
|
| 809 | 797 |
</configuration> |
| 810 | 798 |
</plugin> |
| 811 |
- <!-- Generating Java Source in HTML --> |
|
| 799 |
+ <!– Generating Java Source in HTML –> |
|
| 812 | 800 |
<plugin> |
| 813 | 801 |
<groupId>org.apache.maven.plugins</groupId> |
| 814 | 802 |
<artifactId>maven-jxr-plugin</artifactId> |
... | ... | @@ -820,5 +808,5 @@ |
| 820 | 808 |
</configuration> |
| 821 | 809 |
</plugin> |
| 822 | 810 |
</plugins> |
| 823 |
- </reporting> |
|
| 811 |
+ </reporting>--> |
|
| 824 | 812 |
</project> |
--- base/src/main/java/egovframework/com/cmm/service/Globals.java
+++ base/src/main/java/egovframework/com/cmm/service/Globals.java
... | ... | @@ -54,7 +54,7 @@ |
| 54 | 54 |
|
| 55 | 55 |
// 도메인 (localhost) |
| 56 | 56 |
public static final String DOMAIN = EgovProperties.getProperty("Globals.Domain");
|
| 57 |
- |
|
| 57 |
+ |
|
| 58 | 58 |
// SSL 적용여부 |
| 59 | 59 |
public static final String SSL_AT = EgovProperties.getProperty("Globals.SslAt");
|
| 60 | 60 |
|
... | ... | @@ -94,7 +94,11 @@ |
| 94 | 94 |
public static final String VOD_CONVERTER = EgovProperties.getProperty("Globals.VodConverter");
|
| 95 | 95 |
|
| 96 | 96 |
public static final String VOD_PROBER = EgovProperties.getProperty("Globals.VodProber");
|
| 97 |
- |
|
| 97 |
+ |
|
| 98 |
+ // 웨일 |
|
| 99 |
+ public static final String CLIENT_ID = EgovProperties.getProperty("Globals.ClientId");
|
|
| 100 |
+ public static final String CLIENT_SECRET = EgovProperties.getProperty("Globals.ClientSecret");
|
|
| 101 |
+ |
|
| 98 | 102 |
//엑셀 템플릿 경로 |
| 99 | 103 |
public static final String EXCEL_TEMPLATE_DIRECTORY = EgovProperties.getProperty("Globals.ExcelTemplateDirectory");
|
| 100 | 104 |
|
+++ base/src/main/java/egovframework/com/front/api/whale/web/AuthController.java
... | ... | @@ -0,0 +1,93 @@ |
| 1 | +package egovframework.com.front.api.whale.web; | |
| 2 | + | |
| 3 | +import java.io.PrintWriter; | |
| 4 | +import javax.annotation.Resource; | |
| 5 | +import javax.servlet.http.HttpServletRequest; | |
| 6 | +import javax.servlet.http.HttpServletResponse; | |
| 7 | +import javax.servlet.http.HttpSession; | |
| 8 | + | |
| 9 | +import egovframework.module.sym.sit.service.SiteManageService; | |
| 10 | +import egovframework.module.sym.sit.service.SiteManageVO; | |
| 11 | +import egovframework.module.uat.uia.service.LoginService; | |
| 12 | +import egovframework.module.uat.uia.service.LoginVO; | |
| 13 | +import egovframework.module.utl.cas.service.EgovSessionCookieUtil; | |
| 14 | +import org.springframework.stereotype.Controller; | |
| 15 | +import org.springframework.ui.ModelMap; | |
| 16 | +import org.springframework.web.bind.annotation.ModelAttribute; | |
| 17 | +import org.springframework.web.bind.annotation.RequestMapping; | |
| 18 | +import org.springframework.web.bind.annotation.RequestParam; | |
| 19 | +import org.springframework.web.bind.annotation.ResponseBody; | |
| 20 | + | |
| 21 | +import com.github.scribejava.core.model.OAuth2AccessToken; | |
| 22 | +import com.google.gson.Gson; | |
| 23 | + | |
| 24 | +import egovframework.rte.fdl.property.EgovPropertyService; | |
| 25 | +import net.sf.json.JSONObject; | |
| 26 | + | |
| 27 | + | |
| 28 | +@Controller | |
| 29 | +public class AuthController { | |
| 30 | + | |
| 31 | + @Resource(name = "loginService") | |
| 32 | + private LoginService loginService; | |
| 33 | + | |
| 34 | + @Resource(name = "siteManageService") | |
| 35 | + SiteManageService siteManageService; | |
| 36 | + | |
| 37 | + @Resource(name = "propertiesService") | |
| 38 | + protected EgovPropertyService propertyService; | |
| 39 | + | |
| 40 | + //웨일 return auth | |
| 41 | + @RequestMapping(value="/api/whale/auth/whaleLoginUrl.do") | |
| 42 | + public String whaleLoginUrl(@ModelAttribute("loginVO") LoginVO loginVO, HttpSession session)throws Exception { | |
| 43 | + //웨일 아이디 인증 URL을 생성하기 위하여 getAuthorizationUrl메소드 호출 | |
| 44 | + String whaleAuthUrl = loginService.getAuthorizationUrl(session); | |
| 45 | + | |
| 46 | + return "redirect:" + whaleAuthUrl; | |
| 47 | + } | |
| 48 | + | |
| 49 | + //웨일 return auth | |
| 50 | + @RequestMapping(value="/api/whale/auth/whaleLogin.do") | |
| 51 | + public String callbackUrl(@ModelAttribute("loginVO") LoginVO loginVO, @RequestParam String code, @RequestParam String state, HttpSession session, HttpServletRequest request, HttpServletResponse response, ModelMap model)throws Exception { | |
| 52 | + try{ | |
| 53 | + OAuth2AccessToken oauthToken; | |
| 54 | + oauthToken = loginService.getAccessToken(session, code, state); | |
| 55 | + | |
| 56 | + //로그인 사용자 정보를 읽어온다. | |
| 57 | + String apiResult = loginService.getUserProfile(oauthToken); | |
| 58 | + | |
| 59 | + loginVO = loginService.userApiCheck(apiResult); | |
| 60 | + EgovSessionCookieUtil.setSessionAttribute(request, "loginVO", loginVO); | |
| 61 | + | |
| 62 | + }catch(Exception e) { | |
| 63 | + SiteManageVO siteVO = siteManageService.selectSiteServiceInfo(request); | |
| 64 | + | |
| 65 | + model.addAttribute("message", siteVO.getSiteNm() + "서비스 동의 후에 서비스 이용 가능합니다."); | |
| 66 | + }finally { | |
| 67 | + return "redirect:/index.do"; | |
| 68 | + } | |
| 69 | + | |
| 70 | + } | |
| 71 | + | |
| 72 | + /* | |
| 73 | + @RequestMapping(value = "/auth/myinfo.do") | |
| 74 | + public void myinfo(String token, HttpServletRequest request,HttpServletResponse response) throws Exception { | |
| 75 | + response.setHeader("Access-Control-Allow-Origin", "*"); | |
| 76 | + | |
| 77 | + OAuth2AccessToken searchToken = new OAuth2AccessToken(token); | |
| 78 | + String apiResult = loginService.getUserProfile(searchToken); | |
| 79 | + | |
| 80 | + String successYn = "Y"; | |
| 81 | + JSONObject jo = new JSONObject(); | |
| 82 | + response.setContentType("application/json;charset=utf-8"); | |
| 83 | + | |
| 84 | + jo.put("successYn", successYn); | |
| 85 | + jo.put("items", apiResult); | |
| 86 | + | |
| 87 | + PrintWriter printwriter = response.getWriter(); | |
| 88 | + printwriter.println(jo.toString()); | |
| 89 | + printwriter.flush(); | |
| 90 | + printwriter.close(); | |
| 91 | + } | |
| 92 | + */ | |
| 93 | +}(파일 끝에 줄바꿈 문자 없음) |
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleLoginApi.java
... | ... | @@ -0,0 +1,30 @@ |
| 1 | +package egovframework.module.api.whale.service; | |
| 2 | + | |
| 3 | +import com.github.scribejava.core.builder.api.DefaultApi20; | |
| 4 | + | |
| 5 | +public class WhaleLoginApi extends DefaultApi20 { | |
| 6 | + protected WhaleLoginApi(){ | |
| 7 | + } | |
| 8 | + | |
| 9 | + private static class InstanceHolder{ | |
| 10 | + private static final WhaleLoginApi INSTANCE = new WhaleLoginApi(); | |
| 11 | + } | |
| 12 | + | |
| 13 | + public static WhaleLoginApi instance(){ | |
| 14 | + return InstanceHolder.INSTANCE; | |
| 15 | + } | |
| 16 | + | |
| 17 | + @Override | |
| 18 | + public String getAccessTokenEndpoint() { | |
| 19 | + //return "https://nid.naver.com/oauth2.0/token?grant_type=authorization_code"; | |
| 20 | + return "https://auth.whalespace.io/oauth2/v1.1/token?grant_type=authorization_code"; | |
| 21 | + } | |
| 22 | + | |
| 23 | + @Override | |
| 24 | + protected String getAuthorizationBaseUrl() { | |
| 25 | + // TODO Auto-generated method stub | |
| 26 | + //return"https://nid.naver.com/oauth2.0/authorize"; | |
| 27 | + return"https://auth.whalespace.io/oauth2/v1.1/authorize"; | |
| 28 | + } | |
| 29 | + | |
| 30 | +} |
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleOrgunit.java
... | ... | @@ -0,0 +1,36 @@ |
| 1 | +package egovframework.module.api.whale.service; | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | +public class WhaleOrgunit { | |
| 6 | + | |
| 7 | + private String id; | |
| 8 | + | |
| 9 | + private String name; | |
| 10 | + | |
| 11 | + private String orgUnitPath; | |
| 12 | + | |
| 13 | + public String getId() { | |
| 14 | + return id; | |
| 15 | + } | |
| 16 | + | |
| 17 | + public void setId(String id) { | |
| 18 | + this.id = id; | |
| 19 | + } | |
| 20 | + | |
| 21 | + public String getName() { | |
| 22 | + return name; | |
| 23 | + } | |
| 24 | + | |
| 25 | + public void setName(String name) { | |
| 26 | + this.name = name; | |
| 27 | + } | |
| 28 | + | |
| 29 | + public String getOrgUnitPath() { | |
| 30 | + return orgUnitPath; | |
| 31 | + } | |
| 32 | + | |
| 33 | + public void setOrgUnitPath(String orgUnitPath) { | |
| 34 | + this.orgUnitPath = orgUnitPath; | |
| 35 | + } | |
| 36 | +} |
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleSpace.java
... | ... | @@ -0,0 +1,31 @@ |
| 1 | +package egovframework.module.api.whale.service; | |
| 2 | + | |
| 3 | +public class WhaleSpace { | |
| 4 | + | |
| 5 | + String name; | |
| 6 | + | |
| 7 | + String code; | |
| 8 | + | |
| 9 | + public String getName() { | |
| 10 | + return name; | |
| 11 | + } | |
| 12 | + | |
| 13 | + public void setName(String name) { | |
| 14 | + this.name = name; | |
| 15 | + } | |
| 16 | + | |
| 17 | + public String getCode() { | |
| 18 | + return code; | |
| 19 | + } | |
| 20 | + | |
| 21 | + public void setCode(String code) { | |
| 22 | + this.code = code; | |
| 23 | + } | |
| 24 | + | |
| 25 | + @Override | |
| 26 | + public String toString() { | |
| 27 | + return "NaverSpace [name=" + name + ", code=" + code + "]"; | |
| 28 | + } | |
| 29 | + | |
| 30 | + | |
| 31 | +} |
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleUser.java
... | ... | @@ -0,0 +1,74 @@ |
| 1 | +package egovframework.module.api.whale.service; | |
| 2 | + | |
| 3 | +public class WhaleUser { | |
| 4 | + | |
| 5 | + private String primaryEmail; | |
| 6 | + | |
| 7 | + private String sid; | |
| 8 | + | |
| 9 | + private String userType; | |
| 10 | + | |
| 11 | + private WhaleUserName name; | |
| 12 | + | |
| 13 | + private String thumbnailPhotoUrl; | |
| 14 | + | |
| 15 | + private WhaleSpace space; | |
| 16 | + | |
| 17 | + private WhaleOrgunit orgunit; | |
| 18 | + | |
| 19 | + public String getPrimaryEmail() { | |
| 20 | + return primaryEmail; | |
| 21 | + } | |
| 22 | + | |
| 23 | + public void setPrimaryEmail(String primaryEmail) { | |
| 24 | + this.primaryEmail = primaryEmail; | |
| 25 | + } | |
| 26 | + | |
| 27 | + public String getSid() { | |
| 28 | + return sid; | |
| 29 | + } | |
| 30 | + | |
| 31 | + public void setSid(String sid) { | |
| 32 | + this.sid = sid; | |
| 33 | + } | |
| 34 | + | |
| 35 | + public String getUserType() { | |
| 36 | + return userType; | |
| 37 | + } | |
| 38 | + | |
| 39 | + public void setUserType(String userType) { | |
| 40 | + this.userType = userType; | |
| 41 | + } | |
| 42 | + | |
| 43 | + public WhaleUserName getName() { | |
| 44 | + return name; | |
| 45 | + } | |
| 46 | + | |
| 47 | + public void setName(WhaleUserName name) { | |
| 48 | + this.name = name; | |
| 49 | + } | |
| 50 | + | |
| 51 | + public String getThumbnailPhotoUrl() { | |
| 52 | + return thumbnailPhotoUrl; | |
| 53 | + } | |
| 54 | + | |
| 55 | + public void setThumbnailPhotoUrl(String thumbnailPhotoUrl) { | |
| 56 | + this.thumbnailPhotoUrl = thumbnailPhotoUrl; | |
| 57 | + } | |
| 58 | + | |
| 59 | + public WhaleSpace getSpace() { | |
| 60 | + return space; | |
| 61 | + } | |
| 62 | + | |
| 63 | + public void setSpace(WhaleSpace space) { | |
| 64 | + this.space = space; | |
| 65 | + } | |
| 66 | + | |
| 67 | + public WhaleOrgunit getOrgunit() { | |
| 68 | + return orgunit; | |
| 69 | + } | |
| 70 | + | |
| 71 | + public void setOrgunit(WhaleOrgunit orgunit) { | |
| 72 | + this.orgunit = orgunit; | |
| 73 | + } | |
| 74 | +} |
+++ base/src/main/java/egovframework/module/api/whale/service/WhaleUserName.java
... | ... | @@ -0,0 +1,35 @@ |
| 1 | +package egovframework.module.api.whale.service; | |
| 2 | + | |
| 3 | +public class WhaleUserName { | |
| 4 | + | |
| 5 | + private String givenName; | |
| 6 | + | |
| 7 | + private String familyName; | |
| 8 | + | |
| 9 | + private String fullName; | |
| 10 | + | |
| 11 | + public String getGivenName() { | |
| 12 | + return givenName; | |
| 13 | + } | |
| 14 | + | |
| 15 | + public void setGivenName(String givenName) { | |
| 16 | + this.givenName = givenName; | |
| 17 | + } | |
| 18 | + | |
| 19 | + public String getFamilyName() { | |
| 20 | + return familyName; | |
| 21 | + } | |
| 22 | + | |
| 23 | + public void setFamilyName(String familyName) { | |
| 24 | + this.familyName = familyName; | |
| 25 | + } | |
| 26 | + | |
| 27 | + public String getFullName() { | |
| 28 | + return fullName; | |
| 29 | + } | |
| 30 | + | |
| 31 | + public void setFullName(String fullName) { | |
| 32 | + this.fullName = fullName; | |
| 33 | + } | |
| 34 | + | |
| 35 | +} |
--- base/src/main/java/egovframework/module/uat/uia/service/LoginService.java
+++ base/src/main/java/egovframework/module/uat/uia/service/LoginService.java
... | ... | @@ -1,137 +1,88 @@ |
| 1 | 1 |
package egovframework.module.uat.uia.service; |
| 2 | 2 |
|
| 3 |
+import java.io.IOException; |
|
| 3 | 4 |
import java.util.List; |
| 4 | 5 |
import java.util.Map; |
| 6 |
+import java.util.concurrent.ExecutionException; |
|
| 5 | 7 |
|
| 8 |
+import com.github.scribejava.core.model.OAuth2AccessToken; |
|
| 6 | 9 |
import egovframework.module.sym.log.service.LoginInfoVO; |
| 10 |
+ |
|
| 11 |
+import javax.servlet.http.HttpSession; |
|
| 7 | 12 |
|
| 8 | 13 |
//일반 로그인, 인증서 로그인을 처리하는 비즈니스 인터페이스 클래스 |
| 9 | 14 |
public interface LoginService {
|
| 10 | 15 |
|
| 11 |
- /** |
|
| 12 |
- * 일반 로그인을 처리한다 |
|
| 13 |
- * @param vo LoginVO |
|
| 14 |
- * @return LoginVO |
|
| 15 |
- * @exception Exception |
|
| 16 |
- */ |
|
| 16 |
+ //일반 로그인을 처리한다 |
|
| 17 | 17 |
LoginVO actionLogin(LoginVO vo) throws Exception; |
| 18 | 18 |
|
| 19 |
- /** |
|
| 20 |
- * 인증서 로그인을 처리한다 |
|
| 21 |
- * @param vo LoginVO |
|
| 22 |
- * @return LoginVO |
|
| 23 |
- * @exception Exception |
|
| 24 |
- */ |
|
| 19 |
+ //인증서 로그인을 처리한다 |
|
| 25 | 20 |
LoginVO actionCrtfctLogin(LoginVO vo) throws Exception; |
| 26 | 21 |
|
| 27 |
- /** |
|
| 28 |
- * 아이디를 찾는다. |
|
| 29 |
- * @param vo LoginVO |
|
| 30 |
- * @return LoginVO |
|
| 31 |
- * @exception Exception |
|
| 32 |
- */ |
|
| 22 |
+ //아이디를 찾는다. |
|
| 33 | 23 |
LoginVO searchId(LoginVO vo) throws Exception; |
| 34 | 24 |
|
| 35 |
- /** |
|
| 36 |
- * 비밀번호를 찾는다. |
|
| 37 |
- * @param vo LoginVO |
|
| 38 |
- * @return boolean |
|
| 39 |
- * @exception Exception |
|
| 40 |
- */ |
|
| 25 |
+ //비밀번호를 찾는다. |
|
| 41 | 26 |
Map<String, Object> searchPassword(LoginVO vo, boolean update) throws Exception; |
| 42 | 27 |
|
| 43 |
- /** |
|
| 44 |
- * 아이디로 사용자정보를 찾는다. |
|
| 45 |
- * @param userId String |
|
| 46 |
- * @return LoginVO |
|
| 47 |
- * @exception Exception |
|
| 48 |
- */ |
|
| 28 |
+ //아이디로 사용자정보를 찾는다. |
|
| 49 | 29 |
LoginVO searchSSOLogin(LoginInfoVO loginInfoVO) throws Exception; |
| 50 | 30 |
|
| 51 |
- /** |
|
| 52 |
- * 로그아웃 아이디를 추가한다. |
|
| 53 |
- * @param userId String |
|
| 54 |
- * @exception Exception |
|
| 55 |
- */ |
|
| 31 |
+ //로그아웃 아이디를 추가한다. |
|
| 56 | 32 |
void addLogoutList(LoginInfoVO loginInfoVO) throws Exception ; |
| 57 | 33 |
|
| 58 |
- /** |
|
| 59 |
- * 로그아웃 아이디를 삭제한다. |
|
| 60 |
- * @param userId String |
|
| 61 |
- * @exception Exception |
|
| 62 |
- */ |
|
| 34 |
+ //로그아웃 아이디를 삭제한다. |
|
| 63 | 35 |
void removeLogoutList(LoginInfoVO loginInfoVO) throws Exception ; |
| 64 | 36 |
|
| 65 |
- /** |
|
| 66 |
- * 로그아웃 아이디를 조회한다. |
|
| 67 |
- * @param userId String |
|
| 68 |
- * @return boolean |
|
| 69 |
- * @exception Exception |
|
| 70 |
- */ |
|
| 37 |
+ //로그아웃 아이디를 조회한다. |
|
| 71 | 38 |
boolean getLogoutListExists(LoginInfoVO loginInfoVO) throws Exception; |
| 72 | 39 |
|
| 73 |
- /** |
|
| 74 |
- * COMTNLOGININFO을조회한다. |
|
| 75 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 76 |
- * @return 등록 결과 |
|
| 77 |
- * @exception Exception |
|
| 78 |
- */ |
|
| 40 |
+ //COMTNLOGININFO을조회한다. |
|
| 79 | 41 |
int selectLoginExistsForLoginIdntfcIdCnt(LoginInfoVO loginInfoVO) throws Exception; |
| 80 | 42 |
|
| 81 |
- /** |
|
| 82 |
- * COMTNLOGININFO을 조회한다. |
|
| 83 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 84 |
- * @return 등록 결과 |
|
| 85 |
- * @exception Exception |
|
| 86 |
- */ |
|
| 43 |
+ //COMTNLOGININFO을 조회한다. |
|
| 87 | 44 |
LoginInfoVO selectLoginExistsForSession(LoginInfoVO loginInfoVO) throws Exception; |
| 88 | 45 |
|
| 89 |
- /** |
|
| 90 |
- * COMTNLOGININFO을 조회한다. |
|
| 91 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 92 |
- * @return 등록 결과 |
|
| 93 |
- * @exception Exception |
|
| 94 |
- */ |
|
| 46 |
+ //COMTNLOGININFO을 조회한다. |
|
| 95 | 47 |
LoginInfoVO selectLoginExistsForSiteId(LoginInfoVO loginInfoVO) throws Exception; |
| 96 | 48 |
|
| 97 |
- /** |
|
| 98 |
- * COMTNLOGININFO을 등록한다. |
|
| 99 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 100 |
- * @return 등록 결과 |
|
| 101 |
- * @exception Exception |
|
| 102 |
- */ |
|
| 49 |
+ //COMTNLOGININFO을 등록한다. |
|
| 103 | 50 |
String insertLoginInfo(LoginInfoVO loginInfoVO) throws Exception; |
| 104 | 51 |
|
| 105 |
- /** |
|
| 106 |
- * 로그인한 사이트에 로그아웃을 요청한다. |
|
| 107 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 108 |
- * @exception Exception |
|
| 109 |
- */ |
|
| 52 |
+ //로그인한 사이트에 로그아웃을 요청한다. |
|
| 110 | 53 |
void allSiteLogoutRequest(LoginInfoVO loginInfoVO) throws Exception; |
| 111 | 54 |
|
| 112 |
- /** |
|
| 113 |
- * 로그인 정보를 삭제한다. |
|
| 114 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 115 |
- * @exception Exception |
|
| 116 |
- */ |
|
| 55 |
+ //로그인 정보를 삭제한다. |
|
| 117 | 56 |
void deleteLoginInfo (LoginInfoVO loginInfoVO) throws Exception; |
| 118 | 57 |
|
| 119 |
- /** |
|
| 120 |
- * 삭제할 로그인 정보조회한다. |
|
| 121 |
- * @exception Exception |
|
| 122 |
- */ |
|
| 58 |
+ //삭제할 로그인 정보조회한다. |
|
| 123 | 59 |
List<LoginInfoVO> selectRemoveTargetList() throws Exception ; |
| 124 | 60 |
|
| 125 |
- /** |
|
| 126 |
- * 로그인 정보를 삭제한다. |
|
| 127 |
- * @exception Exception |
|
| 128 |
- */ |
|
| 61 |
+ //로그인 정보를 삭제한다. |
|
| 129 | 62 |
void deleteLogininfoRemoveTarget() throws Exception; |
| 130 | 63 |
|
| 131 |
- /** |
|
| 132 |
- * 로그인 정보를 수정한다. |
|
| 133 |
- * @param vo - 등록할 정보가 담긴 LoginInfoVO |
|
| 134 |
- * @exception Exception |
|
| 135 |
- */ |
|
| 64 |
+ //로그인 정보를 수정한다. |
|
| 136 | 65 |
void updateLoginInfo (LoginInfoVO loginInfoVO) throws Exception; |
| 66 |
+ |
|
| 67 |
+ // 네이버&웨일 아이디로 인증 URL 생성 Method |
|
| 68 |
+ String getAuthorizationUrl(HttpSession session); |
|
| 69 |
+ |
|
| 70 |
+ // 네이버&웨일 아이디로 Callback 처리 및 AccessToken 획득 Method |
|
| 71 |
+ OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException, InterruptedException, ExecutionException; |
|
| 72 |
+ |
|
| 73 |
+ //세션 유효성 검증을 위한 난수 생성기 |
|
| 74 |
+ String generateRandomString(); |
|
| 75 |
+ |
|
| 76 |
+ //http session에 데이터 저장 |
|
| 77 |
+ void setSession(HttpSession session,String state); |
|
| 78 |
+ |
|
| 79 |
+ //http session에서 데이터 가져오기 |
|
| 80 |
+ String getSession(HttpSession session); |
|
| 81 |
+ |
|
| 82 |
+ //Access Token을 이용하여 네이버&웨일 사용자 프로필 API를 호출 |
|
| 83 |
+ String getUserProfile(OAuth2AccessToken oauthToken) throws IOException; |
|
| 84 |
+ |
|
| 85 |
+ //API에서 제공 한 String값으로 회원 체크(등록&수정) |
|
| 86 |
+ LoginVO userApiCheck(String str) throws Exception; |
|
| 87 |
+ |
|
| 137 | 88 |
} |
--- base/src/main/java/egovframework/module/uat/uia/service/LoginVO.java
+++ base/src/main/java/egovframework/module/uat/uia/service/LoginVO.java
... | ... | @@ -61,13 +61,42 @@ |
| 61 | 61 |
|
| 62 | 62 |
//세부전공 |
| 63 | 63 |
private String major; |
| 64 |
- |
|
| 65 |
- //교수직위 |
|
| 66 |
- private String positionCode; |
|
| 67 |
- |
|
| 64 |
+ |
|
| 68 | 65 |
//플래그값 |
| 69 | 66 |
private String flag; |
| 70 |
- |
|
| 67 |
+ |
|
| 68 |
+ //API등 결과 코드 |
|
| 69 |
+ private String resultCode; |
|
| 70 |
+ |
|
| 71 |
+ //API등 결과 문자 |
|
| 72 |
+ private String resultStr; |
|
| 73 |
+ |
|
| 74 |
+ //웨일 |
|
| 75 |
+ private String tokenType; |
|
| 76 |
+ private String expiresIn; |
|
| 77 |
+ private String accessToken; |
|
| 78 |
+ private String refreshToken; |
|
| 79 |
+ private String returnCode; |
|
| 80 |
+ private String returnStatus; |
|
| 81 |
+ private String returnMessage; |
|
| 82 |
+ private String returnReason; |
|
| 83 |
+ private String sid; |
|
| 84 |
+ |
|
| 85 |
+ //학교명 |
|
| 86 |
+ private String schulNm; |
|
| 87 |
+ |
|
| 88 |
+ //학교코드 |
|
| 89 |
+ private String schulCode; |
|
| 90 |
+ |
|
| 91 |
+ //학교급코드 |
|
| 92 |
+ private String schulGradeCode; |
|
| 93 |
+ |
|
| 94 |
+ //학년 |
|
| 95 |
+ private String stGrade; |
|
| 96 |
+ |
|
| 97 |
+ //반 |
|
| 98 |
+ private String stClass; |
|
| 99 |
+ |
|
| 71 | 100 |
/** |
| 72 | 101 |
* id attribute 를 리턴한다. |
| 73 | 102 |
* @return String |
... | ... | @@ -357,12 +386,6 @@ |
| 357 | 386 |
public void setMajor(String major) {
|
| 358 | 387 |
this.major = major; |
| 359 | 388 |
} |
| 360 |
- public String getPositionCode() {
|
|
| 361 |
- return positionCode; |
|
| 362 |
- } |
|
| 363 |
- public void setPositionCode(String positionCode) {
|
|
| 364 |
- this.positionCode = positionCode; |
|
| 365 |
- } |
|
| 366 | 389 |
public String getFlag() {
|
| 367 | 390 |
return flag; |
| 368 | 391 |
} |
... | ... | @@ -377,4 +400,132 @@ |
| 377 | 400 |
public void setEsntlId(String esntlId) {
|
| 378 | 401 |
this.esntlId = esntlId; |
| 379 | 402 |
} |
| 403 |
+ |
|
| 404 |
+ public String getResultCode() {
|
|
| 405 |
+ return resultCode; |
|
| 406 |
+ } |
|
| 407 |
+ |
|
| 408 |
+ public void setResultCode(String resultCode) {
|
|
| 409 |
+ this.resultCode = resultCode; |
|
| 410 |
+ } |
|
| 411 |
+ |
|
| 412 |
+ public String getResultStr() {
|
|
| 413 |
+ return resultStr; |
|
| 414 |
+ } |
|
| 415 |
+ |
|
| 416 |
+ public void setResultStr(String resultStr) {
|
|
| 417 |
+ this.resultStr = resultStr; |
|
| 418 |
+ } |
|
| 419 |
+ |
|
| 420 |
+ public String getTokenType() {
|
|
| 421 |
+ return tokenType; |
|
| 422 |
+ } |
|
| 423 |
+ |
|
| 424 |
+ public void setTokenType(String tokenType) {
|
|
| 425 |
+ this.tokenType = tokenType; |
|
| 426 |
+ } |
|
| 427 |
+ |
|
| 428 |
+ public String getExpiresIn() {
|
|
| 429 |
+ return expiresIn; |
|
| 430 |
+ } |
|
| 431 |
+ |
|
| 432 |
+ public void setExpiresIn(String expiresIn) {
|
|
| 433 |
+ this.expiresIn = expiresIn; |
|
| 434 |
+ } |
|
| 435 |
+ |
|
| 436 |
+ public String getAccessToken() {
|
|
| 437 |
+ return accessToken; |
|
| 438 |
+ } |
|
| 439 |
+ |
|
| 440 |
+ public void setAccessToken(String accessToken) {
|
|
| 441 |
+ this.accessToken = accessToken; |
|
| 442 |
+ } |
|
| 443 |
+ |
|
| 444 |
+ public String getRefreshToken() {
|
|
| 445 |
+ return refreshToken; |
|
| 446 |
+ } |
|
| 447 |
+ |
|
| 448 |
+ public void setRefreshToken(String refreshToken) {
|
|
| 449 |
+ this.refreshToken = refreshToken; |
|
| 450 |
+ } |
|
| 451 |
+ |
|
| 452 |
+ public String getReturnCode() {
|
|
| 453 |
+ return returnCode; |
|
| 454 |
+ } |
|
| 455 |
+ |
|
| 456 |
+ public void setReturnCode(String returnCode) {
|
|
| 457 |
+ this.returnCode = returnCode; |
|
| 458 |
+ } |
|
| 459 |
+ |
|
| 460 |
+ public String getReturnStatus() {
|
|
| 461 |
+ return returnStatus; |
|
| 462 |
+ } |
|
| 463 |
+ |
|
| 464 |
+ public void setReturnStatus(String returnStatus) {
|
|
| 465 |
+ this.returnStatus = returnStatus; |
|
| 466 |
+ } |
|
| 467 |
+ |
|
| 468 |
+ public String getReturnMessage() {
|
|
| 469 |
+ return returnMessage; |
|
| 470 |
+ } |
|
| 471 |
+ |
|
| 472 |
+ public void setReturnMessage(String returnMessage) {
|
|
| 473 |
+ this.returnMessage = returnMessage; |
|
| 474 |
+ } |
|
| 475 |
+ |
|
| 476 |
+ public String getReturnReason() {
|
|
| 477 |
+ return returnReason; |
|
| 478 |
+ } |
|
| 479 |
+ |
|
| 480 |
+ public void setReturnReason(String returnReason) {
|
|
| 481 |
+ this.returnReason = returnReason; |
|
| 482 |
+ } |
|
| 483 |
+ |
|
| 484 |
+ public String getSid() {
|
|
| 485 |
+ return sid; |
|
| 486 |
+ } |
|
| 487 |
+ |
|
| 488 |
+ public void setSid(String sid) {
|
|
| 489 |
+ this.sid = sid; |
|
| 490 |
+ } |
|
| 491 |
+ |
|
| 492 |
+ public String getSchulNm() {
|
|
| 493 |
+ return schulNm; |
|
| 494 |
+ } |
|
| 495 |
+ |
|
| 496 |
+ public void setSchulNm(String schulNm) {
|
|
| 497 |
+ this.schulNm = schulNm; |
|
| 498 |
+ } |
|
| 499 |
+ |
|
| 500 |
+ public String getStGrade() {
|
|
| 501 |
+ return stGrade; |
|
| 502 |
+ } |
|
| 503 |
+ |
|
| 504 |
+ public void setStGrade(String stGrade) {
|
|
| 505 |
+ this.stGrade = stGrade; |
|
| 506 |
+ } |
|
| 507 |
+ |
|
| 508 |
+ public String getStClass() {
|
|
| 509 |
+ return stClass; |
|
| 510 |
+ } |
|
| 511 |
+ |
|
| 512 |
+ public void setStClass(String stClass) {
|
|
| 513 |
+ this.stClass = stClass; |
|
| 514 |
+ } |
|
| 515 |
+ |
|
| 516 |
+ public String getSchulCode() {
|
|
| 517 |
+ return schulCode; |
|
| 518 |
+ } |
|
| 519 |
+ |
|
| 520 |
+ public void setSchulCode(String schulCode) {
|
|
| 521 |
+ this.schulCode = schulCode; |
|
| 522 |
+ } |
|
| 523 |
+ |
|
| 524 |
+ public String getSchulGradeCode() {
|
|
| 525 |
+ return schulGradeCode; |
|
| 526 |
+ } |
|
| 527 |
+ |
|
| 528 |
+ public void setSchulGradeCode(String schulGradeCode) {
|
|
| 529 |
+ this.schulGradeCode = schulGradeCode; |
|
| 530 |
+ } |
|
| 380 | 531 |
} |
--- base/src/main/java/egovframework/module/uat/uia/service/impl/LoginServiceImpl.java
+++ base/src/main/java/egovframework/module/uat/uia/service/impl/LoginServiceImpl.java
... | ... | @@ -1,13 +1,40 @@ |
| 1 | 1 |
package egovframework.module.uat.uia.service.impl; |
| 2 | 2 |
|
| 3 |
-import java.util.ArrayList; |
|
| 4 |
-import java.util.HashMap; |
|
| 5 |
-import java.util.List; |
|
| 6 |
-import java.util.Map; |
|
| 3 |
+import java.io.IOException; |
|
| 4 |
+import java.net.URL; |
|
| 5 |
+import java.util.*; |
|
| 6 |
+import java.util.concurrent.ExecutionException; |
|
| 7 |
+import java.util.regex.Pattern; |
|
| 7 | 8 |
|
| 8 | 9 |
import javax.annotation.Resource; |
| 10 |
+import javax.servlet.http.HttpSession; |
|
| 9 | 11 |
|
| 12 |
+import com.fasterxml.jackson.databind.ser.impl.ReadOnlyClassToSerializerMap; |
|
| 13 |
+import com.github.scribejava.core.builder.ServiceBuilder; |
|
| 14 |
+import com.github.scribejava.core.model.OAuth2AccessToken; |
|
| 15 |
+import com.github.scribejava.core.oauth.OAuth20Service; |
|
| 16 |
+import com.google.gson.Gson; |
|
| 17 |
+import egovframework.com.cmm.service.Globals; |
|
| 18 |
+import egovframework.module.api.whale.service.WhaleLoginApi; |
|
| 19 |
+import egovframework.module.api.whale.service.WhaleUser; |
|
| 20 |
+import egovframework.module.uss.umt.service.UserManageService; |
|
| 21 |
+import egovframework.module.uss.umt.service.UserManageVO; |
|
| 10 | 22 |
import egovframework.module.utl.fcc.service.CryptoUtil; |
| 23 |
+import egovframework.rte.fdl.idgnr.EgovIdGnrService; |
|
| 24 |
+import net.sf.json.JSONObject; |
|
| 25 |
+import net.sf.json.JSONSerializer; |
|
| 26 |
+import okhttp3.OkHttpClient; |
|
| 27 |
+import okhttp3.Request; |
|
| 28 |
+import okhttp3.Response; |
|
| 29 |
+/* |
|
| 30 |
+import org.apache.http.HttpEntity; |
|
| 31 |
+import org.apache.http.HttpResponse; |
|
| 32 |
+import org.apache.http.client.HttpClient; |
|
| 33 |
+import org.apache.http.client.methods.HttpGet; |
|
| 34 |
+import org.apache.http.impl.client.HttpClientBuilder; |
|
| 35 |
+*/ |
|
| 36 |
+import org.apache.commons.logging.Log; |
|
| 37 |
+import org.apache.commons.logging.LogFactory; |
|
| 11 | 38 |
import org.springframework.stereotype.Service; |
| 12 | 39 |
import egovframework.rte.fdl.cmmn.EgovAbstractServiceImpl; |
| 13 | 40 |
|
... | ... | @@ -22,11 +49,12 @@ |
| 22 | 49 |
import egovframework.module.utl.fcc.service.EgovStringUtil; |
| 23 | 50 |
import egovframework.module.utl.sim.service.EgovCrypTo; |
| 24 | 51 |
import egovframework.module.sms.service.SmsInfoService; |
| 52 |
+import org.springframework.util.StringUtils; |
|
| 53 |
+import sun.net.www.http.HttpClient; |
|
| 25 | 54 |
|
| 26 | 55 |
//일반 로그인, 인증서 로그인을 처리하는 비즈니스 구현 클래스 |
| 27 | 56 |
@Service("loginService")
|
| 28 |
-public class LoginServiceImpl extends EgovAbstractServiceImpl implements |
|
| 29 |
- LoginService {
|
|
| 57 |
+public class LoginServiceImpl extends EgovAbstractServiceImpl implements LoginService {
|
|
| 30 | 58 |
|
| 31 | 59 |
@Resource(name="loginMapper") |
| 32 | 60 |
private LoginMapper loginMapper; |
... | ... | @@ -39,9 +67,30 @@ |
| 39 | 67 |
|
| 40 | 68 |
@Resource(name = "smsInfoService") |
| 41 | 69 |
private SmsInfoService smsInfoService; |
| 42 |
- |
|
| 70 |
+ |
|
| 71 |
+ @Resource(name = "userManageService") |
|
| 72 |
+ private UserManageService userManageService; |
|
| 73 |
+ |
|
| 74 |
+ @Resource(name="memberIdGnrService") |
|
| 75 |
+ private EgovIdGnrService idgenService; |
|
| 76 |
+ |
|
| 43 | 77 |
HashMap<String, String> logoutList = new HashMap<String, String>(); |
| 44 |
- |
|
| 78 |
+ |
|
| 79 |
+ /* 인증 요청문을 구성하는 파라미터 */ |
|
| 80 |
+ private final static String CLIENT_ID = Globals.CLIENT_ID; |
|
| 81 |
+ private final static String CLIENT_SECRET = Globals.CLIENT_SECRET; |
|
| 82 |
+ private final static String REDIRECT_URI = Globals.DOMAIN + "/api/whale/auth/whaleLogin.do"; |
|
| 83 |
+ private final static String SESSION_STATE = "oauth_state"; |
|
| 84 |
+ |
|
| 85 |
+ /* 프로필 조회 API URL */ |
|
| 86 |
+ private final static String PROFILE_API_URL = "https://api.whalespace.io/oauth2/v1.1/userinfo"; |
|
| 87 |
+ private final static String AUTH_URL ="https://auth.whalespace.io/oauth2/v1.1/authorize?"; |
|
| 88 |
+ |
|
| 89 |
+ //scope URL |
|
| 90 |
+ private final static String SCOPE_URL = "https://account.whalespace.io/directory/user.profile.readonly"; |
|
| 91 |
+ |
|
| 92 |
+ protected Log log = LogFactory.getLog(this.getClass()); |
|
| 93 |
+ |
|
| 45 | 94 |
//일반 로그인을 처리한다 |
| 46 | 95 |
public LoginVO actionLogin(LoginVO vo) throws Exception {
|
| 47 | 96 |
|
... | ... | @@ -282,4 +331,192 @@ |
| 282 | 331 |
public void updateLoginInfo (LoginInfoVO loginInfoVO) throws Exception {
|
| 283 | 332 |
loginInfoService.updateLoginInfo(loginInfoVO); |
| 284 | 333 |
} |
| 334 |
+ |
|
| 335 |
+ //네이버&웨일 아이디로 인증 URL 생성 Method |
|
| 336 |
+ public String getAuthorizationUrl(HttpSession session) {
|
|
| 337 |
+ |
|
| 338 |
+ //세션 유효성 검증을 위하여 난수를 생성 |
|
| 339 |
+ String state = generateRandomString(); |
|
| 340 |
+ //생성한 난수 값을 session에 저장 |
|
| 341 |
+ setSession(session,state); |
|
| 342 |
+ |
|
| 343 |
+ //Scribe에서 제공하는 인증 URL 생성 기능을 이용하여 네아로 인증 URL 생성 |
|
| 344 |
+ OAuth20Service oauthService = new ServiceBuilder() |
|
| 345 |
+ .apiKey(CLIENT_ID) |
|
| 346 |
+ .apiSecret(CLIENT_SECRET) |
|
| 347 |
+ .callback(REDIRECT_URI) |
|
| 348 |
+ .state(state) //앞서 생성한 난수값을 인증 URL생성시 사용함 |
|
| 349 |
+ .scope(SCOPE_URL) |
|
| 350 |
+ .build(WhaleLoginApi.instance()); |
|
| 351 |
+ |
|
| 352 |
+ return oauthService.getAuthorizationUrl(); |
|
| 353 |
+ } |
|
| 354 |
+ |
|
| 355 |
+ //세션 유효성 검증을 위한 난수 생성기 |
|
| 356 |
+ public String generateRandomString() {
|
|
| 357 |
+ return UUID.randomUUID().toString(); |
|
| 358 |
+ } |
|
| 359 |
+ |
|
| 360 |
+ //http session에 데이터 저장 |
|
| 361 |
+ public void setSession(HttpSession session,String state){
|
|
| 362 |
+ session.setAttribute(SESSION_STATE, state); |
|
| 363 |
+ } |
|
| 364 |
+ |
|
| 365 |
+ //http session에서 데이터 가져오기 |
|
| 366 |
+ public String getSession(HttpSession session){
|
|
| 367 |
+ return (String) session.getAttribute(SESSION_STATE); |
|
| 368 |
+ } |
|
| 369 |
+ |
|
| 370 |
+ //네이버&웨일 아이디로 Callback 처리 및 AccessToken 획득 Method |
|
| 371 |
+ public OAuth2AccessToken getAccessToken(HttpSession session, String code, String state) throws IOException, InterruptedException, ExecutionException {
|
|
| 372 |
+ |
|
| 373 |
+ String sessionState = getSession(session); |
|
| 374 |
+ if(StringUtils.pathEquals(sessionState, state)){
|
|
| 375 |
+ |
|
| 376 |
+ OAuth20Service oauthService = new ServiceBuilder() |
|
| 377 |
+ .apiKey(CLIENT_ID) |
|
| 378 |
+ .apiSecret(CLIENT_SECRET) |
|
| 379 |
+ .callback(REDIRECT_URI) |
|
| 380 |
+ .build(WhaleLoginApi.instance()); |
|
| 381 |
+ |
|
| 382 |
+ OAuth2AccessToken accessToken = oauthService.getAccessToken(code); |
|
| 383 |
+ return accessToken; |
|
| 384 |
+ } |
|
| 385 |
+ return null; |
|
| 386 |
+ } |
|
| 387 |
+ |
|
| 388 |
+ //Access Token을 이용하여 웨일 사용자 프로필 API를 호출 및 업데이 |
|
| 389 |
+ public String getUserProfile(OAuth2AccessToken oauthToken) throws IOException{
|
|
| 390 |
+ |
|
| 391 |
+ OkHttpClient client = new OkHttpClient().newBuilder().build(); |
|
| 392 |
+ Request request = new Request.Builder() |
|
| 393 |
+ .url(PROFILE_API_URL) |
|
| 394 |
+ .method("GET", null)
|
|
| 395 |
+ .addHeader("Content-Type", "application/x-www-form-urlencoded")
|
|
| 396 |
+ .addHeader("Authorization", "Bearer " + oauthToken.getAccessToken())
|
|
| 397 |
+ .build(); |
|
| 398 |
+ Response response = client.newCall(request).execute(); |
|
| 399 |
+ |
|
| 400 |
+ return response.body().string(); |
|
| 401 |
+ } |
|
| 402 |
+ |
|
| 403 |
+ //API에서 제공 한 String값으로 회원 체크(등록&수정) |
|
| 404 |
+ public LoginVO userApiCheck(String str) throws Exception{
|
|
| 405 |
+ LoginVO login = new LoginVO(); |
|
| 406 |
+ Gson gson = new Gson(); |
|
| 407 |
+ |
|
| 408 |
+ WhaleUser userInfo = gson.fromJson(str, WhaleUser.class); |
|
| 409 |
+ if(userInfo.getPrimaryEmail() != null) {
|
|
| 410 |
+ login.setId(userInfo.getPrimaryEmail()); |
|
| 411 |
+ login.setPassword(userInfo.getPrimaryEmail()); |
|
| 412 |
+ login.setName(userInfo.getName().getFamilyName() + userInfo.getName().getGivenName()); |
|
| 413 |
+ login.setEmail(userInfo.getPrimaryEmail()); |
|
| 414 |
+ login.setPhotoStreFileNm(userInfo.getThumbnailPhotoUrl()); |
|
| 415 |
+ login.setSchulNm(userInfo.getSpace().getName()); |
|
| 416 |
+ login.setSid(userInfo.getSid()); |
|
| 417 |
+ |
|
| 418 |
+ String userSe = "01"; |
|
| 419 |
+ if("tea".equals(userInfo.getUserType())) {
|
|
| 420 |
+ userSe = "08"; |
|
| 421 |
+ } else if("emp".equals(userInfo.getUserType())) {
|
|
| 422 |
+ userSe = "08"; |
|
| 423 |
+ } else if("stu".equals(userInfo.getUserType())) {
|
|
| 424 |
+ userSe = "06"; |
|
| 425 |
+ } else if("par".equals(userInfo.getUserType())) {
|
|
| 426 |
+ userSe = "04"; |
|
| 427 |
+ } |
|
| 428 |
+ login.setUserSeCode(userSe); |
|
| 429 |
+ login.setUserSe(userSe); |
|
| 430 |
+ |
|
| 431 |
+ if(userInfo.getSpace() != null && userInfo.getSpace().getCode() != null){
|
|
| 432 |
+ login.setSchulNm(userInfo.getSpace().getName()); |
|
| 433 |
+ login.setSchulCode(userInfo.getSpace().getCode()); |
|
| 434 |
+ } |
|
| 435 |
+ if(!EgovStringUtil.isEmpty(userInfo.getOrgunit().getOrgUnitPath())){
|
|
| 436 |
+ try {
|
|
| 437 |
+ int grade = 0; |
|
| 438 |
+ int classCode = 0; |
|
| 439 |
+ String stGrade = null; |
|
| 440 |
+ String stClass = null; |
|
| 441 |
+ |
|
| 442 |
+ String[] pathArr = userInfo.getOrgunit().getOrgUnitPath().split("/");
|
|
| 443 |
+ for(int i = pathArr.length-1; i >= 0; i--) {
|
|
| 444 |
+ if(pathArr[i].trim().endsWith("학년")) {
|
|
| 445 |
+ String[] gradeArr = pathArr[i].split(Pattern.quote(","));
|
|
| 446 |
+ grade = Integer.parseInt(gradeArr[0].replaceAll("학년", "").trim());
|
|
| 447 |
+ } else if(pathArr[i].trim().endsWith("반")) {
|
|
| 448 |
+ classCode = Integer.parseInt(pathArr[i].replaceAll("반", "").trim());
|
|
| 449 |
+ } |
|
| 450 |
+ } |
|
| 451 |
+ |
|
| 452 |
+ if(grade != -1) {
|
|
| 453 |
+ stGrade = String.valueOf(grade); |
|
| 454 |
+ login.setStGrade(stGrade); |
|
| 455 |
+ } |
|
| 456 |
+ if(classCode != -1) {
|
|
| 457 |
+ stClass = String.valueOf(classCode); |
|
| 458 |
+ login.setStClass(stClass); |
|
| 459 |
+ } |
|
| 460 |
+ |
|
| 461 |
+ } catch(NumberFormatException ex) {
|
|
| 462 |
+ log.debug("NumberFormatException:" + ex.getMessage());
|
|
| 463 |
+ } catch(IllegalArgumentException ex) {
|
|
| 464 |
+ log.debug("IllegalArgumentException:" + ex.getMessage());
|
|
| 465 |
+ } catch(Exception ex) {
|
|
| 466 |
+ log.debug("Exception:" + ex.getMessage());
|
|
| 467 |
+ } |
|
| 468 |
+ } |
|
| 469 |
+ |
|
| 470 |
+ String enpassword = EgovCrypTo.encryptPassword(login.getPassword()); |
|
| 471 |
+ login.setPassword(enpassword); |
|
| 472 |
+ |
|
| 473 |
+ String schulGradeCode = "SCH_99"; |
|
| 474 |
+ if(!EgovStringUtil.isEmpty(login.getSchulNm())) {
|
|
| 475 |
+ if(login.getSchulNm().indexOf("유치원") != -1) {
|
|
| 476 |
+ schulGradeCode = "SCH_01"; |
|
| 477 |
+ } else if(login.getSchulNm().indexOf("초등") != -1) {
|
|
| 478 |
+ schulGradeCode = "SCH_02"; |
|
| 479 |
+ } else if(login.getSchulNm().indexOf("고등") != -1) {
|
|
| 480 |
+ schulGradeCode = "SCH_04"; |
|
| 481 |
+ } else if(login.getSchulNm().indexOf("중") != -1) {
|
|
| 482 |
+ schulGradeCode = "SCH_03"; |
|
| 483 |
+ } |
|
| 484 |
+ } |
|
| 485 |
+ login.setSchulGradeCode(schulGradeCode); |
|
| 486 |
+ |
|
| 487 |
+ //학교 등록 작업 해야 함 |
|
| 488 |
+ //schulGradeCode등등 넣고~ |
|
| 489 |
+ |
|
| 490 |
+ |
|
| 491 |
+ //회원 등록 |
|
| 492 |
+ UserManageVO userManageVO = new UserManageVO(); |
|
| 493 |
+ userManageVO.setUserId(login.getId()); |
|
| 494 |
+ userManageVO.setPassword(login.getPassword()); |
|
| 495 |
+ userManageVO.setUserNm(login.getName()); |
|
| 496 |
+ userManageVO.setUserSeCode(login.getUserSeCode()); |
|
| 497 |
+ userManageVO.setEmailAdres(login.getEmail()); |
|
| 498 |
+ userManageVO.setStGrade(login.getStGrade()); |
|
| 499 |
+ userManageVO.setStClass(login.getStClass()); |
|
| 500 |
+ userManageVO.setSchulCode(login.getSchulCode()); |
|
| 501 |
+ userManageVO.setSchulNm(login.getSchulNm()); |
|
| 502 |
+ userManageVO.setSearchCondition("ID");
|
|
| 503 |
+ userManageVO.setSid(login.getSid()); |
|
| 504 |
+ userManageVO.setSnsTyCode("WHALE");
|
|
| 505 |
+ userManageVO.setResultMssage(str); |
|
| 506 |
+ |
|
| 507 |
+ UserManageVO member = userManageService.selectUser(userManageVO); |
|
| 508 |
+ if(member != null){
|
|
| 509 |
+ member.setEsntlId(member.getEsntlId()); |
|
| 510 |
+ userManageService.updateManageUser(userManageVO); |
|
| 511 |
+ }else{
|
|
| 512 |
+ String esntlId = idgenService.getNextStringId(); |
|
| 513 |
+ userManageVO.setEsntlId(esntlId); |
|
| 514 |
+ userManageService.insertUser(userManageVO); |
|
| 515 |
+ } |
|
| 516 |
+ } |
|
| 517 |
+ |
|
| 518 |
+ return login; |
|
| 519 |
+ } |
|
| 520 |
+ |
|
| 521 |
+ |
|
| 285 | 522 |
} |
--- base/src/main/java/egovframework/module/uss/umt/service/UserManageVO.java
+++ base/src/main/java/egovframework/module/uss/umt/service/UserManageVO.java
... | ... | @@ -155,6 +155,14 @@ |
| 155 | 155 |
//검색-권한 |
| 156 | 156 |
private String searchUserSeCode; |
| 157 | 157 |
|
| 158 |
+ //웨일-sid |
|
| 159 |
+ private String sid; |
|
| 160 |
+ |
|
| 161 |
+ //sns타입 |
|
| 162 |
+ private String snsTyCode; |
|
| 163 |
+ |
|
| 164 |
+ //SNS결과 메세지 |
|
| 165 |
+ private String resultMssage; |
|
| 158 | 166 |
|
| 159 | 167 |
public String getCredtId() {
|
| 160 | 168 |
return credtId; |
... | ... | @@ -555,4 +563,28 @@ |
| 555 | 563 |
public void setSearchUserSeCode(String searchUserSeCode) {
|
| 556 | 564 |
this.searchUserSeCode = searchUserSeCode; |
| 557 | 565 |
} |
| 566 |
+ |
|
| 567 |
+ public String getSid() {
|
|
| 568 |
+ return sid; |
|
| 569 |
+ } |
|
| 570 |
+ |
|
| 571 |
+ public void setSid(String sid) {
|
|
| 572 |
+ this.sid = sid; |
|
| 573 |
+ } |
|
| 574 |
+ |
|
| 575 |
+ public String getSnsTyCode() {
|
|
| 576 |
+ return snsTyCode; |
|
| 577 |
+ } |
|
| 578 |
+ |
|
| 579 |
+ public void setSnsTyCode(String snsTyCode) {
|
|
| 580 |
+ this.snsTyCode = snsTyCode; |
|
| 581 |
+ } |
|
| 582 |
+ |
|
| 583 |
+ public String getResultMssage() {
|
|
| 584 |
+ return resultMssage; |
|
| 585 |
+ } |
|
| 586 |
+ |
|
| 587 |
+ public void setResultMssage(String resultMssage) {
|
|
| 588 |
+ this.resultMssage = resultMssage; |
|
| 589 |
+ } |
|
| 558 | 590 |
} |
--- base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageMapper.java
+++ base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageMapper.java
... | ... | @@ -81,4 +81,9 @@ |
| 81 | 81 |
//임시사용자 데이터삭제한다. |
| 82 | 82 |
public int deleteUserTmp(UserManageVO userManageVO) throws Exception; |
| 83 | 83 |
|
| 84 |
+ //SNS정보 등록 |
|
| 85 |
+ public void insertSnsInfo(UserManageVO userManageVO) throws Exception; |
|
| 86 |
+ |
|
| 87 |
+ //SNS정보 삭제 |
|
| 88 |
+ public void deleteSnsInfo(UserManageVO userManageVO) throws Exception; |
|
| 84 | 89 |
} |
--- base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageServiceImpl.java
+++ base/src/main/java/egovframework/module/uss/umt/service/impl/UserManageServiceImpl.java
... | ... | @@ -110,14 +110,25 @@ |
| 110 | 110 |
//이메일 |
| 111 | 111 |
if(!EgovStringUtil.isEmpty(userManageVO.getEmail1()) && !EgovStringUtil.isEmpty(userManageVO.getEmail2())) {
|
| 112 | 112 |
userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmail1() + "@" + userManageVO.getEmail2(), null)); |
| 113 |
+ }else if(!EgovStringUtil.isEmpty(userManageVO.getEmailAdres())){
|
|
| 114 |
+ userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmailAdres(), null)); |
|
| 113 | 115 |
} |
| 114 | 116 |
|
| 115 | 117 |
userManageMapper.insertUser(userManageVO); |
| 118 |
+ |
|
| 119 |
+ //SNS 결과 정보 |
|
| 120 |
+ if(!EgovStringUtil.isEmpty(userManageVO.getSnsTyCode()) && !EgovStringUtil.isEmpty(userManageVO.getResultMssage())){
|
|
| 121 |
+ userManageMapper.deleteSnsInfo(userManageVO); |
|
| 122 |
+ userManageMapper.insertSnsInfo(userManageVO); |
|
| 123 |
+ } |
|
| 116 | 124 |
} |
| 117 | 125 |
|
| 118 | 126 |
|
| 119 | 127 |
//기 등록된 사용자 중 검색조건에 맞는 사용자의 정보를 데이터베이스에서 읽어와 화면에 출력 |
| 120 | 128 |
public UserManageVO selectUser(UserManageVO userManageVO) throws Exception {
|
| 129 |
+ if(!EgovStringUtil.isEmpty(userManageVO.getUserId()) && "ID".equals(userManageVO.getSearchCondition())){
|
|
| 130 |
+ userManageVO.setUserId(CryptoUtil.encrypt(userManageVO.getUserId(), null)); |
|
| 131 |
+ } |
|
| 121 | 132 |
return userManageMapper.selectUser(userManageVO); |
| 122 | 133 |
} |
| 123 | 134 |
|
... | ... | @@ -229,6 +240,14 @@ |
| 229 | 240 |
//이메일 |
| 230 | 241 |
if(!EgovStringUtil.isEmpty(userManageVO.getEmail1()) && !EgovStringUtil.isEmpty(userManageVO.getEmail2())) {
|
| 231 | 242 |
userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmail1() + "@" + userManageVO.getEmail2(), null)); |
| 243 |
+ }else if(!EgovStringUtil.isEmpty(userManageVO.getEmailAdres())){
|
|
| 244 |
+ userManageVO.setEmailAdres(CryptoUtil.encrypt(userManageVO.getEmailAdres(), null)); |
|
| 245 |
+ } |
|
| 246 |
+ |
|
| 247 |
+ //SNS 결과 정보 |
|
| 248 |
+ if(!EgovStringUtil.isEmpty(userManageVO.getSnsTyCode()) && !EgovStringUtil.isEmpty(userManageVO.getResultMssage())){
|
|
| 249 |
+ userManageMapper.deleteSnsInfo(userManageVO); |
|
| 250 |
+ userManageMapper.insertSnsInfo(userManageVO); |
|
| 232 | 251 |
} |
| 233 | 252 |
|
| 234 | 253 |
return userManageMapper.updateManageUser(userManageVO); |
--- base/src/main/resources/egovframework/egovProps/globals.properties
+++ base/src/main/resources/egovframework/egovProps/globals.properties
... | ... | @@ -30,7 +30,7 @@ |
| 30 | 30 |
|
| 31 | 31 |
# \uC0AC\uC6A9 \uB3C4\uBA54\uC778 (http://127.0.0.1:8080) - IBM(DB2) : 9080port |
| 32 | 32 |
# \uB3C4\uBA54\uC778 \uC0AC\uC6A9\uC2DC tomcat\uC5D0 Path \uBD99\uC74C cait |
| 33 |
-Globals.Domain = http://dev.dreamerguy.com |
|
| 33 |
+Globals.Domain = http://devcms.foxedu.co.kr |
|
| 34 | 34 |
|
| 35 | 35 |
# 2\uB2E8\uACC4 \uAC8C\uC2DC\uD310 \uCD94\uAC00 \uAE30\uB2A5 (\uB313\uAE00, \uB9CC\uC871\uB3C4\uC870\uC0AC, \uC2A4\uD06C\uB7A9) |
| 36 | 36 |
Globals.addedOptions = true |
... | ... | @@ -53,4 +53,6 @@ |
| 53 | 53 |
#\uC5D1\uC140\uD15C\uD50C\uB9BF \uD3F4\uB354\uBA85 |
| 54 | 54 |
Globals.ExcelTemplateDirectory= xls |
| 55 | 55 |
|
| 56 |
- |
|
| 56 |
+#\uC6E8\uC77C \uD0A4 |
|
| 57 |
+Globals.ClientId = _pYUgL8zHLleCJEUDJyF |
|
| 58 |
+Globals.ClientSecret = aHnflBEJQN(파일 끝에 줄바꿈 문자 없음) |
--- base/src/main/resources/egovframework/mapper/mysql/uss/umt/UserManage_SQL.xml
+++ base/src/main/resources/egovframework/mapper/mysql/uss/umt/UserManage_SQL.xml
... | ... | @@ -59,21 +59,30 @@ |
| 59 | 59 |
|
| 60 | 60 |
<select id="selectUser" parameterType="egovframework.module.uss.umt.service.UserManageVO" resultType="egovframework.module.uss.umt.service.UserManageVO" resultMap="user"> |
| 61 | 61 |
SELECT |
| 62 |
- ESNTL_ID |
|
| 63 |
- , A.USER_ID |
|
| 64 |
- , A.USER_NM |
|
| 65 |
- , A.USER_SE_CODE |
|
| 66 |
- , ST_NUMBER |
|
| 67 |
- , ST_GRADE |
|
| 68 |
- , MOBLPHON_NO |
|
| 69 |
- , EMAIL_ADRES |
|
| 70 |
- , CONFM_AT |
|
| 71 |
- , CONFM_PNTTM |
|
| 72 |
- , FRST_REGISTER_PNTTM |
|
| 73 |
- , PHOTO_STRE_FILE_NM |
|
| 62 |
+ ESNTL_ID |
|
| 63 |
+ , A.USER_ID |
|
| 64 |
+ , A.USER_NM |
|
| 65 |
+ , A.USER_SE_CODE |
|
| 66 |
+ , ST_NUMBER |
|
| 67 |
+ , ST_GRADE |
|
| 68 |
+ , MOBLPHON_NO |
|
| 69 |
+ , EMAIL_ADRES |
|
| 70 |
+ , CONFM_AT |
|
| 71 |
+ , CONFM_PNTTM |
|
| 72 |
+ , FRST_REGISTER_PNTTM |
|
| 73 |
+ , PHOTO_STRE_FILE_NM |
|
| 74 | 74 |
FROM comtnmber A |
| 75 | 75 |
WHERE A.DELETE_AT = 'N' |
| 76 |
- AND A.ESNTL_ID = #{esntlId}
|
|
| 76 |
+ <choose> |
|
| 77 |
+ <when test='searchCondition == "ID"'> |
|
| 78 |
+ AND A.USER_ID = #{userId}
|
|
| 79 |
+ </when> |
|
| 80 |
+ <otherwise> |
|
| 81 |
+ AND A.ESNTL_ID = #{esntlId}
|
|
| 82 |
+ </otherwise> |
|
| 83 |
+ </choose> |
|
| 84 |
+ |
|
| 85 |
+ |
|
| 77 | 86 |
</select> |
| 78 | 87 |
|
| 79 | 88 |
<insert id="insertUser"> |
... | ... | @@ -119,7 +128,7 @@ |
| 119 | 128 |
, #{credtId}
|
| 120 | 129 |
, #{crtfctDn}
|
| 121 | 130 |
, #{crtfctSerial}
|
| 122 |
- , #{siteId}
|
|
| 131 |
+ , IFNULL(NULLIF(#{siteId},''),'SITE_000000000000001')
|
|
| 123 | 132 |
, #{stGrade}
|
| 124 | 133 |
, #{stClass}
|
| 125 | 134 |
, #{stNumber}
|
... | ... | @@ -375,4 +384,21 @@ |
| 375 | 384 |
WHERE SITE_ID=#{siteId}
|
| 376 | 385 |
</delete> |
| 377 | 386 |
|
| 387 |
+ <insert id="insertSnsInfo"> |
|
| 388 |
+ INSERT INTO comtnmbersns( |
|
| 389 |
+ SNS_TY_CODE |
|
| 390 |
+ , ESNTL_ID |
|
| 391 |
+ , RESULT_MSSAGE |
|
| 392 |
+ ) VALUES ( |
|
| 393 |
+ #{snsTyCode}
|
|
| 394 |
+ , #{esntlId}
|
|
| 395 |
+ , #{resultMssage}
|
|
| 396 |
+ ) |
|
| 397 |
+ </insert> |
|
| 398 |
+ |
|
| 399 |
+ <delete id="deleteSnsInfo"> |
|
| 400 |
+ DELETE FROM comtnmbersns |
|
| 401 |
+ WHERE ESNTL_ID = #{esntlId}
|
|
| 402 |
+ AND SNS_TY_CODE = #{snsTyCode}
|
|
| 403 |
+ </delete> |
|
| 378 | 404 |
</mapper> |
--- base/src/main/webapp/WEB-INF/jsp/egovframework/str/cre/lyt/sourc/sit/LYTSRC_0000000000001/sourcHead.jsp
+++ base/src/main/webapp/WEB-INF/jsp/egovframework/str/cre/lyt/sourc/sit/LYTSRC_0000000000001/sourcHead.jsp
... | ... | @@ -18,5 +18,12 @@ |
| 18 | 18 |
<a href="/uss/umt/cmm/EgovUserConfirmView.do?trgtPge=update">정보변경</a> |
| 19 | 19 |
</c:otherwise> |
| 20 | 20 |
</c:choose> |
| 21 |
+ |
|
| 22 |
+ <a href="/api/whale/auth/whaleLoginUrl.do">웨일 로그인</a> |
|
| 23 |
+ |
|
| 24 |
+ <c:if test="${not empty USER_INFO.id}">
|
|
| 25 |
+ <br> |
|
| 26 |
+ ${USER_INFO.id}
|
|
| 27 |
+ </c:if> |
|
| 21 | 28 |
</body> |
| 22 | 29 |
</html> |
Add a comment
Delete comment
Once you delete this comment, you won't be able to recover it. Are you sure you want to delete this comment?