2012-11-03 44 views
7

与在所有业务线应用程序中一样,应用程序可能有多个Users,其中一些Roles分配给它们。我们最近转向了WPF MVVM体系结构,并正在寻找为每个登录用户分配角色的最佳方式。在互联网上有很多条款像认证,角色管理,登录服务等等,但我不确定要解决哪些问题。为应用程序用户分配角色

这里是我们所拥有的:

小型企业应用程序(具有20个表格),单项目中开发的。我们使用MVVM体系结构,LINQ-to-SQL作为DataAccess和Model,使用Repository patternUnit Of Work

我们所希望的:

有不同的形式,每种形式都有插入更新删除打印等操作。我们想要的是根据他的角色限制登录的用户 - 他可以执行的任务。即例如用于管理员可以随意使用应用程序执行“任何事情”,而其他一些用户可能不允许查看某些表单或执行某些操作(即更新或删除)。

那么我们该如何实现呢?在桌面LOB应用程序中使用MVVM体系结构执行这种完整的机制可以使用哪种服务。技术术语或教程链接将有所帮助。

我希望我很清楚,非常感谢你提前。

编辑:我经历了很多论坛和文章,但他们都专注于ASP.NET。仍然无法找到WPF中角色分配的具体实现。而ASP.NET的源代码并不符合WPF。

+0

你用还是你滚你自己什么MVVM框架? –

+1

我们有同样的问题。大多数权限都是硬编码的。我们计划实施完全成熟的ACL。我的同事提供了WCF角色服务(http://msdn.microsoft.com/en-us/library/bb386424(v=vs.100).aspx)作为现成的基础架构。但是我们仍然不确定在视图模型中应用权限的最佳方式,因为我们想尽可能避免硬编码。我们也决定看看棱镜。我们怀疑它包含所需的功能。 –

+0

顺便说一下,你有没有考虑过使用AOP来完成这个任务? http://izlooite.blogspot.ru/2010/06/aspect-oriented-programming.html http://stackoverflow.com/questions/325558/aspect-oriented-programming-examples http://www.sharpcrafters .com/ 免责声明:我是这种方法的新手,几乎一无所知。但代码联系人是相似的,所以我认为它可以提供帮助。 –

回答

4

我建议打造一个ASP.NET Membership & Role Management提供商的解决方案(尽管修改您原来的问题)。他们在MSDN &上有很好的文档非常灵活。

这里有几个链接,应该有希望帮助您与WPF集成:

另外,你提到你正在使用MVVM;我建议拥有一个静态类,或者集中授权类实例的全局访问属性(请参阅:WPF Application using a global variable)。然后,可以从应用程序中的任何位置(即在ViewModels中)调用此类的方法,以基于授予用户的任何权限来启用/禁用或显示/隐藏适当的功能。

0

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

0

我只是简单地在每个命令中放入一个RequiredRole属性,并添加一个CanExecute覆盖,它检查当前用户是否有权执行此操作。这对命令来说已经足够了。

在另一方面,显示表单权利必须在你的屏导体/标签主机进行检查/ ...

取的角色和使用LINQ每个角色发售者对SQL语句,它结束了。我不会为了这么简单的任务而集成外部代码。

如果您希望使其更通用,请在您的数据库中保存一个链接命令/表单和角色的表,并使用反射来授权用户。

我希望你会发现有用的

0

我们使用AD来确定用户所属的角色。然后检查任何角色是否具有正确的权限。但是,您可以使用rolesuserroles表格自行完成此部分。

使用这两种方法中的任何一种,用户都将成为一组角色。这是第一步。

然后,您需要在操作点验证用户是否有权限。 我们的菜单结构是从数据库动态构建的,因此我有一个表格MenuItems,然后是一个表格,定义了RoleMenuAvailability

首先有一个Id,一个orderTitleImage 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可以访问用户权限,并查看它们是否具有任何操作的权限。

这仍然是一个工作正在进行中,所以会有兴趣看看有什么其他的建议出现在这里。

相关问题