鍍金池/ 問答/PHP/ 各位親,請教一個(gè)接口設(shè)計(jì)的權(quán)限驗(yàn)證問題

各位親,請教一個(gè)接口設(shè)計(jì)的權(quán)限驗(yàn)證問題

我們PHP團(tuán)隊(duì)目前主要工作是為手機(jī)APP開發(fā)接口,目前已經(jīng)實(shí)現(xiàn)了一個(gè) JSON RPC 風(fēng)格的接口框架,簡單講,前端以這種 URL 形式直接調(diào)用后臺接口:
www.xxx.com/api.php?c=books&a=update
所謂接口,就是指某個(gè)控制器的一個(gè)方法,所以這將會執(zhí)行 books 控制器里的 update 方法(更新一本書),返回 JSON 表示成功或失敗。

不同的接口需要不同的權(quán)限驗(yàn)證。例如上面的 books/update 驗(yàn)證規(guī)則是,只有管理員和這本書的擁有者才可執(zhí)行更新操作。目前我們是在 update 方法里編寫代碼實(shí)施驗(yàn)證。

我的問題是,如何設(shè)計(jì)接口的權(quán)限驗(yàn)證,使得團(tuán)隊(duì)里的每個(gè)程序員能夠優(yōu)雅地、方便地、高效地為各種接口定義規(guī)則,并能在將來輕松地修改已有規(guī)則、補(bǔ)充新規(guī)則……

謝謝!

回答
編輯回答
獨(dú)特范

中間件了解一下。

用中間件包裹需要權(quán)限驗(yàn)證的接口,就不需要每個(gè)方法里面都編寫驗(yàn)證規(guī)則了。

2018年4月17日 04:58
編輯回答
墨沫

個(gè)人做法:
1.專門寫一個(gè)類來處理權(quán)限驗(yàn)證
2.驗(yàn)證權(quán)限的主要方式為acl,將用戶歸屬于角色,如管理員、作者;將控制器參數(shù)定義為資源,每個(gè)controller下的每個(gè)action定義為一個(gè)資源;通過數(shù)據(jù)庫或配置文件為每個(gè)角色配置資源權(quán)限
3.在父類中調(diào)用權(quán)限驗(yàn)證類進(jìn)行acl權(quán)限判斷
4.當(dāng)前用戶角色為作者時(shí),需要進(jìn)行文章歸屬判斷,判斷的具體方法還是應(yīng)該寫在權(quán)限驗(yàn)證類中,但需要根據(jù)你們的需求決定在父類中統(tǒng)一驗(yàn)證還是每個(gè)controller驗(yàn)證或每個(gè)action單獨(dú)驗(yàn)證,如果要統(tǒng)一驗(yàn)證,那么文章ID參數(shù)名必須是特殊的,比如叫aid。個(gè)人不建議統(tǒng)一判斷文章歸屬,可能會有意料之外的需求出現(xiàn)。

2017年6月28日 05:53
編輯回答
雨萌萌

可以在公共的父類控制器里,統(tǒng)一驗(yàn)證登錄信息,角色信息,還有要過濾信息。權(quán)限驗(yàn)證
存表里,還是在子類控制器的變量里看個(gè)人

2018年9月11日 11:54
編輯回答
熟稔

我的方法是做一個(gè)父類,在父類里面寫__construct來驗(yàn)證你的權(quán)限,如果權(quán)限不符合就返回一串信息然后exit(0),控制器子類繼承這個(gè)類

2017年8月14日 08:09