Pular para o conteúdo principal

Spring Cloud Gateway

O casdoor-springcloud-gateway-example é um exemplo de como usar o casdoor-spring-boot-starter como um plugin OAuth2 no Spring Cloud Gateway. Os passos para usá-lo são descritos abaixo.

Passo 1: Implante o Casdoor

Primeiramente, o Casdoor deve ser implantado. Você pode consultar a documentação oficial do Casdoor para a Instalação do Servidor. Por favor, implante sua instância do Casdoor em modo de produção.

Após uma implantação bem-sucedida, você precisa garantir o seguinte:

  • Abra seu navegador favorito e visite http://localhost:8000. Você verá a página de login do Casdoor.
  • Insira admin e 123 para testar se a funcionalidade de login está funcionando bem.

Depois disso, você pode implementar rapidamente uma página de login baseada no Casdoor em seu próprio aplicativo usando os seguintes passos.

Passo 2: Inicialize um Spring Cloud Gateway

Você pode usar o código deste exemplo diretamente ou combiná-lo com seu próprio código de negócios.

Você precisa de um serviço de gateway e pelo menos um serviço de negócios. Neste exemplo, casdoor-gateway é o serviço de gateway e casdoor-api é o serviço de negócios.

Passo 3: Inclua a dependência

Adicione a dependência casdoor-spring-boot-starter ao seu projeto Spring Cloud Gateway.

Para 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>

Para Gradle:

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

Passo 4: Configure suas propriedades

A inicialização requer 6 parâmetros, todos do tipo string.

Nome (em ordem)ObrigatórioDescrição
endpointSimURL do Servidor Casdoor, como http://localhost:8000
clientIdSimApplication.client_id
clientSecretSimApplication.client_secret
certificateSimApplication.certificate
organizationNameSimApplication.organization
applicationNameNãoApplication.name

Você pode usar propriedades Java ou arquivos YAML para inicializar esses parâmetros.

Para propriedades:

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

Para 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

Além disso, você precisa configurar o Roteamento do Gateway. Para YAML:

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

Passo 5: Adicione o CasdoorAuthFilter

Adicione uma classe de implementação da interface GlobalFilter ao gateway para verificação de identidade, como o CasdoorAuthFilter usado neste exemplo.

Se a autenticação falhar, ele retorna um código de status 401 para o frontend redirecioná-lo para a interface de login.

@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();
});
}
}

Passo 6: Obtenha o Serviço e use-o

Agora forneça 5 serviços: CasdoorAuthService, CasdoorUserService, CasdoorEmailService, CasdoorSmsService e CasdoorResourceService.

Você pode criá-los da seguinte forma no projeto Gateway.

@Resource
private CasdoorAuthService casdoorAuthService;

Quando você precisar de autenticação para acessar seu aplicativo, você pode enviar a URL de destino e redirecionar para a página de login fornecida pelo Casdoor.

Por favor, certifique-se de que você adicionou a URL de retorno de chamada (por exemplo, http://localhost:9090/callback) na configuração do aplicativo com antecedência.

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

Após a verificação bem-sucedida pelo Casdoor, será redirecionado de volta ao seu aplicativo com um código e estado. Você pode obter o código e chamar o método getOAuthToken para analisar o token JWT.

CasdoorUser contém as informações básicas sobre o usuário fornecidas pelo Casdoor. Você pode usá-lo como uma palavra-chave para definir a sessão em seu aplicativo.

@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:/");
});
}

Exemplos das APIs são mostrados abaixo.

  • 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());

Passo 7: Reinicie o projeto

Após iniciar o projeto, abra seu navegador favorito e visite http://localhost:9090. Então clique em qualquer botão que solicite recursos de casdoor-api.

índice

A lógica de autenticação do gateway será acionada. Como você não está logado, será redirecionado para a interface de login. Clique no botão Login.

toLogin

Você pode ver a plataforma de login unificada do Casdoor.

login

Após um login bem-sucedido, você será redirecionado para a interface principal. Agora você pode clicar em qualquer botão.

index-ok

Além disso

Você pode explorar os seguintes projetos/documentações para aprender mais sobre a integração do Java com o Casdoor.