Radim Marek:深入了解PostgREST - 请假管理器(第三部分)

💡 原文英文,约2200词,阅读约需8分钟。
📝

内容提要

这是“深入了解PostgREST”的第三部分,讲解了身份验证和授权选项。使用PostgreSQL的pgcrypto扩展来安全存储用户密码。使用JSON Web Tokens (JWTs)实现无状态身份验证。使用PostgREST和PostgreSQL的Row Level Security (RLS)实现细粒度授权。完成了Time Off Manager的核心功能,包括假期余额和审批工作流程。

🔎

延伸解读

密码存储与验证的安全实践

文章使用PostgreSQL的pgcrypto扩展,通过bcrypt算法对用户密码进行哈希存储。在设置密码时,调用crypt函数结合gen_salt('bf')生成哈希;登录验证时,将输入的密码与存储的哈希进行比对。这种方法避免了明文存储密码的风险,且每个用户拥有唯一的盐值,增强了安全性。

JWT无状态认证的实现要点

PostgREST通过JWT实现无状态认证。文章使用pgjwt扩展生成和验证令牌,令牌中包含user_id和role等声明,并设置1小时过期时间。密钥需至少32字符,通过数据库配置参数安全存储。客户端登录后获得JWT,后续请求在Authorization头中携带,PostgREST验证后切换至相应数据库角色。

利用RLS实现细粒度授权

文章通过PostgreSQL的行级安全策略(RLS)控制数据访问。例如,在time_off_transactions表上创建策略,允许用户查看自己的余额,经理还可查看下属的余额。对于视图,需设置security_invoker=true,确保以查询用户的权限执行。RLS与PostgREST无缝集成,简化了授权逻辑。

权限清理与角色管理

在实现认证授权时,文章强调了权限清理的重要性:撤销匿名角色的所有权限,并注意撤销PUBLIC的默认执行权限,因为授予schema的USAGE会默认允许执行函数。仅为匿名角色授予api.login函数的执行权限,为认证角色授予必要的表和函数权限,遵循最小权限原则。

❓

Q&A

如何使用PostgreSQL的pgcrypto扩展安全存储用户密码?

可以通过创建一个密码哈希列,并使用bcrypt算法生成密码哈希来安全存储用户密码。

什么是JSON Web Tokens (JWTs),它们在身份验证中如何使用?

JWTs是包含用户身份声明的数字签名信息,用于实现无状态身份验证,确保令牌的完整性。

如何在PostgREST中实现细粒度授权?

通过使用PostgreSQL的行级安全性(RLS)来确保用户只能访问其有权查看的数据。

Time Off Manager的核心功能包括哪些内容?

核心功能包括假期余额管理和审批工作流程。

如何创建和管理用户角色以支持身份验证和授权?

可以通过创建特定角色并在JWT中包含角色声明来管理用户角色。

在PostgREST中如何确保只有经理可以批准或拒绝假期请求?

通过更新请求状态的函数,确保只有经理的用户ID可以执行批准或拒绝操作。

➡️

继续阅读