sme*_*eeb 9 java security authorization togglz featuretoggle
我偶然发现了功能标记的概念,以及一个名为Togglz的流行的开源Java库,它引用了Martin Fowler博客文章:
基本思想是拥有一个配置文件,为您拥有的各种功能定义一系列切换.然后,正在运行的应用程序使用这些切换来决定是否显示新功能.
但对我来说,这听起来像授权:用户是否有权查看此内容?
例如,用户是否应该能够看到FizzBuzz菜单?
在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)
再次,功能标记只是感觉像为基于角色或允许检查其完全相同的问题.
我确定我错了,但我不知道怎么回事.所以我问:功能标记与授权和角色/权限检查有何不同,具体用例是什么类型的例子?换句话说:我何时应该使用授权/角色/权限检查,何时应该使用功能标志?
我将使用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 来打开和关闭它们。我认为任何复杂的功能仍然需要配置来驱动您的业务逻辑。