【问题标题】:Which pattern to use for simple c# users permissions?哪种模式用于简单的 c# 用户权限?
【发布时间】:2013-05-01 17:24:48
【问题描述】:

我需要一个建议。我正在开发一个管理大学学生项目的程序。 (我自己学生,这是我第二年的项目)。使用 c# .NET 4,WINFORMS。

我有不同的用户,拥有不同的权限。我不想使用重量级的解决方案,比如使用 DB、添加 GROUPS、...

我想要一个非常简单的解决方案,并且,我需要为此至少使用 23 种编程模式中的一种。

我了解了抽象工厂、策略、单例等基本模式......但我无法选择正确的模式。

如果我使用基本继承,那么我需要重写子级中的一些方法,以“什么都不做”,因为它们继承了父级的所有方法...

有什么想法吗?主要目标是使用设计模式。

抱歉英语不好:)


评论太长了,我就写到这里吧……

我知道我只需要在需要的地方使用模式。但是,去告诉我的老师=))

他希望我在我的程序中使用 3 种模式。例如,我使用 Singleton 连接到 MySQL。

所以我需要再使用 2 个模式。

它是如何工作的。有人进入系统。我在静态类 Auth 中创建“指针”来登录用户:

static class Auth
{
   public static CommonUser _currentUser;

   public static CommonUser getUser()
   {
      return Auth._currentUser;
   }
}

例如,如果老师已登录,我会这样做:

Auth._currentUser = new Teacher(id, name, blablba, blabla, blabla);

如果他想添加,比如说,新项目,他点击按钮 ADD PROJECT,表单 Add Project 被调用,他填写所有输入,点击 ADD 然后我必须要求:

Auth._currentUser.addProject(projectId, projectTitle, ....);

如果管理员登录到系统,那么添加新项目,我这样做:

Auth._currentUser = new Admin(id, name, blablba, blabla, blabla);

然后调用相同的方法。

Auth._currentUser.addProject(projectId, projectTitle, ....);

但是这里的metod addProject 是一样的,所以我必须使用继承。

但如果 Seretary 登录我会这样做:

Auth._currentUser = new Seretary(id, name, blablba, blabla, blabla);

而且秘书必须没有权限这样做:

Auth._currentUser.addProject(projectId, projectTitle, ....);

所以我需要重写秘书类中的 addProject 方法并将其设为空,或者调用 MessageBox 吗?

类似的东西......所以,他希望我在这里使用一个模式:-/ 说....如果我需要添加具有不同权限的其他人,那么我不需要在我的所有程序中进行更改...

例如一些图片(抱歉是希伯来语):

【问题讨论】:

  • 在您的数据库中有一个 ROLES 表并检查用户的角色以验证他们可以执行操作有什么问题?
  • “我需要使用 [a] 编程模式” – 这是一项可怕的任务……一定要告诉他们。您应该在有意义的地方使用模式(通常,您会自动使用它们而无需知道它们),而不是围绕它们制造问题……
  • 我认为没有“简单”权限系统的模式。也许有一个框架,但是,你应该只在真正有意义的情况下使用它。 EG 一个不会超过单个页面的单个网页,MVC 可能更麻烦,值得。
  • 您能否告诉我们更多关于您的用户是如何创建的以及他们如何与系统交互的信息(例如“添加研究”是如何实现的?是在秘书用户中吗?是否有研究存储库?)

标签: c# design-patterns user-permissions


【解决方案1】:

一种方法是使用 Command(或 Action)模式,其中封装了每个操作(例如 Add Research)在一个对象中。这允许在实际执行操作之前在中心位置检查权限。

实际的权限检查通常通过将用户映射到角色/组并为每个组定义一组允许的操作来完成。这可以使用 Microsoft 的 Authorization Manager 或数据库中的简单角色表来实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多