我有一种情况需要扩展某些行为,而我仍然坚持如何正确设计它。 用户可以看到所有报告的列表。报告现在是简单的POJO
class Report {
...
}
可以在给定报告上调用一组操作。现在要求对于某些报告,他们应该定义允许的操作。例如。您可以在ReportOne上运行“ActionA”和“ActionB”,在ReportTwo上运行“ActionB”,在ReportThree上运行所有操作(现在)。此外,报告的可见性受到限制,因此如果没有足够的权限,某些用户将无法查看给定的报告。
我正在考虑创建报告的子类,如下所示:
class ReportWithCustomActionsAllowed extends Report {
private Set<Action> allowedActions;
public Set<Actions> getAllowedActions() {
return actions;
}
....
}
class ReportWithPermission extends Report {
...
private String permissionName = "ReportA.VIEW";
public boolean canShowTo(User user) {
return user.hasPermission(permissionName);
}
}
这里有两件事我错了:
1)如果不创建另一个类
,则无法创建允许自定义操作的受限报告 2)拥有Set<Report>
我无法限制操作/报告而不用instanceof
进行攻击,这显然是错误的。
如何通过OOP正确实现这一要求?并非每个报告都应该关注权限,并且报告可以包含允许的空行动列表(这意味着任何人都无法访问操作。这并不意味着允许所有操作。)
答案 0 :(得分:1)
对于这些操作,您可以调整“Chain of Responsibility”设计模式。
对于访问权限,通常的方法是不要让报告关心权限,而是有一个外部安全管理器,它维护一个允许谁做什么的列表,以及何时调用一个动作,检查是否允许调用该操作的角色执行此操作。这实际上是一件非常复杂的事情,因此如果您想要更好的建议,您可能希望更准确地指定您的安全要求的范围。
答案 1 :(得分:0)
我不确定详细信息,但我会选择一个抽象类Report
并使用一个抽象方法getActions(User user)
并使该方法抛出UserAccessException
或类似的东西这一点。
abstract class Report {
abstract public Set<Action> getActions(User user) throws UserAccessException;
}