使用 loopback-component-passport 设置环回中的用户角色到内置模型中
Set User Role in loopback using loopback-component-passport into inbuilt models
我正在尝试使用 npm loopback-component-passport
和基于条件的用户角色
在环回中创建用户
- 如果用户有 属性
isAdmin:true
他应该有 admin
的角色
- 如果用户有 属性
isAdmin:false
他应该有 user
的角色
这是我的代码:
if (form.$valid) {
AuthService.register({
name: $scope.user.name,
email: $scope.user.email,
password: $scope.user.password,
isAdmin: $scope.user.isAdmin
})
.then(function() {
// Account created, redirect to home
$state.go('home');
})
.catch(function(err) {
err = err.data;
$scope.errors = {};
// Update validity of form fields that match the mongoose errors
angular.forEach(err.errors, function(error, field) {
form[field].$setValidity('mongoose', false);
$scope.errors[field] = error.message;
});
});
}
工厂:
angular
.module('app')
.factory('AuthService', ['User', '$q', '$rootScope', function(User, $q, $rootScope) {
function login(email, password) {
return User
.login({email: email, password: password})
.$promise
.then(function(response) {
$rootScope.currentUser = {
id: response.user.id,
tokenId: response.id,
email: email
};
});
}
function logout() {
return User
.logout()
.$promise
.then(function() {
$rootScope.currentUser = null;
});
}
function register(user) {
return User.create(user).$promise;
}
return {
login: login,
logout: logout,
register: register
};
}]);
护照攻略:
"local": {
"provider": "local",
"module": "passport-local",
"usernameField": "email",
"passwordField": "password",
"authPath": "/auth/local",
"successRedirect": "/auth/account",
"failureRedirect": "/local",
"failureFlash": true
},
...
...
模型-config.json
{
"User": {
"dataSource": "db"
},
"AccessToken": {
"dataSource": "db",
"public": false
},
"ACL": {
"dataSource": "db",
"public": false
},
"RoleMapping": {
"dataSource": "db",
"public": false
},
"Role": {
"dataSource": "db",
"public": false
}
}
但现在我不知道如何添加角色以便我可以区分用户和用户角色。如何在 loopback-component-passport
的内置模型中设置用户角色?
最初创建一个文件并在数据库中添加角色
server/boot/role.js:
module.exports = function(app) {
var Role = app.models.Role;
Role.create([
{name: 'admin'},
{name: 'user'}]
, function(err, role) {
if (err) throw err;
console.log('Created roles:', role);
});
};
使用模型钩子方法
https://docs.strongloop.com/display/public/LB/Operation+hooks
server/boot/user.js
module.exports = function(app) {
var User = app.models.user;
var Role = app.models.Role;
var RoleMapping = app.models.RoleMapping;
User.observe('after save', function setDefaultUsername(ctx, next) {
if (ctx.instance) {
if (ctx.isNewInstance) {
var userRole = ctx.instance.isAdmin ? 'admin' : 'user';
Role.findOne({where: {name: userRole}}, function(err, role) {
if (err) {
return console.log(err);
}
RoleMapping.create({
principalType: RoleMapping.USER,
principalId: ctx.instance.id,
roleId: role.id
}, function(err, roleMapping) {
if (err) {
return console.log(err);
}
});
});
}
}
next();
});
};
查看 Github
上的完整示例
我正在尝试使用 npm loopback-component-passport
和基于条件的用户角色
- 如果用户有 属性
isAdmin:true
他应该有admin
的角色
- 如果用户有 属性
isAdmin:false
他应该有user
的角色
这是我的代码:
if (form.$valid) {
AuthService.register({
name: $scope.user.name,
email: $scope.user.email,
password: $scope.user.password,
isAdmin: $scope.user.isAdmin
})
.then(function() {
// Account created, redirect to home
$state.go('home');
})
.catch(function(err) {
err = err.data;
$scope.errors = {};
// Update validity of form fields that match the mongoose errors
angular.forEach(err.errors, function(error, field) {
form[field].$setValidity('mongoose', false);
$scope.errors[field] = error.message;
});
});
}
工厂:
angular
.module('app')
.factory('AuthService', ['User', '$q', '$rootScope', function(User, $q, $rootScope) {
function login(email, password) {
return User
.login({email: email, password: password})
.$promise
.then(function(response) {
$rootScope.currentUser = {
id: response.user.id,
tokenId: response.id,
email: email
};
});
}
function logout() {
return User
.logout()
.$promise
.then(function() {
$rootScope.currentUser = null;
});
}
function register(user) {
return User.create(user).$promise;
}
return {
login: login,
logout: logout,
register: register
};
}]);
护照攻略:
"local": {
"provider": "local",
"module": "passport-local",
"usernameField": "email",
"passwordField": "password",
"authPath": "/auth/local",
"successRedirect": "/auth/account",
"failureRedirect": "/local",
"failureFlash": true
},
...
...
模型-config.json
{
"User": {
"dataSource": "db"
},
"AccessToken": {
"dataSource": "db",
"public": false
},
"ACL": {
"dataSource": "db",
"public": false
},
"RoleMapping": {
"dataSource": "db",
"public": false
},
"Role": {
"dataSource": "db",
"public": false
}
}
但现在我不知道如何添加角色以便我可以区分用户和用户角色。如何在 loopback-component-passport
的内置模型中设置用户角色?
最初创建一个文件并在数据库中添加角色
server/boot/role.js:
module.exports = function(app) {
var Role = app.models.Role;
Role.create([
{name: 'admin'},
{name: 'user'}]
, function(err, role) {
if (err) throw err;
console.log('Created roles:', role);
});
};
使用模型钩子方法 https://docs.strongloop.com/display/public/LB/Operation+hooks
server/boot/user.js
module.exports = function(app) {
var User = app.models.user;
var Role = app.models.Role;
var RoleMapping = app.models.RoleMapping;
User.observe('after save', function setDefaultUsername(ctx, next) {
if (ctx.instance) {
if (ctx.isNewInstance) {
var userRole = ctx.instance.isAdmin ? 'admin' : 'user';
Role.findOne({where: {name: userRole}}, function(err, role) {
if (err) {
return console.log(err);
}
RoleMapping.create({
principalType: RoleMapping.USER,
principalId: ctx.instance.id,
roleId: role.id
}, function(err, roleMapping) {
if (err) {
return console.log(err);
}
});
});
}
}
next();
});
};
查看 Github
上的完整示例