您能否告诉我哪种设计模式可用于具有不同用户角色的应用程序(Web应用程序)。我的应用程序有管理员,人力资源,经理,助理经理和员工
管理员有权访问Web应用程序中的每个页面 HR只有权访问第1页和第2页的少数页面(请注意,管理员可以在以后为更多页面添加特权) 经理 - 管理人员可以在那里查看相应的员工
等
是否有任何设计模式可以实现上述功能。由于将来可以添加更多用户角色和页面
由于
答案 0 :(得分:4)
通常,在设计用户角色时,Decorator Pattern是合适的解决方案。
答案 1 :(得分:2)
嗯,我知道它是一个老帖子......但是这里我设计的类似的东西,你可以有任意数量的角色。最初,每个用户在登录后都是访问者,他们可以拥有任何用户角色。我已经使用了装饰器模式。
加上我添加了数据库和通信接口。 (大多数Web应用程序需要这个)我使用了策略设计模式,因此用户可以拥有各种数据库类(Mysql,MsSql)和各种通信方法(Email,SMS)。同样,您可以添加自己的支付界面来处理各种类型的支付选项。
答案 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,因为每个角色仅具有对其有意义的方法。