功能标记与授权

sme*_*eeb 9 java security authorization togglz featuretoggle

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

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

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

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

在Togglz中,我可能会像这样执行此检查:

if(MyFeatures.ShowFizzBuzz.isActive()) {
    // Show the FizzBuzz menu.
}
Run Code Online (Sandbox Code Playgroud)

比方说,Apache Shiro,我可以做同样的事情:

ShowFizzBuzzPermission showFizzBuzz = new ShowFizzBuzzPermission();
if(currentUser.isPermitted(showFizzBuzz) {
    // Show the FizzBuzz menu.
}
Run Code Online (Sandbox Code Playgroud)

再次,功能标记只是感觉像为基于角色或允许检查其完全相同的问题.

我确定我错了,但我不知道怎么回事.所以我问:功能标记与授权和角色/权限检查有何不同,具体用例是什么类型的例子?换句话说:我何时应该使用授权/角色/权限检查,何时应该使用功能标志?

ajk*_*ajk 2

我将使用Fowlers 先生的术语来表示两种类型的功能切换:

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

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

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

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

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

您可以选择忘记功能切换,因为您始终希望身份验证处于开启状态。这种切换只是引入了额外的检查和技术债务。

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

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