Skip to content

Commit

Permalink
Merge pull request #2 from YangSiJun528/renew/to-2.0.0
Browse files Browse the repository at this point in the history
2.0.0 버전 개발
  • Loading branch information
YangSiJun528 authored Aug 12, 2023
2 parents 199b735 + 6b65d0b commit 146dc81
Show file tree
Hide file tree
Showing 33 changed files with 620 additions and 360 deletions.
30 changes: 14 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,15 @@

- - -

[MSG.Team](https://github.com/GSM-MSG)에서 제공하는 **GAuth**(광주소프트웨어마이스터고등학교 교내 OAuth 서비스)를 **Spring Security**(+ Spring
[MSG.Team](https://github.com/GSM-MSG)에서 제공하는 **GAuth**(광주소프트웨어마이스터고등학교 교내 OAuth2 서비스)를 **Spring Security**(+ Spring
Boot) 환경에서 쉽게 사용할 수 있도록 **확장된 기능을 제공하는 모듈**입니다.

## [설명](#설명)

GAuth는 좋은 서비스이지만, Spring Security 환경에서 사용하기에는 어려움이 있습니다.
이 모듈은 Spring Security의 기능을 활용하여 GAuth를 쉽게 사용할 수 있도록 개발되었습니다.
GAuth를 OAuth와 유사한 방식으로 적용하면서 많은 노력을 줄일 수 있습니다.
GAuth를 Spring 환경에서 지원하는 OAuth2와 유사한 방식으로 편리하게 사용할 수 있습니다.
또한, 기존의 자체로그인, formLogin, OAuth2 인증과도 문제없이 호환됩니다.

이 모듈에서 제공하는 주요한 기능은 아래와 같습니다.

- GAuth 로그인 페이지 자동 리다이렉트
- GAuth 코드를 입력받아 GAuth 사용자 정보 가져오기
- GAuth 인증 성공/실패 시 핸들러 적용
- 로그인/인증/리다이렉트 주소를 및 핸들러를 간편하게 지정 가능

<details>
<summary>간단한 사용 방법 예시</summary>

Expand Down Expand Up @@ -67,18 +59,23 @@ public class SecurityConfig {

### 주의점

해당 모듈은 아래와 같은 버전부터 지원됩니다.
해당 모듈을 사용하기 위해선 아래와 같은 제약사항을 만족해야 합니다.

#### 필수 의존성
아래 의존성을 필요로 합니다.
- Spring Boot Starter Web
- Spring Boot Starter Security

- Java 17 이상
- Spring Boot 3.1.0 이상
#### 2.x 버전의 경우

또한, Spring MVC 환경을 기준으로 제작되었으며 WebFlux와 같은 Non-Blocking 서비스에선 잘 동작하지 않을 수 있습니다. (0.0.1 기준)
- Java 11 이상
- Spring Boot 2.x (3.x 버전은 사용 불가)

## [시작하기](#시작하기)

### [모듈 불러오기](#모듈-불러오기)

Step 1. 빌드 파일에 JitPack 리포지토리 추가하기
Step 1. 빌드 파일에 JitPack Repository 추가하기
Step 2. 의존성 추가

#### gradle
Expand Down Expand Up @@ -130,7 +127,8 @@ dependencies {

## [버전 별 가이드](#버전-별-가이드)

- #### [1.0.1](docs/guide/ver_100/index.md)
- #### [1.0.1 - Deprecated](docs/guide/ver_101/index.md)
- #### [2.0.0](docs/guide/ver_200/index.md)

## [기여하기](#기여하기)

Expand Down
48 changes: 0 additions & 48 deletions build.gradle

This file was deleted.

60 changes: 60 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
plugins {
java
`java-library`
`maven-publish`
id("org.springframework.boot") version "2.7.14"
id("io.spring.dependency-management") version "1.0.15.RELEASE"
}

tasks {
named<Jar>("bootJar") {
enabled = false
}

named<Jar>("jar") {
enabled = true
archiveClassifier.set("")
duplicatesStrategy = DuplicatesStrategy.WARN
}
}


group = "dev.yangsijun"
version = "2.0.0-alpha-3"

java {
sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11
withSourcesJar()
withJavadocJar()
}

repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") }
}

dependencies {
api("com.github.GSM-MSG:GAuth-SDK-Java:v2.0.1")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
testImplementation("org.springframework.boot:spring-boot-starter-test")
testImplementation("org.springframework.security:spring-security-test")
}

tasks.withType<Test> {
useJUnitPlatform()
}

publishing {
publications {
create<MavenPublication>("maven") {
groupId = group.toString()
artifactId = rootProject.name
version = version

from(components["java"])
}
}
}
134 changes: 134 additions & 0 deletions docs/guide/ver_200/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
# Guide - ver. 2.0.0

* [Guide - ver. 2.0.0](#guide---ver-200)
* [시작하기 전에...](#시작하기-전에)
* [시작하기](#시작하기)
* [1. 프로젝트 만들기](#1-프로젝트-만들기)
* [2. 모듈 가져오기](#2-모듈-가져오기)
* [3. 환경 설정하기](#3-환경-설정하기)
* [Properties 정의하기](#properties-정의하기)
* [예시](#예시)
* [4. Security Configuration에 적용하기](#4-security-configuration에-적용하기)
* [GAuthLoginConfigurer 옵션](#GAuthLoginConfigurer-옵션)
* [예시 1](#예시-1)
* [예시 2](#예시-2)

<!-- TOC -->

## 시작하기 전에...

1. GAuth-spring-boot-starter 모듈은 2가지 의존성을 필요로 합니다.
- `spring-boot-starter-security`
- `spring-boot-starter-web`

2. GAuth 인증을 사용하기 위해 서비스를 등록하야 합니다.
[GAuth.co.kr](GAuth.co.kr)에 접속하여 서비스를 등록할 수 있습니다.

## 시작하기

### 1. 프로젝트 만들기

`spring-boot-starter-security`, `spring-boot-starter-web` 의존성을 가지는 Spring Boot 프로젝트를 준비합니다.

### 2. 모듈 가져오기

모듈을 가져옵니다. 자세한 내용은 [README.md의 모듈 불러오기](../../../README.md#모듈-불러오기)를 확인하세요.

### 3. 환경 설정하기

#### Properties 정의하기

`application.properties` 혹은 `application.yml`에 GAuth 관련 설정을 정의해야 합니다.

- gauth.client-id
- gauth.client-secret
- gauth.redirect-uri

##### 예시

application.properties

```properties
gauth.security.client-id:1234567890qwertyuiop
gauth.security.client-secret:1234567890qwertyuiop1234567890qwertyuiop
gauth.security.redirect-uri:http://localhost:8080/login/gauth/code
```

### 4. Security Configuration에 적용하기

Spring Security의 Configuration에 관한 내용은 [공식문서](https://docs.spring.io/spring-security/reference/index.html)를 참고하세요.

Spring Security의 SecurityFilterChain에 Gauth 설정을 위한 `GAuthLoginConfigurer`를 등록해야 합니다.

#### GAuthLoginConfigurer 옵션

- `loginPageUrl(String loginPageUrl)`
- GAuth 로그인 페이지로 리다이렉트되는 주소를 설정합니다.
- default: `/gauth/authorization`
- `loginProcessingUrl(String loginProcessingUrl)`
- GAuth 인증 코드를 받아 처리하는 필터에 접근하는 주소를 설정합니다.
- default: `/login/code/gauth`
- `successHandler(AuthenticationSuccessHandler successHandler)`
- GAuth 인증을 성공했을 때, 실행되는 `AuthenticationSuccessHandler`를 정의합니다.
- default: 서버의 root 주소로 리다이렉트 됩니다.
- `failureHandler(AuthenticationFailureHandler failureHandler)`
- GAuth 인증을 실패했을 때, 실행되는 `AuthenticationFailureHandler`를 정의합니다.
- default: 인증이 실패했다는 json과 함께 401 HTTP Status를 반환합니다.
- `disable()`
- GAuth 인증을 사용하지 않도록 설정합니다.

#### 예시 1

간단한 등록만으로 GAuth 인증을 사용할 수 있습니다.

```java

@Configuration
public class SecurityConfig {
private final GAuthLoginConfigurer gatuh;

public SecurityConfig(GAuthLoginConfigurer gAuthLoginConfigurer) {
this.gatuh = gAuthLoginConfigurer;
}
// ...

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ...
.apply(gatuh);
return http.build();
}
}
```

#### 예시 2

Endpoint나 Handler를 Custom 할 수 있습니다.

```java

@Configuration
public class SecurityConfig {
private final GAuthLoginConfigurer gatuh;

public SecurityConfig(GAuthLoginConfigurer gAuthLoginConfigurer) {
this.gatuh = gAuthLoginConfigurer;
}
// ...

@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ...
.apply(gatuh
.loginPageUrl("/to-gauth-login-page")
.loginProcessingUrl("/login/code/gauth")
.successHandler(
new SimpleUrlAuthenticationSuccessHandler("/success"))
.failureHandler(
new SimpleUrlAuthenticationFailureHandler("/failure")));
return http.build();
}
}
```
2 changes: 1 addition & 1 deletion jitpack.yml
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
jdk:
- openjdk17
- openjdk11
1 change: 0 additions & 1 deletion settings.gradle

This file was deleted.

1 change: 1 addition & 0 deletions settings.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
rootProject.name = "GAuth-spring-boot-starter"
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,37 @@
import dev.yangsijun.gauth.core.user.GAuthUser;
import dev.yangsijun.gauth.userinfo.GAuthAuthorizationRequest;
import dev.yangsijun.gauth.userinfo.GAuthUserService;

import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetailsService;

import java.util.Map;

/**
* An {@link AuthenticationProvider} implementation that retrieves GAuth user information from a {@link GAuthUserService}.
* @since 2.0.0
* @author Yang Sijun
*/
public class GAuthAuthenticationProvider implements AuthenticationProvider {

private final GAuthUserService<GAuthAuthorizationRequest, GAuthUser> userService;

public GAuthAuthenticationProvider(GAuthUserService<GAuthAuthorizationRequest, GAuthUser> userService) {
public GAuthAuthenticationProvider(
GAuthUserService<GAuthAuthorizationRequest, GAuthUser> userService) {
this.userService = userService;
}

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
GAuthAuthenticationToken authenticationToken = (GAuthAuthenticationToken) authentication;
Map<String, Object> additionalParameters = authenticationToken.getAdditionalParameters();
GAuthUser gAuthUser = userService.loadUser(new GAuthAuthorizationRequest(
authenticationToken.getCode(), authenticationToken.getgauthRegistration(), additionalParameters));
GAuthAuthenticationToken authenticationResult = new GAuthAuthenticationToken(gAuthUser.getAuthorities(),
authenticationToken.getCode(),
authenticationToken.getgauthRegistration(),
gAuthUser,
gAuthUser.getGAuthToken()
GAuthUser gAuthUser = userService.loadUser(
new GAuthAuthorizationRequest(authenticationToken.getCode(), additionalParameters)
);
GAuthAuthenticationToken authenticationResult =
new GAuthAuthenticationToken(gAuthUser.getAuthorities(), authenticationToken.getCode(), gAuthUser);
return authenticationResult;
}

Expand Down
Loading

0 comments on commit 146dc81

Please sign in to comment.