ข้ามไปยังเนื้อหาหลัก

Spring Cloud Gateway

ตัวอย่าง casdoor-springcloud-gateway-example คือตัวอย่างของวิธีการใช้ casdoor-spring-boot-starter เป็นปลั๊กอิน OAuth2 ใน Spring Cloud Gateway. ขั้นตอนการใช้งานได้รับการอธิบายด้านล่าง.

ขั้นตอนที่ 1: ติดตั้ง Casdoor

ก่อนอื่น, Casdoor ควรถูกติดตั้ง. คุณสามารถอ้างอิงเอกสารการติดตั้ง Casdoor อย่างเป็นทางการสำหรับ การติดตั้งเซิร์ฟเวอร์. กรุณาติดตั้ง Casdoor ของคุณใน โหมดการผลิต.

หลังจากการติดตั้งที่สำเร็จ, คุณต้องแน่ใจว่าต่อไปนี้:

  • เปิดเบราว์เซอร์ที่คุณชอบและเยี่ยมชม http://localhost:8000. คุณจะเห็นหน้าเข้าสู่ระบบของ Casdoor.
  • ใส่ admin และ 123 เพื่อทดสอบว่าฟังก์ชันการเข้าสู่ระบบทำงานได้ดีหรือไม่.

หลังจากนั้น, คุณสามารถรวดเร็วในการทำหน้าเข้าสู่ระบบที่ใช้ Casdoor ในแอปของคุณโดยใช้ขั้นตอนต่อไปนี้.

ขั้นตอนที่ 2: เริ่มต้น Spring Cloud Gateway

คุณสามารถใช้โค้ดจากตัวอย่างนี้โดยตรงหรือผสมมันกับโค้ดธุรกิจของคุณเอง.

คุณต้องการบริการเกตเวย์และอย่างน้อยหนึ่งบริการธุรกิจ. ในตัวอย่างนี้, casdoor-gateway เป็นบริการเกตเวย์และ casdoor-api เป็นบริการธุรกิจ.

ขั้นตอนที่ 3: รวมการพึ่งพา

เพิ่มการพึ่งพา casdoor-spring-boot-starter ในโปรเจ็กต์ Spring Cloud Gateway ของคุณ.

สำหรับ Apache Maven:

/casdoor-gateway/pom.xml
<!-- https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter -->
<dependency>
<groupId>org.casbin</groupId>
<artifactId>casdoor-spring-boot-starter</artifactId>
<version>1.x.y</version>
</dependency>

สำหรับ Gradle:

// https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter
implementation group: 'org.casbin', name: 'casdoor-spring-boot-starter', version: '1.x.y'

ขั้นตอนที่ 4: กำหนดค่าคุณสมบัติของคุณ

การเริ่มต้นต้องการ 6 พารามิเตอร์, ทั้งหมดเป็นประเภทสตริง.

ชื่อ (ตามลำดับ)ที่จำเป็นคำอธิบาย
endpointใช่URL เซิร์ฟเวอร์ Casdoor, เช่น http://localhost:8000
clientIdใช่Application.client_id
clientSecretใช่Application.client_secret
certificateใช่Application.certificate
organizationNameใช่Application.organization
applicationNameไม่Application.name

คุณสามารถใช้คุณสมบัติ Java หรือไฟล์ YAML เพื่อเริ่มต้นพารามิเตอร์เหล่านี้.

สำหรับคุณสมบัติ:

casdoor.endpoint=http://localhost:8000
casdoor.clientId=<client-id>
casdoor.clientSecret=<client-secret>
casdoor.certificate=<certificate>
casdoor.organizationName=built-in
casdoor.applicationName=app-built-in

สำหรับ YAML:

casdoor:
endpoint: http://localhost:8000
client-id: <client-id>
client-secret: <client-secret>
certificate: <certificate>
organization-name: built-in
application-name: app-built-in

นอกจากนี้, คุณต้องกำหนดค่าการเราท์เกตเวย์. สำหรับ YAML:

