跳到主内容

Spring Cloud

casdoor-spring-boot-example 是关于如何在 SpringBoot 项目中使用 casdoor-spring-boot-starter 的示例。 Spring Cloud 也是如此。 我们将向您展示以下步骤。

步骤1. 部署Casdoor

第一,应部署Casdoor。

您可以参考 服务安装 的 Casdoor 官方文档。 请在 生产模式 中部署您的 castor 实例。

在成功部署后,您需要确保:

  • 打开您最喜欢的浏览器并访问 http://localhost:8000,您将看到Casdoor的登录页面。
  • 输入 admin123 测试登录功能正常工作。

然后您可以通过以下步骤在自己的应用程序中快速实现基于 Casdoor 的登录页面。

步骤2. 导入 casdoor-spring-boot-starter

您可以使用 maven 或 gradle 导入 casdoor-spring-boot-starter。

<!-- 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>
// https://mvnrepository.com/artifact/org.casbin/casdoor-spring-boot-starter
implementation group: 'org.casbin', name: 'casdoor-spring-boot-starter', version: '1.x.y'

步骤3. 初始化配置

初始化需要 6 个参数,它们都是字符串类型:
名称(按顺序排列)是否必须描述
endpointCasdoor 服务URL, 例如 http://localhost:8000
clientId客户端ID
clientSecret客户端秘钥
jwtPublicKeyCasdoor 应用程序证书的公钥
organizationName应用程序组织
applicationName应用程序名称

您可以使用 Java properties 或 YAML 文件来初始化,如下所示。

casdoor.endpoint = http://localhost:8000
casdoor.clientId = <client-id>
casdoor.clientSecret = <client-secret>
casdoor.jwtSecret = <jwt-public-key>
casdoor.organizationName = built-in
casdoor.applicationName = app-built-in
casdoor:
endpoint: http://localhost:8000
client-id: <client-id>
client-secret: <client-secret>
jwt-public-key: <jwt-public-key>
organization-name: built-in
application-name: app-built-in
注意事项

您应该用您自己的 Casdoor 实例替换配置,特别是 clientId, clientSecretjwtPublicKey

步骤3. 服务发现

  • 什么是注册表

注册表在微型服务项目中发挥着非常重要的作用。 它们是微型服务结构中的链接,类似于记录服务和服务地址图的地址簿。 在分布式结构中,服务在这里注册。 并且当某个服务需要调用另一个服务时,它会找到服务的地址并调用。

  • 为什么使用注册表

注册表负责处理服务发现的问题。 在没有注册表的情况下,服务之间调用需要知道所称方的地址或代理地址。 当服务更改其部署地址时,它必须更改调用中指定的地址或改变代理配置。 在注册表中,每个服务只需要在呼叫他人时知道服务名,并且地址将通过注册表同步。

  • Nacos服务发现

    Nacos是一个易于使用的动态服务发现、配置和服务管理平台,用于构建云端本地应用程序。

从发布下载&版本

下载

1) 从Github下载源代码

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/

// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

2) 下载运行的包

下载 nacos-server-$version.zip form https://github.com/alibaba/nacos/releases.

unzip nacos-server-$version.zip or tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

启动服务器

  • Linux/Unix/Mac

    运行下面的命令以启动(独立表示非集群模式):

sh startup.sh -m standalone
  • Windows

转到nacos/bin 目录,运行下面的命令来启动(独立表示非集群模式):

startup.cmd -m standalone

Nacosprovide 一个视觉操作平台,启动服务器,打开您最喜欢的浏览器并访问 http://localhost:8848/nacos ,默认用户名和密码是 nacos

如何使用

  1. 添加依赖关系
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  1. 添加 Nacos 配置
spring:
application:
name: casdoor-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
  1. 通过添加 @EnableDiscoveryClient springcloud.png 启动服务器来启用服务发现。查看Nacos 控制台的服务列表 springcloud_1.png

步骤4. 配置中心

您也可以使用 nacos 配置,在配置中心放置这些 casdoor 配置

介绍

  • 什么是配置中心?

    在微型服务结构中,当系统从一个应用程序分成一个分布式系统上的服务节点时, 配置文件必须迁移(拆分),以便分散配置,权力下放则是多余的。 一般来说,一个配置中心是一个基本的服务组成部分,负责集中管理各种应用程序的配置。

  • 为什么要使用配置中心?

    配置中心将配置与应用程序分开,并以统一的方式管理配置。 应用程序不需要管理配置本身。

  • Nacos 配置中心

    Nacos是别墅的开放源码平台,用于动态服务发现、配置管理和服务管理,这种平台更容易构建云端原生应用。

如何使用

  1. 添加依赖关系
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
  1. bootstrap.yml 中添加 Nacos 配置
  application:
name: casdoor-service
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
file-extension: yaml

配置文件加载优先级(从最高到低) bootstrap.properties ->bootstrap.yml -> application.properties -> application.yml 3. 通过添加 @EnableDiscoveryClient springcloud.png 将配置添加到配置中心 (Data Id) 来启用服务发现 springcloud_2.png springcloud_3.png

  在 Nacos Spring Cloud, `dataId` 的格式如下: `${prefix}-${spring.profiles.active}。${file-extension}`
  • prefix 默认是 spring.application.name 的值。 您也可以在 spring.cloud.nacos.config.prefix 中配置此值。
  • spring.profiles.activity 是当前环境的配置文件。
  • file-exetension 是配置内容的数据格式,可以在 spring.cloud.nacos.config.file-extension 中进行配置。

我们可以将我们的 dataId 匹配为 casdo-service-dev.properties,配置格式是 properties,

配置内容是 第3步的配置, 这样 步骤 3 的配置文件可以放置到 nacos 配置中心。

步骤5. 重定向到登录页面

当您需要访问您的应用程序的身份验证时,您可以发送目标 url 并重定向到 Casdoor 提供的登录页面。

请确保您已提前在应用配置中添加回调 url(例如 http://localhost:8080/login)。

@Resource
private CasdoorAuthService casdoorAuthService;

@RequestMapping("toLogin")
public String toLogin() {
return "redirect:" + casdoorAuthService.getSigninUrl("http://localhost:8080/login");
}

步骤6. 获取 token 并解析

在 Casdoor 验证通过后,它将被重定向到您的应用程序,并带有 code 和状态。

您可以获取 code 并调用 getOAuthToken 方法,然后解析出 jwt 令牌。

CasdoorUser 包含了 Casdoor 提供的用户基本信息,您可以将其作为关键字在您的应用程序中设置会话。

@RequestMapping("login")
public String login(String code, String state, HttpServletRequest request) {
String token = "";
CasdoorUser user = null;
try {
token = casdoorAuthService.getOAuthToken(code, state);
user = casdoorAuthService.parseJwtToken(token);
} catch (CasdoorAuthException e) {
e.printStackTrace();
}
HttpSession session = request.getSession();
session.setAttribute("casdoorUser", user);
return "redirect:/";
}

服务

这两种情况的示例如下所示:

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

更多内容

您可以探索以下项目/文件来了解更多关于Java 与Casdoor一体化的信息。