1

您能否建议我哪种设计模式可用于具有不同用户角色的应用程序(Web 应用程序)。我的应用程序有一个 Admin、HR、Managers、Assistant Managers 和 Staffs

Admin 有权访问 Web 应用程序中的每个页面 HR 只能访问少数页面,例如第 1 页和第 2 页(注意 Admin 以后可以将权限添加到更多页面) 经理 - 经理可以查看相应的员工

ETC

是否有任何设计模式来实现上述功能。由于将来可以添加更多用户角色和页面

谢谢

4

4 回答 4

4

一般来说,在设计用户角色时,装饰者模式是合适的解决方案。

于 2012-09-28T13:01:28.520 回答
2

好吧,我知道这是一个旧帖子.. 但这是我为类似的东西设计的,你可以有任意数量的角色。最初,每个用户在登录后都是访问者,他们可以拥有任何用户角色。我为此使用了装饰器模式。

另外我添加了数据库和通信接口。(大多数网络应用程序都需要这个)我使用了策略设计模式,因此用户可以拥有各种数据库类(Mysql,MsSql)和各种通信方式(Email,SMS)。同样,您可以添加自己的支付接口来处理各种类型的支付选项。

图像

于 2014-08-17T09:46:39.403 回答
1

如果您在页面级别阻止访问,您将在一个或另一个安全框架(如 spring security)中找到所需的一切。

如果您希望能够锁定对某些功能的访问,有一些选项。

对于大多数这些选项,最好不要使用角色,而是使用权限。一个角色可以有多个权限。这提供了很大的灵活性。

您可以查看一些 MVC 派生。那里的控制器上的方法可以得到保护。您可以将每个功能映射到权限。

如果将此与命令模式结合使用,则可以在此级别添加安全性,然后权限将一对一映射到命令。有了这个,让 UI 控件反映当前用户的权限变得非常容易。(参见 Delphi 和 Spring 中的操作

最后一个选项对我来说是最漂亮和用户友好的。

于 2012-09-28T10:28:30.560 回答
0

我知道这是一篇非常古老的帖子,但我一直在寻找相同的答案,但从未找到可接受的答案。装饰者模式一开始似乎是最明显的,但这并不是我真正想要的,因为所有角色都必须实现相同的方法(我们是否真的希望客户拥有 BlockUserAccount() 方法,即使它不这样做什么?),并且每次实施新行为时都必须扩展每个角色。

相反,我通过实验发现委托模式的变体似乎是最好的。我说“变体”是因为我所读到的关于委托模式的所有内容都涉及主对象的超类,但这不是我最终要做的。

我所做的是使用一个基本的用户对象,它包含一组角色。这些角色被定义为完全不同类型的类,每个都有自己的方法,每个都有自己的接口。然后根据需要委派角色。

public interface ICustomerAlaCarte 
{
    void AuthorizePayment(decimal paymentAmount); 
}

public abstract class UserRole { }

public class CustomerAlaCarte : UserRole, ICustomerAlaCarte 
{
    public void AuthorizePayment(decimal paymentAmount) 
    {
        // Logic here
    } 
}

public class User
{
    private List<UserRole> _userRoles;

    public void AddUserRole(UserRole newRole)
    {
        _userRoles.Add(newRole);
    }

    public ICustomerAlaCarte AsAlaCarteCustomer()
    {
        ICustomerAlaCarte alaCarteRole = _userRoles.OfType<ICustomerAlaCarte>().FirstOrDefault();

        if (alaCarteRole != null)
        {
            return alaCarteRole;
        }
        else
        {
            throw new UserRoleNotAssignedException(); // Custom exception
        }
    }
}

然后使用:

var user = new User();
user.AddUserRole(new CustomerAlaCarte());

ICustomerAlaCarte customer = user.AsAlaCarteCustomer();
customer.AuthorizePayment(9.99);

使用这种模式,您甚至可以拥有嵌套角色。例如,您可以有一个用户 admin 和一个报表管理员,并且每个都将从 Admin 继承。当您只需要基本的管理功能(或身份)时,您将拉取一个 Admin 委托,但您也可以为上述 BlockUserAccount() 行为指定 IUserAdmin,因为每个角色只有对其有意义的方法。

于 2019-03-14T13:28:26.030 回答