Node.js與Sails~方(fang)法攔截器policies
policies
sails的(de)方法攔(lan)截器(qi)類似于.net mvc里的(de)Filter,即它可以(yi)作用在(zai)(zai)controller的(de)action上(shang),在(zai)(zai)服務器(qi)響(xiang)應指(zhi)定(ding)action之(zhi)前,對(dui)這個(ge)action進行攔(lan)截,先執行policies的(de)策略,當(dang)(dang)條件(jian)通過,會next()它,繼續執行本方法,當(dang)(dang)條件(jian)不(bu)滿足時,你可以(yi)終端這個(ge)請求,在(zai)(zai)sails里,policies也經常被用在(zai)(zai)權限判斷(duan)上(shang),如登(deng)陸用戶可以(yi)訪問某個(ge)action,管理員權限可以(yi)訪問指(zhi)定(ding)action等等。
一 首先定義一個過濾器(qi)(策(ce)略)/policies/adminAuth.js
/** * adminAuth * Created by zzl on 2015/10/14. */ module.exports = function (req, res, next) { if (!req.session.user.isAdmin) { return res.send("you are not administrator!"); } next(); };
二 在策(ce)略配置項里為指定(ding)的controller添加指定(ding)的策(ce)略/config/policies.js
module.exports.policies = { testController:{ '*': 'sessionAuth', 'admin':['adminAuth'] } };
上面的代碼*表示test控制器里的所有action都會被添加上sessionAuth這個過濾器,而第二行 'admin':['adminAuth']表示為admin這個action,添加adminAuth這個(ge)過濾器,它使用(yong)[]包含,表示一個(ge)action可(ke)以有多種過濾器去修飾!
如(ru)果(guo)希望所有的controller的所有action都添加某個(ge)過濾(lv)器,我們(men)需要把策(ce)略寫在(zai)外面,如(ru)下面的代碼
module.exports.policies = { '*': 'sessionAuth',//all controller action };
上(shang)(shang)面(mian)對應全(quan)局的過濾器(qi)一般用在后臺管(guan)理(li)系統上(shang)(shang),但這(zhe)(zhe)種(zhong)(zhong)全(quan)局過濾器(qi)加上(shang)(shang)后,需要(yao)把登(deng)(deng)陸(lu),登(deng)(deng)出這(zhe)(zhe)種(zhong)(zhong)頁(ye)面(mian)排除掉,否則,你無(wu)法進行(xing)登(deng)(deng)陸(lu)頁(ye)了(le),哈(ha)哈(ha),代碼如下(xia)
module.exports.policies={ '*': 'sessionAuth',//all controller action commonController:{ '*':true//不走全局*過濾器 } }
三(san) 直接運行(xing)代碼,你的(de)test控(kong)制(zhi)器(qi)下的(de)所有action都需要進行(xing)登陸后才可以訪(fang)問,而admin這個(ge)action需要是有管理員權(quan)限的(de)用戶才可以訪(fang)問,下面做(zuo)了一個(ge)簡單的(de)測試
模擬登陸
/** * Created by zzl on 2015/10/14. */ module.exports={ login:function(req,res)//模擬用戶登陸 { req.session.user={isLogin:true} console.log( req.session.user); return res.send("用戶登陸成功") }, adminLogin:function(req,res)//模擬(ni)管(guan)理員登錄 { req.session.user={isLogin:true,isAdmin:true} console.log( req.session.user); return res.send("管理員登陸成功") } };
第一次運行程序
用戶登陸
第(di)二次(ci)進行(xing)這個頁面,就正常顯示內容了
通過這幾篇sails的文章(zhang),我們應該有種體會,那就(jiu)是所有技術(shu)都是相通的,可能代碼(ma)寫法不(bu)一(yi)(yi)樣,但是思想上(shang)是保持一(yi)(yi)致的,哈哈!