如何编写Supabase策略,允许公共用户仅向articles表likes列插入数据?
需求可行性与实现方案
这个需求是可行的,但需要先明确操作逻辑:INSERT是针对整行的操作,所谓"仅对likes列执行INSERT",实际是指公共用户插入新行时只能指定likes列的值,其他列需依赖默认值、自动生成规则(如主键自增)或允许为NULL。如果你的真实需求是给已有文章点赞(即增加likes的数值),那应该用UPDATE权限控制而非INSERT,这点要区分清楚。
针对主流数据库的实现代码
1. MySQL 环境
第一步:创建公共访问用户(若未存在)
CREATE USER 'public_liker'@'%' IDENTIFIED BY 'secure_password_here';
第二步:授予精准的INSERT权限
-- 仅允许用户在articles表的INSERT操作中指定likes列 GRANT INSERT(likes) ON your_database.articles TO 'public_liker'@'%';
权限验证示例
用户登录后,仅能执行指定likes列的插入:
-- 合法操作 INSERT INTO articles(likes) VALUES(1); -- 非法操作(会被拒绝,无其他列的插入权限) INSERT INTO articles(title, content, likes) VALUES('新文章', '内容', 1);
2. PostgreSQL 环境
第一步:创建公共角色/用户
CREATE ROLE public_liker WITH LOGIN PASSWORD 'secure_password_here';
第二步:授予列级INSERT权限
GRANT INSERT(likes) ON TABLE articles TO public_liker;
补充:若需求是给已有文章点赞(UPDATE操作)
如果你的真实场景是用户给已存在的文章点赞(即likes列数值递增),则需要授予UPDATE权限并限制仅能修改likes列,还可配合触发器防止恶意篡改:
MySQL 示例
-- 授予UPDATE权限 GRANT UPDATE(likes) ON your_database.articles TO 'public_liker'@'%'; -- 创建触发器限制likes只能递增 DELIMITER // CREATE TRIGGER trg_restrict_likes_update BEFORE UPDATE ON articles FOR EACH ROW BEGIN IF NEW.likes < OLD.likes THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '仅允许增加点赞数,禁止减少'; END IF; END // DELIMITER ;
PostgreSQL 示例
-- 授予UPDATE权限 GRANT UPDATE(likes) ON TABLE articles TO public_liker; -- 创建触发器限制likes只能递增 CREATE OR REPLACE FUNCTION check_likes_increment() RETURNS TRIGGER AS $$ BEGIN IF NEW.likes < OLD.likes THEN RAISE EXCEPTION '仅允许增加点赞数,禁止减少'; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_restrict_likes_update BEFORE UPDATE ON articles FOR EACH ROW EXECUTE FUNCTION check_likes_increment();
内容的提问来源于stack exchange,提问作者FelyAnony
相关产品推荐
相关产品推荐

