处理许多不同类型的角色和数据检索
Handling many different types of roles and data retrieval
请注意,我在后端使用 Laravel。假设您在任务管理系统中有 10 个不同的用户级别。所有这些用户级别对任务本身以及每个任务的实际属性都有不同的访问权限。例如,超级管理员可能可以看到所有任务,经理也可以。但是经理只能看到这些任务的特定属性子集。另一方面,普通人只会看到他们自己的任务,以及属性的不同子集。
你会用什么样的设计模式或方法来处理这样的事情?每个用户级别都不同,我试图避免在任何地方添加 switch 语句。对于简单的事情,这完全没问题。但是当它无处不在时,就好像代码的味道。
这基本上就是我试图找到好的解决方案的原因。还有其他一些地方我要将一个数组返回到视图,但该数组将根据用户级别填充不同的信息集。我试图限制发送的数据,即使它没有显示,因为我在前面使用 Angular。因此,检查该数据的响应非常简单。
我会考虑使用类似这个项目的东西:https://github.com/Narzerus/angular-permission
根据文档:
Permission helps you gain control of your routes, by using simple concepts for you to decide who can access them. I've seen plenty of big fat tutorials on access control implementations, and they can be quite overwhelming. So I bring you a simple, powerful, straightforward solution.
这是一个简单的示例,说明如何在 Angular 中实现它:
定义权限:
angular.module('barModule', ['permission', 'user'])
.run(function (PermissionStore, User, $q) {
PermissionStore
// Define user permission calling back-end
.definePermission('user', function (stateParams) {
// This time we will return a promise
// If the promise *resolves* then the user has the permission, if it *rejects* (you guessed it)
// Let's assume this returns a promise that resolves or rejects if session is active
return User.checkSession();
})
PermissionStore
// A different example for admin
.definePermission('admin', function (stateParams) {
var deferred = $q.defer();
User.getAccessLevel()
.then(function (data) {
if (data.accessLevel === 'admin') {
deferred.resolve();
} else {
deferred.reject();
}
}
.catch(function () {
// Error with request
deferred.reject();
});
return deferred.promise;
});
});
定义角色:
angular
.module('fooModule', ['permission', 'user'])
.run(function (RoleStore, User) {
RoleStore
// Permission array validated role
// Library will internally validate if 'user' and 'editor' permissions are valid when checking if role is valid
.defineRole('admin', ['user', 'editor']);
RoleStore
// Server side validated role
.defineRole('accountant', [], function (stateParams) {
// Let's assume that we are making a request to server here and return response as promise
return User.hasRole('accountant');
});
});
路线中的用法:
$stateProvider
.state('dashboard', {
url: '...',
data: {
permissions: {
except: ['anonymous'],
redirectTo: 'login'
}
}
});
在视图中的用法:
<div permission only="'loggedIn'">
<span>Congrats! You are logged in.</span>
</div>
请注意,我在后端使用 Laravel。假设您在任务管理系统中有 10 个不同的用户级别。所有这些用户级别对任务本身以及每个任务的实际属性都有不同的访问权限。例如,超级管理员可能可以看到所有任务,经理也可以。但是经理只能看到这些任务的特定属性子集。另一方面,普通人只会看到他们自己的任务,以及属性的不同子集。
你会用什么样的设计模式或方法来处理这样的事情?每个用户级别都不同,我试图避免在任何地方添加 switch 语句。对于简单的事情,这完全没问题。但是当它无处不在时,就好像代码的味道。
这基本上就是我试图找到好的解决方案的原因。还有其他一些地方我要将一个数组返回到视图,但该数组将根据用户级别填充不同的信息集。我试图限制发送的数据,即使它没有显示,因为我在前面使用 Angular。因此,检查该数据的响应非常简单。
我会考虑使用类似这个项目的东西:https://github.com/Narzerus/angular-permission
根据文档:
Permission helps you gain control of your routes, by using simple concepts for you to decide who can access them. I've seen plenty of big fat tutorials on access control implementations, and they can be quite overwhelming. So I bring you a simple, powerful, straightforward solution.
这是一个简单的示例,说明如何在 Angular 中实现它:
定义权限:
angular.module('barModule', ['permission', 'user'])
.run(function (PermissionStore, User, $q) {
PermissionStore
// Define user permission calling back-end
.definePermission('user', function (stateParams) {
// This time we will return a promise
// If the promise *resolves* then the user has the permission, if it *rejects* (you guessed it)
// Let's assume this returns a promise that resolves or rejects if session is active
return User.checkSession();
})
PermissionStore
// A different example for admin
.definePermission('admin', function (stateParams) {
var deferred = $q.defer();
User.getAccessLevel()
.then(function (data) {
if (data.accessLevel === 'admin') {
deferred.resolve();
} else {
deferred.reject();
}
}
.catch(function () {
// Error with request
deferred.reject();
});
return deferred.promise;
});
});
定义角色:
angular
.module('fooModule', ['permission', 'user'])
.run(function (RoleStore, User) {
RoleStore
// Permission array validated role
// Library will internally validate if 'user' and 'editor' permissions are valid when checking if role is valid
.defineRole('admin', ['user', 'editor']);
RoleStore
// Server side validated role
.defineRole('accountant', [], function (stateParams) {
// Let's assume that we are making a request to server here and return response as promise
return User.hasRole('accountant');
});
});
路线中的用法:
$stateProvider
.state('dashboard', {
url: '...',
data: {
permissions: {
except: ['anonymous'],
redirectTo: 'login'
}
}
});
在视图中的用法:
<div permission only="'loggedIn'">
<span>Congrats! You are logged in.</span>
</div>