您能否建议我哪种设计模式可用于具有不同用户角色的应用程序(Web 应用程序)。我的应用程序有一个 Admin、HR、Managers、Assistant Managers 和 Staffs
Admin 有权访问 Web 应用程序中的每个页面 HR 只能访问少数页面,例如第 1 页和第 2 页(注意 Admin 以后可以将权限添加到更多页面) 经理 - 经理可以查看相应的员工
ETC
是否有任何设计模式来实现上述功能。由于将来可以添加更多用户角色和页面
谢谢
您能否建议我哪种设计模式可用于具有不同用户角色的应用程序(Web 应用程序)。我的应用程序有一个 Admin、HR、Managers、Assistant Managers 和 Staffs
Admin 有权访问 Web 应用程序中的每个页面 HR 只能访问少数页面,例如第 1 页和第 2 页(注意 Admin 以后可以将权限添加到更多页面) 经理 - 经理可以查看相应的员工
ETC
是否有任何设计模式来实现上述功能。由于将来可以添加更多用户角色和页面
谢谢
一般来说,在设计用户角色时,装饰者模式是合适的解决方案。
好吧,我知道这是一个旧帖子.. 但这是我为类似的东西设计的,你可以有任意数量的角色。最初,每个用户在登录后都是访问者,他们可以拥有任何用户角色。我为此使用了装饰器模式。
另外我添加了数据库和通信接口。(大多数网络应用程序都需要这个)我使用了策略设计模式,因此用户可以拥有各种数据库类(Mysql,MsSql)和各种通信方式(Email,SMS)。同样,您可以添加自己的支付接口来处理各种类型的支付选项。
如果您在页面级别阻止访问,您将在一个或另一个安全框架(如 spring security)中找到所需的一切。
如果您希望能够锁定对某些功能的访问,有一些选项。
对于大多数这些选项,最好不要使用角色,而是使用权限。一个角色可以有多个权限。这提供了很大的灵活性。
您可以查看一些 MVC 派生。那里的控制器上的方法可以得到保护。您可以将每个功能映射到权限。
如果将此与命令模式结合使用,则可以在此级别添加安全性,然后权限将一对一映射到命令。有了这个,让 UI 控件反映当前用户的权限变得非常容易。(参见 Delphi 和 Spring 中的操作)
最后一个选项对我来说是最漂亮和用户友好的。
我知道这是一篇非常古老的帖子,但我一直在寻找相同的答案,但从未找到可接受的答案。装饰者模式一开始似乎是最明显的,但这并不是我真正想要的,因为所有角色都必须实现相同的方法(我们是否真的希望客户拥有 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,因为每个角色只有对其有意义的方法。