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:
<!-- 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
.
Буде запущено логіку аутентифікації шлюзу. Оскільки ви не увійшли в систему, вас буде перенаправлено на інтерфейс входу. Натисніть кнопку Вхід.
Ви можете побачити єдину платформу входу Casdoor.
Після успішного входу вас буде перенаправлено на головний інтерфейс. Тепер ви можете натиснути будь-яку кнопку.
Що ще
Ви можете ознайомитися з наступними проектами/документацією, щоб дізнатися більше про інтеграцію Java з Casdoor.