Перейти до основного вмісту

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 параметрів, всі вони мають тип string.

Назва (за порядком)НеобхідноОпис
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.

Ви можете створити їх таким чином у проекті Gateway.

@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.

login

Після успішного входу вас буде перенаправлено на головний інтерфейс. Тепер ви можете натиснути будь-яку кнопку.

index-ok

Що ще

Ви можете ознайомитися з наступними проектами/документацією, щоб дізнатися більше про інтеграцію Java з Casdoor.