在sails应用中,Polices是一系列用来认证授权和访问控制的工具,能够在应用调用controller
的action
之前进行拦截,做些认证授权和访问控制的逻辑处理。
问题:deploy之后不重新登录?退出登录后还可以访问页面?
错误代码例子:
'GET /koala/order': {
view : 'koala/order',
locals : { // 渲染页面的数据载体
title: 'xxx'
}
},
上面的例子会导致不管你是否配置了Polices
,一直都可以访问koala/order
渲染出来的页面,但这跟我们的需求是想违背的,因此要解决这个问题。
有问题就要解,于是解决方案来了:
在api/controllers/OrderController.js
文件里添加一个方法:view_order
,如下:
view_order: function(req, res){
return res.view('koala/order', {
title: 'xxx',
});
},
回到routes.js
, 重新配置如下:
'GET /koala/order': { controller: 'OrderController', action: 'view_order' }, // 或者
'GET /koala/order': { controller: 'Order', action: 'view_order' }, // 或者
'GET /koala/order': { 'OrderController.view_order' }, // 或者
'GET /koala/order': { 'Order.view_order' },
为什么这样配置,就可以解决问题了呢,其实官方文档也提出“警告说明”:
Polices
只能应用在controller
的action
(即方法)上,而不能应用到view
(视图)。就是说,如果在routes.js
中配置一条路由直接指向view
,那么Polices
会忽略这条路由,而不会拦截。除此之外,你可以使用controller
的一个action
来处理页面渲染,那么action
就能够被Polices
拦截处理。
所以上面的代码实例就是上面引用说明的具体实践。
想想,我去!那岂不是在所有渲染页面的controller
里都添加这个view_order
的方法,后期维护难啊,路见不平,来改进一下吧:
|-- api
|-- View_renderController.js // 新增这个controller,主要负责页面渲染
|-- assets
|-- config
|-- routes.js
|-- views
|-- koala
|-- order.jade
在View_renderController.js
配置一个渲染页面的方法,如下:
order : function (req, res) {
res.view('koala/order', {
title: 'xxx',
user_name: req.session.user_name
});
},
在routes.js
配置用户访问的一条路由,如下:
'GET /koala/order': {
controller : 'View_renderController',
action: 'order'
},
这样子,只要在View_renderController.js
中添加所有渲染的页面对应的方法,并在修改一下routes.js
即可,并不会影响到其他文件,相对集中管理,有利于后期维护。
在api/policies
文件下定义所有的Polices
文件,例如:isAuthenticated.js
。注意点如下:
{
'*': isLoggedIn // 可以放在这里(controller外面)
OrderController: {
edit: 'isLoggedIn',
}
}
或者
{
OrderController: {
'*': isLoggedIn // 可以放在这里(controller里面)
edit: 'isLoggedIn',
}
}
true
或false
- 公共访问(允许所有访问到该action)
- 禁止访问(禁止任何访问到该action)
// policies/canWrite.js
module.exports = function canWrite (req, res, next) {
// logic code goes here .
};
{
OrderController: {
edit: 'isLoggedIn',
edit: 'isAdmin' // isAdmin会覆盖上面的isLoggedIn
}
}
{
OrderController: {
edit: ['isAdmin', 'isLoggedIn'] // 数组形式
}
}
Spy
16 March 2015