Java 功能标记与授权

Java 功能标记与授权,java,security,authorization,featuretoggle,togglz,Java,Security,Authorization,Featuretoggle,Togglz,我刚刚偶然发现了特性标记的概念,以及一个流行的开源Java库,它引用了Martin Fowler的一篇博文: 其基本思想是拥有一个配置文件,该文件为您拥有的各种待定功能定义了一系列切换。然后,正在运行的应用程序使用这些切换来决定是否显示新功能 但对我来说,这听起来真的像是授权:用户有权查看此内容吗 例如,用户是否应该能够看到FizzBuzz菜单 在Togglz中,我可以这样实现此检查: if(MyFeatures.ShowFizzBuzz.isActive()) { // Show th

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

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

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

例如,用户是否应该能够看到FizzBuzz菜单

在Togglz中,我可以这样实现此检查:

if(MyFeatures.ShowFizzBuzz.isActive()) {
    // Show the FizzBuzz menu.
}
比如说,在ApacheShiro中,我可以做完全相同的事情:

ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
if(currentUser.isPermitted(showFizzBuzz) {
    // Show the FizzBuzz menu.
}
同样,功能标记感觉就像是角色或权限检查一样的问题

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

我将用于两种类型的功能切换:

  • 业务切换:将是支持所有状态的长期配置功能
  • 释放切换:用于帮助从旧的或不存在的实现过渡到“新的”实现。这样做的目的是在工作完成后,放弃旧的工作方式。这使您能够在“新”方式未完成时保留当前工作方式。大多数人都同意在可能的情况下应该避免这些
特性标记与授权和角色/权限检查有何不同,哪些类型的具体用例举例说明了这种差异

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

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

if(MyFeatures.ShowFizzBuzz.isActive()) {
  ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
  if(currentUser.isPermitted(showFizzBuzz) {
    // Show the FizzBuzz menu.
  }
}
您可以选择忘记功能切换,因为您总是希望启用身份验证。切换只是引入了额外的检查和技术债务

何时应使用授权/角色/权限检查,何时应使用功能标志


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

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

功能是一种治疗,一种可以在运行时通过专用web控制台启用和禁用的功能。这应该是切换代码的主要驱动程序:是否需要通过配置激活/取消激活

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

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