11

我刚刚偶然发现了特性标记的概念,以及一个流行的开源 Java 库,称为Togglz,它引用了 Martin Fowler 的博客文章:

基本思想是有一个配置文件,它为你有待处理的各种功能定义了一堆切换。然后,正在运行的应用程序使用这些切换来决定是否显示新功能。

但对我来说,这听起来真的很像授权用户是否有权查看此内容?

例如,用户是否应该能够看到 FizzBu​​zz 菜单?

在 Togglz 中,我可能会像这样实现此检查:

if(MyFeatures.ShowFizzBuzz.isActive()) {
    // Show the FizzBuzz menu.
}

在 Apache Shiro 中,我可以做同样的事情:

ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
if(currentUser.isPermitted(showFizzBuzz) {
    // Show the FizzBuzz menu.
}

再次,功能标记感觉就像它与角色或权限检查完全相同的问题。

我确定我错了,但我不知道怎么做。所以我问:功能标记与授权和角色/权限检查有何不同,哪些类型的具体用例体现了这种差异?换句话说:什么时候应该使用授权/角色/权限检查,什么时候应该使用功能标志?

4

2 回答 2

2

对于两种类型的功能切换,我将使用Fowlers 先生的术语:

  • 业务切换:将是支持所有状态的长期配置功能。
  • 发布切换:旨在帮助从旧的或不存在的实现过渡到“新”实现。这样做的目的是在工作完成后淘汰旧的工作方式。这使您能够在“新”方式未完成时保留当前的工作方式。大多数人都同意应尽可能避免这些。

功能标记与授权和角色/权限检查有何不同,哪些类型的具体用例体现了这种差异?

我认为授权和角色/权限检查是业务切换实现下的配置。身份验证是您的业务切换功能,Shiro 将是帮助您配置和实施身份验证功能的工具。Togglz 是一个实现业务切换或版本切换的框架。它可以用于身份验证功能

如果您使用 Togglz 打开/关闭身份验证,然后使用 Shiro 强制执行用户配置,您的代码将如下所示:

if(MyFeatures.ShowFizzBuzz.isActive()) {
  ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
  if(currentUser.isPermitted(showFizzBuzz) {
    // Show the FizzBuzz menu.
  }
}

您可能会选择忘记功能切换,因为您总是希望启用身份验证。切换只是引入了额外的检查和技术债务。

什么时候应该使用授权/角色/权限检查,什么时候应该使用功能标志?

我认为这个决定取决于你。我会说授权是一个特性,你可以使用 Shiro 来实现它。您的应用程序可能有许多超出 Shiro 范围的其他功能,并让您想使用 Togglz 来打开和关闭它们。我认为任何复杂的功能仍然需要配置来驱动您的业务逻辑。

于 2015-02-02T15:04:51.417 回答
1

我不会回答 Togglz 背后的逻辑。在FF4J文档(Java 的功能翻转)中,您可以找到一个清晰的架构来解释差异。

功能切换与授权

功能是一种处理,一种可以在运行时通过专用的 Web 控制台启用和禁用的功能。这应该是切换代码的​​主要驱动程序:我需要通过配置激活/停用吗?

一旦您确定功能切换机制将具有很大的价值(您可以在 ff4J.org 页面底部找到一些用例),您就可以检查权限。

在功能切换上下文中检查权限意味着执行“金丝雀发布”:在为所有人打开之前为有限的用户子集打开一个新功能。

于 2015-11-01T13:33:47.627 回答