我想为一个典型的web应用程序…构建一个‘User’对象模型然而,我不能决定如何最好地设计对象模型&角色系统。
基本上,我计划有大约4种用户类型的…它将对应于成员资格提供者中的用户“角色”。
这些类型包括:·工人·雇主·来宾·管理
超级类型为:·User
此外,用户有时既可以是“工人”,也可以是“雇主”。
我想使用MS角色和成员资格提供程序,并将导航UI设置为响应用户角色。
我的问题是:我如何才能最好地将这些用户设计得灵活(用户可以是工人和雇主)。如何处理登录/角色过程?
(我正在考虑一个用户,他有一个用于“行为”对象(工人行为、雇主行为)的工厂)
用于登录-…中的用户登录查找其角色并强制转换为其子类型。
这是不是应该这样做?
发布于 2009-01-16 15:56:16
事实证明,仅仅使用角色本身的概念对我来说是足够的。它没有提供足够低的粒度来控制权限。例如,您可能有一个工人角色和一个管理员角色,然后在代码中使用principal.IsInRole(“管理员”)检查他们的角色,以确定他们是否可以修改某些值(比如薪水)。然后,有人改变了主意,说主管可以改变工资,但仍然不是管理员。现在,您必须更改您的访问检查,以添加另一个角色检查。痛苦和例行公事
因此,我要做的是列出应用程序中的所有功能,然后允许它们与数据库中的所有角色相关联。我的访问检查看起来像principal.HasPermission("CHANGESALARY")。我根据用户登录时所附加的角色加载用户权限。这样,企业就可以创建任意数量的功能组,并对其进行命名。然后,它们可以应用于任何用户。
我创建了一个自定义的主体对象,并将它附加到线程上,这样我就可以在整个页面生命周期中的任何代码中使用它。此对象包含用于从数据库加载权限的代码和用于检查权限的方法。
我通常发现框架中的“提供者”适用于一小部分应用程序,而不能满足大多数需求。当你按照自己的意愿完成它们时,从头开始写会更容易一些。
发布于 2009-01-28 09:30:26
老实说,这可能不是一个很好的解决方案,但它可能有助于产生一些其他想法。
我的角色是所有可能的权限组合:
Worker, Employee, Guest, Admin, WorkerEmployee, etc
在我的代码中,我有一个表示各个权限的枚举
[Flags]
public enum RolePermissions
{
Guest = 1,
Worker = 2,
Employee = 4,
Admin = 8
}
并且我有一个与数据库中的角色相对应的枚举。整数值是权限的按位OR:
public enum AvailableRoles
{
None = 0,
Guest = RolePermissions.Guest, //1
Worker = RolePermissions.Worker, // 2
Employee = RolePermissions.Employee, // 4
WorkerEmployee = RolePermissions.Worker | RolePermissions.Employee, // 6
Admin = RolePermissions.Admin, // 8
}
然后,我可以使用一组方法来查找权限等内容:
// Used to determine if the currently logged in user has a particular permission (Guest, Worker, Employee, Admin)
public static bool UserHasPermission( RolePermissions rolePermssion )
{
foreach( string role in Roles.GetRolesForUser() )
{
AvailableRoles availableRole = Parse( role );
if( ( (RolePermissions)availableRole & rolePermssion ) == rolePermssion )
return true;
}
return false;
}
// Used to determine whether the currently logged in user is in a specific role
public static bool UserIsInRole( AvailableRoles requestedRole )
{
return UserIsInRole( Membership.GetUser().UserName, requestedRole );
}
// Used to determine whether a specific user is in a specific role
public static bool UserIsInRole( string username, AvailableRoles requestedRole )
{
foreach( string role in Roles.GetRolesForUser( username ) )
{
AvailableRoles actualRole = Parse( role );
if( actualRole == requestedRole )
return true;
}
return false;
}
// Helper method to parse enum
private static AvailableRoles Parse( string role )
{
return (AvailableRoles)Enum.Parse( typeof( AvailableRoles ), role );
}
如果你想出一个更好的方法或改进,请让我知道,这样我就可以把它合并到我自己的代码中。:-)
https://stackoverflow.com/questions/452295
复制相似问题