node.js - 在 emberjs 中管理用户角色?

标签 node.js ember.js ember-simple-auth

我有一个如下所示的 nodejs api

route.post("/token",function(req,res){
    authLib
        .checkForm(req.body)
        .then(authLib.findUser)
        .then(authLib.isValidUser)
        .then(authLib.authenticate)
        .then(authLib.genToken)
        .then((token)=>{
            res
                .status(200)
                .json({'access_token': token});
        })
        .catch((err)=>{
            res
                .status(400)
                .json({'error': err.message});
        });
});

用户的模型 包含一个具有用户角色的字段。每个用户角色都有不同的仪表板。 我已经使用 oauth2-password-grant 实现了 ember-simple-auth,仪表板的模板如下所示

{{#if session.isAuthenticated}}
    {{#app-dashboard}}
    {{/app-dashboard}}
{{else}}
    {{#landing-app}}
    {{/landing-app}}
{{/if}}

问题是我如何区分用户角色。一种方法可能是使用 ajax 请求来获取角色,但这意味着对所有 View 的额外 XHR 请求。 在 Ember.$ 中使用 XHR 的另一个问题是授权 token 未附加到请求。解决此问题的最佳方法是什么?

最佳答案

我没有使用过 ember-simple-auth,但一种可能有用的方法是在成功用户“登录”时发送角色/权限对象以及 token 。然后创建一个'user-permissions' Ember 服务,它存储角色/权限对象,并可以在需要时检查用户是否具有特定权限。我将使用数组作为示例权限对象。您应该能够通过单个 XHR 请求执行此操作。

当然,任何客户端“安全”本质上都是不安全的,因此请确保保护您的路由免受服务器端用户行为的影响。

首先,您需要数据库中与用户关联的一些角色或权限。然后向您的 Node API 添加一些逻辑,以返回经过身份验证的用户的权限列表以及该 token 。

然后,在 Ember 中,像这样定义权限服务:

export default Ember.Service.extend({
    permissions: [], // Sample permissions: "seeAdminPanel", "deleteUsers"

    // You can create a computed property to check permissions (good for templates)
    canDeleteUsers: Ember.computed('permissions', function() {
        //Check that the permissions object contains the deleteUsers permission
        let permissions = this.get('permissions');
        let permissionToCheck = 'deleteUsers';
        let userHasPermission = permissions.indexOf(permissionToCheck) > -1; 
        return (userHasPermission);
    }),

    // Or create a generic function to check any permission (good for checking in a function)
    canCurrentUser(permissionToCheck) {
        let permissions = this.get('permissions');
        return (permissions.indexOf(permissionToCheck) > -1);
    }
});

当您的 Ember 应用访问您的 Node API 时,它将在成功响应中获取权限对象。在成功回调中像这样在权限服务上设置对象(记得注入(inject)您的服务):

let userPermissionsService = this.get('userPermissionsService');
userPermissionsService.set('permissions', ["deleteUsers"]);

然后在模板中使用:

{{#if userPermissionsService.canDeleteUsers}}
    <button>Delete User</button>
{{/if}}

或者在函数中使用:

let userPermissionsService = this.get('userPermissionsService');
if (userPermissionsService.canCurrentUser("deleteUsers")) {
    this.deleteUser()
}

就使用 XHR 请求传回授权 token 而言,您应该能够通过使用常规 jquery ajax 请求(根据 http://api.jquery.com/jQuery.ajax/ 在请求中设置 header 对象)手动完成,或者如果您想要将它附加到每个 Ember 数据请求,自定义 REST 适配器应该可以工作:https://guides.emberjs.com/v2.13.0/models/customizing-adapters/#toc_headers-customization

关于node.js - 在 emberjs 中管理用户角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44199881/

相关文章:

javascript - 无法在 heroku 上推送 node.js 应用程序

javascript - 有没有客户端+服务器端的MVC JS框架

Ember.js:将参数传递给使用 Handlebars {{view}} Helper 渲染的 subview

javascript - Ember.js REST 适配器使用 JSON 根(使用 ember-data)

ember.js - 无法使用 embre-simple-auth-token 访问 session 属性和 JWT 声明

javascript - 获取提到的用户的状态/事件

node.js - 如何在 Angular 5 内的 Electron 中使用 Node "fs"

javascript - Ember store.push with hasMany 不更新模板?

javascript - 操作不是由 Ember CLI 简单例份验证 ApplicationRouteMixin 触发的

javascript - 引用错误: parameters is not defined in Ember. js