Перейти к основному содержанию

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

Кроме того, вам нужно настроить маршрутизацию Gateway. Для 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.

вход

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

index-ok

Что еще

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