java - 功能标记与授权

标签 java security authorization featuretoggle togglz

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

The basic idea is to have a configuration file that defines a bunch of toggles for various features you have pending. The running application then uses these toggles in order to decide whether or not to show the new feature.

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

例如,用户是否应该能够看到 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.
}

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

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

最佳答案

我要使用 Mr. Fowlers terminology对于两种类型的功能切换:

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

How is feature flagging different than authorization and role/permission checking, and what types of concrete use cases exemplify this difference?

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

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

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

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

When should I use authorization/role/permission checking, and when should I use feature flags?

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

关于java - 功能标记与授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27064718/

相关文章:

java - 使用 jenkins 构建 netbeans 项目时,如何在 list 文件中设置版本信息?

java - 为 HttpOnly 和 Secure 设置了 JSESSIONID

java - 如何创建规则(HTTP 请求重定向不应受到伪造攻击 - RSPEC-5146)java 插件

javascript - 我无法使用 React Native 的 axios API 登录

asp.net-mvc - Hot Towel 模板中的身份验证/授权

java - 导入文件时避免使用完整文件路径

java - 如何使用 lsp-java 在 emacs 上打开一个 maven 项目?

java - fb 中的操作 :request form is always null

Java 堆栈自省(introspection)

c# - 如何通过Azure应用程序注册实现多资源授权?