在emberjs中管理用户角色?

时间:2017-05-26 11:00:17

标签: 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});
        });
});

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

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

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

2 个答案:

答案 0 :(得分:2)

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

当然,任何客户端"安全"本质上是不安全的,所以请确保保护您的路由免受服务器端的用户行为。

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

然后,在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时,它将获得成功响应中的权限对象。在成功回调中设置权限服务上的对象(请记住注入您的服务):

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请求传递授权令牌方面,您应该能够通过使用常规jquery ajax请求手动执行(根据DataFrameMapper在请求中设置headers对象)或者如果您想要将它附加到每个Ember数据请求,自定义REST适配器应该工作:http://api.jquery.com/jQuery.ajax/

答案 1 :(得分:2)

要检查权限,请考虑使用Ember-Can