跳到主要内容

使用 Permit.io 设置授权 (Authorization)

Permit.io 是一个授权 (Authorization) 平台,为应用程序提供细粒度的访问控制。你可以将 Logto 与 Permit.io 结合使用,管理用户认证 (Authentication) 和授权 (Authorization)。

提示:

要了解认证 (Authentication) 与授权 (Authorization) 的关键区别,请参阅 认证 (Authentication) 与授权 (Authorization)

本指南将向你展示如何将 Logto 与 Permit.io 连接,在你的应用中实现授权 (Authorization)。

前置条件

集成

安装 Permit.io SDK

将 Permit.io SDK 添加到你的应用中:

npm install permitio

创建 Permit.io 项目

  1. permit.io 注册免费账户
  2. 创建新项目并获取你的 API 密钥
  3. 将 API 密钥添加到你的环境变量中:
PERMIT_API_KEY=your-permit-api-key

设置 Permit.io 客户端

创建一个文件用于处理 Permit.io 集成:

// libraries/permit.js
const { Permit } = require('permitio');

// 初始化 Permit.io 客户端
const permit = new Permit({
pdp: 'https://cloudpdp.api.permit.io',
token: 'your-permitio-api-key',
});

// 同步用户到 Permit.io
export const syncUserToPermit = async (userId, email, firstName, lastName, role = 'viewer') => {
// 首先,同步用户
await permit.api.syncUser({
key: userId,
email: email || undefined,
first_name: firstName || undefined,
last_name: lastName || undefined,
});

// 然后为用户分配角色
await permit.api.assignRole({
user: userId,
role: role,
tenant: 'default',
});

return true;
};

为用户注册创建 Logto Webhook

Logto 提供了 webhook,可以在事件发生时通知你的应用。我们将使用 PostRegister webhook,在用户注册时 同步用户到 Permit.io

在你的应用中创建一个 webhook 端点:

// pages/api/webhooks/logto.js
import { syncUserToPermit } from '../../../libraries/permit';

export default async function handler(req, res) {
// 打印 webhook 负载以便调试
console.log('Webhook payload:', req.body);

const { event, user } = req.body;

// 处理用户注册事件
if (event === 'PostRegister') {
try {
// 确定用户角色(你可以在这里实现自己的逻辑)
let role = 'viewer'; // 默认角色

// 同步用户到 Permit.io
await syncUserToPermit(user.id, user.primaryEmail, user.name, undefined, role);

return res.status(200).json({ success: true });
} catch (error) {
console.error('Error syncing user:', error);
return res.status(500).json({ error: 'Failed to sync user' });
}
}

return res.status(200).json({ message: 'Event ignored' });
}

在 Logto 控制台配置 Webhook

  1. 进入 Logto 控制台的 Webhook 部分
  2. 点击“创建 Webhook”
  3. 给你的 webhook 命名
  4. 输入你的端点 URL(例如 https://your-app.com/api/webhooks/logto
  5. 选择 PostRegister 事件
  6. 保存 webhook
备注:

本地开发时,你可以使用 ngrok 等工具将本地服务器暴露到互联网。

测试用户同步

测试用户是否被正确同步:

  1. 在你的应用中创建一个新用户账户
  2. 在 Permit.io 控制台的“Directory” → “Users”下检查用户是否已同步
  3. 验证用户注册时是否被分配了正确的角色
Logto 用户已同步到 Permit.io 并分配了角色

使用 Permit.io 进行授权 (Authorization)

用户同步后,你可以使用 Permit.io 检查权限:

// 检查权限的示例
const isPermitted = await permit.check(userId, 'view', 'reports');

if (isPermitted) {
// 用户被允许查看资源
// 显示资源界面
} else {
// 用户不被允许查看资源
// 显示无权访问提示
}

总结

你已成功将 Logto 与 Permit.io 连接,实现了用户自动同步和授权 (Authorization) 功能。通过这种集成:

  1. 用户通过 Logto 进行认证 (Authentication)
  2. 新用户通过 webhook 自动同步到 Permit.io
  3. 你可以使用 Permit.io 检查权限并实现访问控制

这种设置为你的应用后续实现更高级的授权 (Authorization) 模式打下了坚实基础。

如需了解更多高级授权 (Authorization) 用例,请查阅 Permit.io 文档,了解如何创建策略、强制执行权限和实现基于角色的访问控制 (RBAC)。