我有一个由10个功能组成的桌面应用程序,有些客户端仅询问8个功能或7个功能。 我想有办法管理添加/删除客户端的权限/功能(只有我可以控制)。这样我就可以根据旗帜隐藏/显示功能。
是应该通过一个属性文件来完成的,该文件包含带有布尔标志的特征的名称,还是什么?
请给我一些想法,谢谢。
答案 0 :(得分:2)
您应该考虑使用许可证管理API来执行相同操作,这将为您提供更改许可证前/后安装的安全性和功能。
不建议建立特殊许可能力,看看License3j和TrueLicense,它们都是免费的,可以帮助您获得视角或更好地满足您的要求
答案 1 :(得分:2)
从你的其他答案中,听起来像是出现了以下额外细节;如果我有这些错误,请告诉我:
在这种情况下,我将“活动”特征列表存储在存储在绑定到.jar的.properties文件中的散列属性值中。我将在下面描述一种方法。您在交付之前生成属性文件,将文件添加到jar:
jar -uf applicationJarFile.jar configuration.properties
然后签署.jar并交付它。在运行时,您的应用程序可以加载属性文件,运行每个功能的哈希值,与您存储的属性进行比较,并确定哪些功能已关闭或打开。
您的属性决定了哪些功能已启用,可能包含以下列表:
feature1=enabled
feature2=disabled
feature3=disabled
feature4=enabled
自己编写一个实用程序,它将整个字符串“feature1 = enabled”加上一个盐值,例如“优点1 = enabledaKn087 * ^ H5 jbAS5yt”。 (这有内置于java的代码;例如,请参阅How can I generate an MD5 hash?。)结果将是一个不透明的16字节数字,然后您可以将其存储在另一个属性文件中以包含在您的应用程序中:feature1 = 1865834 ....应该在您的代码中将salt值分解为多个较短的字符串,这样您的客户就无法检索它并轻松地自行复制该过程。
在你的应用程序中,在启动时,使用“enabled”和“disabled”值构造上面的字符串,运行两者的MD5,并将其与存储的哈希进行比较。这将告诉你要启用哪些功能。
我认为单独的.jar或.properties是一个坏主意;它使你的交付变得混乱。
您可以非常轻松地自动完成整个过程,因为您可以随时动态生成属性,并将它们绑定到您的应用中。
您可以添加其他“烘焙”属性,为您提供最终交付物的大量灵活性,包括为客户品牌设置外观等。
正如其他人所指出的那样:根据产品的其他细节和总体目标,有很多方法可以解决这个问题。考虑到上述假设,这是一种方法。 AFAIK,没有“规范”的方式来做这类事情。
答案 2 :(得分:1)
您可以尝试在文件中对其进行编码。我假设每个用户都有自己的应用程序安装/版本,对吧?我进一步假设应用程序不需要检查一些Web资源。因此,您需要在文件中实现它。
但是,您应该对该文件进行加密,并将salt和key放在代码中的某个位置,以便无法轻松地对其进行反编译。另外,创建一个哈希来检查文件的修改。该哈希可以基于应用程序的大小或其他内容。
请注意,没有100%的安全性,任何黑客仍然可以破解您的应用程序。但在这种情况下,这需要某种形式的犯罪能量,这种能量在商业世界中并不常见。
答案 3 :(得分:1)
模块化应用程序并仅向每个客户端部署他想要/有权访问的那些部分。有很多方法可以做到这一点(最完整但重量级的是OSGi),具体取决于您的具体情况和要求。
实现它的最快方法可能是简单地在单独的JAR中提取额外的功能,并在部署时适当地更新类路径。
答案 4 :(得分:0)
这取决于应用程序的类型,您想要的安全类型以及可能使用该应用程序的人数。
如果客户端数量不是那么大,您可以将他们的偏好存储在某些内存数据结构中,例如Map。否则,您可以使用文件系统或数据库,具体取决于您想要的安全类型。
答案 5 :(得分:0)
这是非常开放的 - 这取决于你想要达到的目标,以及你对某个功能的意义。
一种方法是使用基于插件的架构。例如你有一个界面
public interface Feature {}
并提供您的十个功能中的每一个作为此接口的实现者。然后有一些在应用程序启动时运行的方法,它在类路径中查找Feature
个子类。
您可以通过仅包括类路径上的相关功能来控制客户端具有哪些功能,例如:使用maven。