我正在使用sails.js后端构建一个角度应用程序。我已将此JWT身份验证合并到应用程序中 https://github.com/Foxandxss/sails-angular-jwt-example
我仍然在探究身份验证的确切工作方式,我目前正在尝试弄清楚如何添加多个授权级别。 它预先构建为0和1,我想在其上面添加一个管理级别。
它处理现有的授权级别,如下所示: 通过常量为每条路线分配授权级别。因此,所有用户路由都在状态的data属性中分配此访问属性:
$stateProvider
.state('user', {
abstract: true,
template: '<ui-view/>',
data: {
access: AccessLevels.user
}
})
从一个常量键值对中提取AccessLevels.user:
angular.module('app')
.constant('AccessLevels', {
anon: 0,
user: 1
});
每当路由导航到时,它都会检查data.access属性以查看该特定路由的访问级别。如果它作为需要身份验证的路由返回,它会检查localStorage是否有令牌。如果有令牌,则路由继续,否则它会启动你。
这是在stateChangeStart上调用的函数:
authorize: function(access) { //<- 'access' will be whatever is in the data property for that state
if (access === AccessLevels.user) {
return this.isAuthenticated(); // <- this just grabs the token
} else {
return true;
}
}
那么添加附加层的最简单方法是什么? 我显然需要将auth_level值放入用户模型中。但那又怎样?添加此功能和维护现有身份验证的完整性的最佳方法是什么(我担心安全性)?
答案 0 :(得分:2)
您可以使用private claims来保存服务器授予的授权。私人声明允许您在JWT中放置您想要的任何其他类型的数据。
我从未使用过node-jsonwebtoken(这似乎是sails.js用于JWT的东西),但看起来您可以直接使用JWT有效负载来访问您希望存在的值,所以你可以做这样的事情:
// Assign authorization on server after successful authentication of an admin
token.auth = AccessLevels.admin;
// Read authorization on client
authorize: function(access) {
if (access === AccessLevels.anon) {
return true;
}
// Assumes the JWT token is returned by isAuthenticated()
// (Sorry, not familiar with Sails.js or the JWT example)
return this.isAuthenticated().auth === access;
}
在身份验证之后,任何后续请求都应该验证用户的授权,可能是通过在您提供的示例中添加类似于“tokenAuth”的添加策略,但验证所提供的JWT上的auth
声明与调用任何即将被调用的函数所需的授权。
答案 1 :(得分:1)
首先,Erik Gillespie让我朝着正确的方向前进。谢谢!
我需要做一些事情来为我的angular / sails应用添加额外级别的身份验证:
admin: 2
添加到现有的用户类型列表中。 $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
if (toState.url == '/dashboard') {
var dash = Auth.level(); // <- this is a service I made that checks the users level and returns the appropriate state to go to for that user
event.preventDefault();
$state.go(dash);
}