为应用用户分配角色

7
正如所有的业务应用程序一样,一个应用程序可能有多个用户,每个用户都被分配了一些角色。我们最近转向了WPF MVVM架构,并寻找最佳方法为每个登录用户分配角色。互联网上有许多术语,如身份验证、角色管理器、登录服务等,但我不确定应该使用哪个。
以下是我们拥有的内容:一个小型企业应用程序(20个表单),在一个项目中开发。我们使用MVVM架构,LINQ-to-SQL作为数据访问和模型,采用仓储库模式和工作单位。
我们想要的是:不同的表单和每个表单都具有插入、更新、删除、打印等操作。我们想要的是根据他的角色来限制已登录用户所能执行的任务。例如,管理员可以自由地对应用程序进行“任何”操作,而其他一些用户可能无法查看某些表单或执行某些操作(例如更新或删除)。
那么我们如何实现这个功能呢?在桌面LOB应用程序中,如何使用MVVM架构完成这个完整的机制,需要使用什么样的服务。技术术语或教程链接将是有帮助的。
编辑:我浏览了许多论坛和文章,但它们都集中在ASP.NET上。仍然找不到在WPF中分配角色的具体实现。而ASP.NET上的资源并不很符合WPF。

你使用了哪个 MVVM 框架,还是自己开发的? - Derek Beattie
1
我们有同样的问题。大多数权限都是硬编码的。我们计划实现完整的ACL。我的同事提供了WCF角色服务(http://msdn.microsoft.com/en-us/library/bb386424(v=vs.100).aspx)作为准备好的基础设施。但我们仍然不确定在视图模型内应用权限的最佳方法,因为我们希望尽可能避免硬编码。我们还决定看看Prism。我们怀疑它包含所需的功能。 - Pavel Voronin
顺便问一下,您是否考虑过使用AOP来完成这个任务?http://izlooite.blogspot.ru/2010/06/aspect-oriented-programming.html https://dev59.com/_3RC5IYBdhLWcg3wW_lk http://www.sharpcrafters.com/免责声明:我对这种方法很陌生,几乎一无所知。但是代码联系相似,所以我认为它可能会有所帮助。 - Pavel Voronin
5个回答

4
我建议围绕ASP.NET MembershipRole Management提供程序构建解决方案(尽管您对原始问题进行了编辑)。它们在MSDN上有很好的文档,并且非常灵活。
以下是几个链接,希望能帮助您进行WPF集成:

另外,您提到正在使用MVVM;我建议创建一个静态类或者全局可访问的属性(请参见:使用全局变量的WPF应用程序),其中包含一个集中式授权类的实例。该类的方法可以从应用程序的任何位置(例如ViewModels)中调用,以根据用户授予的权限启用/禁用或显示/隐藏相应的功能。


3

0
我会在客户端层创建一个静态类,其中包含当前用户的信息(角色、权限等)。这些权限可以通过枚举或类似方式进行建模,然后在每个ViewModel中,您可以定义哪些枚举值是必需的,例如执行查询(查看记录)或执行保存或编辑命令。

0

我会在每个命令中简单地添加一个RequiredRole属性,并添加一个CanExecute的重写方法来检查当前用户是否有执行该命令的权限。这对于命令来说已经足够了。

另一方面,显示表单的权限必须在你的屏幕导航器/选项卡主机等地方进行检查。

使用Linq to Sql获取角色和每个用户的角色,就可以完成了。对于如此简单的任务,我不会费心去集成外部代码。

如果你想要更通用化,可以在数据库中保留一个将命令/表单与角色关联起来的表,并使用反射来授权用户。

希望你会觉得这些信息有用。


0
我们使用AD来确定用户所属的角色,然后检查任何一个角色是否具有正确的权限。但是您可以使用rolesuserroles表来自行完成此部分。
使用这两种方法之一,用户将处于一组角色中。这是第一步。
然后,在执行操作时,您需要验证用户是否具有权限。我们的菜单结构是从数据库动态构建的,因此我有一个MenuItems表,然后是定义RoleMenuAvailability的表。
第一个表具有IdorderTitleImage sourcenavigation target,以及其他一些字段。
第二个表具有RoleIdmenuId以及它是否可编辑。因此,行的存在意味着它是可读的(如果是导航目标即表单)。然后从数据库中读取菜单项:
var usersItems =
    items.Where(i => i.RoleMenuAvailabilities
                    .Any(r => domainUser.IsInDomainRole(r.UserRole.Description)))
         .OrderBy(m => m.MenuOrder);

UserRole.Description 在我们的情况下是 AD 角色的名称,而 IsInDomainRole 是一个辅助函数:

public bool IsInDomainRole(string role)
{
    var regex = new Regex("[^\\\\]+$");
    string name = this.Name ?? string.Empty;
    string domainRole = regex.Replace(name, role);
    return this.IsInRole(domainRole);
}

rolemenuavailability表可以扩展,增加删除、更新、添加等附加标志。

我们还没有完全实现下一阶段,但意图是将用户权限缓存到用户中。我们的ViewModel基类引用了用户,因此可以调用CanEdit(int permissionId)函数。然后,控制可见性或命令CanExecute的属性可以访问用户权限,并查找他们是否具有任何操作的权限。

这仍然是一个正在进行中的工作,所以很想看看这里还有什么其他建议。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接