我尝试使用routes.js
来定义到'/account'
的路线。
我希望尝试访问该路径的任何人通过UserController
和checkLogin
操作,如果安全检查通过,则应使用{{{ 1}}
这是我的代码:
routes.js:
home/account
policies.js:
'/account': {
controller: 'UserController',
action: 'checkLogin',
view: 'home/account'
}
由于某种原因,它让我查看UserController: {
'*': 'isAuthenticated',
'login': true,
'checkLogin': true
}
而不通过/account
政策检查。
答案 0 :(得分:10)
关于策略,控制器和视图如何工作,这里看起来有些混乱。正如@bredikhin所述,您的控制器永远不会被调用,因为路由被绑定到视图。同样重要的是要注意,策略不能绑定到视图,仅绑定到控制器。正确的设置应该是这样的:
在config/routes.js
:
'/account': 'UserController.account'
在config/policies.js
:
UserController: {
'*': 'isAuthenticated' // will run on all UserController actions
// or
'account': 'isAuthenticated' // will run just on account action
}
在api/policies/isAuthenticated.js
:
module.exports = function(req, res, next) {
// Your auth code here, returning next() if auth passes, otherwise
// res.forbidden(), or throw error, or redirect, etc.
}
在api/controllers/UserController.js
:
module.exports = {
account: function(req, res) {
res.view('home/account');
}
}
答案 1 :(得分:5)
简而言之:控制器/动作式或视图式路由应该在routes.js
的同一路径中使用,而不是同时使用。
根据路由器的source code,一旦路由对象中存在view
属性,绑定就会停止,所以基本上Sails从不知道应该将/account
路径路由到哪个控制器,这意味着您的UserController
特定策略配置永远不会触发。
因此,只需从路径中删除view
属性,您始终可以在操作中指定具有显式渲染的视图路径(如果您需要非标准路径)。
答案 2 :(得分:1)
对于静态使用策略,您可以使用控制器和操作设置路由:
'GET /login': 'AuthController.index',
在控制器中设置视图/布局:
index: function (req, res) {
res.view('auth/login', { layout: 'path/layout' } );
},