SailsJS基于策略的路由与视图

时间:2014-01-23 08:41:45

标签: sails.js

我尝试使用routes.js来定义到'/account'的路线。

我希望尝试访问该路径的任何人通过UserControllercheckLogin操作,如果安全检查通过,则应使用{{{ 1}}

这是我的代码:

routes.js:

home/account

policies.js:

'/account': {
    controller: 'UserController',
    action: 'checkLogin',
    view: 'home/account'
  }

由于某种原因,它让我查看UserController: { '*': 'isAuthenticated', 'login': true, 'checkLogin': true } 而不通过/account政策检查。

3 个答案:

答案 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' } );
},