我刚刚偶然发现了功能标记的概念,以及一个流行的开源 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.
但对我来说,这听起来确实像授权:用户是否被授权查看此内容?
例如,用户是否应该能够看到 FizzBuzz 菜单?
在 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/