Radim Marek:深入了解PostgREST - 请假管理器(第三部分)
内容提要
这是“深入了解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可以执行批准或拒绝操作。