为具有不同用户角色的应用程序建议设计模式

时间:2012-09-28 06:46:02

标签: design-patterns

您能否告诉我哪种设计模式可用于具有不同用户角色的应用程序(Web应用程序)。我的应用程序有管理员,人力资源,经理,助理经理和员工

管理员有权访问Web应用程序中的每个页面 HR只有权访问第1页和第2页的少数页面(请注意,管理员可以在以后为更多页面添加特权) 经理 - 管理人员可以在那里查看相应的员工

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

由于

4 个答案:

答案 0 :(得分:4)

通常,在设计用户角色时,Decorator Pattern是合适的解决方案。

答案 1 :(得分:2)

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

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

img

答案 2 :(得分:1)

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

如果您希望能够锁定对某些功能的访问权限,可以选择一些选项。

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

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

如果将其与command pattern结合使用,则可以在此级别添加安全性,然后权限将一对一映射到命令。通过这种方式,让UI控件反映当前用户的权限变得非常容易。 (see Actions in Delphi and Spring

这最后一个选项对我来说是最美丽和用户友好的。

答案 3 :(得分:0)

我知道这是一篇很老的文章,但是我一直在寻找相同的答案,但从未找到可接受的答案。一开始,Decorator模式似乎最明显,但这并不是我真正想要的,因为所有角色都必须实现相同的方法(我们是否真的希望客户拥有一个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继承。当您只需要基本的管理功能(或身份)时,可以拉出一个Admin委托,但是您也可以为上述BlockUserAccount()行为指定IUserAdmin,因为每个角色仅具有对其有意义的方法。