spring:
application:
name: casdoor-gateway
cloud:
gateway:
routes:
- id: api-route
uri: http://localhost:9091
predicates:
- Path=/api/**

ขั้นตอนที่ 5: เพิ่ม CasdoorAuthFilter

เพิ่มคลาสการทำงานของอินเตอร์เฟซ GlobalFilter ไปยังเกตเวย์สำหรับการตรวจสอบตัวตน, เช่น CasdoorAuthFilter ที่ใช้ในตัวอย่างนี้.

หากการตรวจสอบไม่ผ่าน, มันจะส่งรหัสสถานะ 401 กลับไปยังฝั่งหน้าเว็บเพื่อเปลี่ยนเส้นทางพวกเขาไปยังหน้าเข้าสู่ระบบ.

@Component
public class CasdoorAuthFilter implements GlobalFilter, Ordered {

private static final Logger LOGGER = LoggerFactory.getLogger(CasdoorAuthFilter.class);

@Override public int getOrder() {
return 0;
}

@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return exchange.getSession().flatMap(webSession -> {
CasdoorUser user = webSession.getAttribute("casdoorUser");
if (user != null) {
return chain.filter(exchange);
}
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type", "application/json");
return response.setComplete();
});
}
}

ขั้นตอนที่ 6: รับบริการและใช้งานมัน

ตอนนี้มีบริการ 5 บริการ: CasdoorAuthService, CasdoorUserService, CasdoorEmailService, CasdoorSmsService, และ CasdoorResourceService.

คุณสามารถสร้างพวกเขาได้ดังต่อไปนี้ในโปรเจ็กต์เกตเวย์.

@Resource
private CasdoorAuthService casdoorAuthService;

เมื่อคุณต้องการการตรวจสอบสิทธิ์สำหรับการเข้าถึงแอปของคุณ, คุณสามารถส่ง URL เป้าหมายและเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบที่ Casdoor ให้บริการ.

กรุณาตรวจสอบว่าคุณได้เพิ่ม URL ย้อนกลับ (เช่น, http://localhost:9090/callback) ในการกำหนดค่าแอปล่วงหน้า.

@RequestMapping("login")
public Mono<String> login() {
return Mono.just("redirect:" + casdoorAuthService.getSigninUrl("http://localhost:9090/callback"));
}

หลังจากการตรวจสอบที่สำเร็จโดย Casdoor, มันจะถูกเปลี่ยนเส้นทางกลับไปยังแอปของคุณพร้อมกับรหัสและสถานะ. คุณสามารถรับรหัสและเรียกใช้เมธอด getOAuthToken เพื่อแยกออกเป็นโทเค็น JWT.

CasdoorUser มีข้อมูลพื้นฐานเกี่ยวกับผู้ใช้ที่ Casdoor ให้มา. คุณสามารถใช้มันเป็นคำหลักเพื่อตั้งค่าเซสชันในแอปของคุณ.

@RequestMapping("callback")
public Mono<String> callback(String code, String state, ServerWebExchange exchange) {
String token = "";
CasdoorUser user = null;
try {
token = casdoorAuthService.getOAuthToken(code, state);
user = casdoorAuthService.parseJwtToken(token);
} catch(CasdoorAuthException e) {
e.printStackTrace();
}
CasdoorUser finalUser = user;
return exchange.getSession().flatMap(session -> {
session.getAttributes().put("casdoorUser", finalUser);
return Mono.just("redirect:/");
});
}

ตัวอย่างของ API แสดงด้านล่าง.

  • CasdoorAuthService
    • String token = casdoorAuthService.getOAuthToken(code, "app-built-in");
    • CasdoorUser casdoorUser = casdoorAuthService.parseJwtToken(token);
  • CasdoorUserService
    • CasdoorUser casdoorUser = casdoorUserService.getUser("admin");
    • CasdoorUser casdoorUser = casdoorUserService.getUserByEmail("admin@example.com");
    • CasdoorUser[] casdoorUsers = casdoorUserService.getUsers();
    • CasdoorUser[] casdoorUsers = casdoorUserService.getSortedUsers("created_time", 5);
    • int count = casdoorUserService.getUserCount("0");
    • CasdoorResponse response = casdoorUserService.addUser(user);
    • CasdoorResponse response = casdoorUserService.updateUser(user);
    • CasdoorResponse response = casdoorUserService.deleteUser(user);
  • CasdoorEmailService
    • CasdoorResponse response = casdoorEmailService.sendEmail(title, content, sender, receiver);
  • CasdoorSmsService
    • CasdoorResponse response = casdoorSmsService.sendSms(randomCode(), receiver);
  • CasdoorResourceService
    • CasdoorResponse response = casdoorResourceService.uploadResource(user, tag, parent, fullFilePath, file);
    • CasdoorResponse response = casdoorResourceService.deleteResource(file.getName());

ขั้นตอนที่ 7: รีสตาร์ทโปรเจ็กต์

หลังจากเริ่มโปรเจ็กต์, เปิดเบราว์เซอร์ที่คุณชอบและเยี่ยมชม http://localhost:9090. จากนั้นคลิกปุ่มใด ๆ ที่ขอทรัพยากรจาก casdoor-api.

ดัชนี

ตรรกะการตรวจสอบสิทธิ์ของเกตเวย์จะถูกเรียกใช้. เนื่องจากคุณยังไม่ได้เข้าสู่ระบบ, คุณจะถูกเปลี่ยนเส้นทางไปยังหน้าเข้าสู่ระบบ. คลิกปุ่มเข้าสู่ระบบ.

toLogin

คุณสามารถเห็นแพลตฟอร์มการเข้าสู่ระบบแบบรวมของ Casdoor.

เข้าสู่ระบบ

หลังจากเข้าสู่ระบบสำเร็จ, คุณจะถูกเปลี่ยนเส้นทางไปยังหน้าหลัก. ตอนนี้คุณสามารถคลิกปุ่มใด ๆ.

index-ok

อีกทั้ง

คุณสามารถสำรวจโปรเจ็กต์/เอกสารต่อไปนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับการรวม Java กับ Casdoor.