2012-07-30 69 views
1

我有一个由10个功能组成的桌面应用程序,有些客户只要求8个功能或7个功能。 我想有一个方法来管理添加/删除客户端的权限/功能(只有我可以控制)。这样我可以隐藏/显示基于标志的功能。在桌面应用程序中设置权限/功能?

是应该通过一个属性文件来完成的,该文件包含带有布尔标志的特征的名称,或者是什么?

请给我一些想法,谢谢。

回答

2

从其他的答案,它的声音,我如下面的附加细节已经出现;请让我知道,如果我有错,这些:

  1. 你提供你的应用程序作为一个.jar文件,
  2. 每个客户直接从你得到他们的身材,并有一个小的客户,
  3. 您可以为每个客户专门配置一个版本,并且
  4. 您不希望您的客户能够修改其功能访问。

在这种情况下,我会将存储在.properties文件中的哈希属性值存储在.jar中的“活动”功能列表中。我将在下面描述一种方法。您在交付之前生成属性文件,将文件添加到罐子中:

jar -uf applicationJarFile.jar configuration.properties 

然后签署.jar并将其交付。在运行时,您的应用可以加载属性文件,运行每个功能的散列,与您存储的属性进行比较,并确定哪些属性关闭或打开。

你的属性,确定哪些功能被启用,可能包含这样的名单:

feature1=enabled 
feature2=disabled 
feature3=disabled 
feature4=enabled 

写自己一个工具,它散列整个字符串“特征1 =启用”加一个盐值,例如“优点1 = enabledaKn087 *^H5 jbAS5yt”。 (例如,有一些内置于java的代码;例如,参见How can I generate an MD5 hash?。)结果将是一个不透明的16字节数字,然后您可以将其存储在另一个属性文件中以包含在您的应用程序中:feature1 = 1865834 ....盐值应该在代码中分成多个较短的字符串,以便您的客户无法检索它并轻松地自行复制该过程。

在您的应用程序启动时,您使用“启用”和“禁用”值构造上面的字符串,运行两者的MD5,并将其与存储的散列进行比较。这会告诉你什么功能启用。

我认为单独的.jar或.properties是一个坏主意;它混乱你的交付。

您可以很容易地自动化整个过程,因为您可以随时随地生成属性,并将它们绑定到您的应用程序中。

您可以添加其他“烘焙”属性,这为您提供了最终交付成果中的许多灵活性,包括客户品牌塑造等功能。

正如其他人指出的那样:有很多方法可以实现这一点,具体取决于产品的其他细节和总体目标。考虑到上述假设,这是做到这一点的一种方法。 AFAIK,没有“规范”的方式来做这种事情。

0

这取决于应用程序的种类,您想要的安全类型以及可能使用该应用程序的人数。

如果客户端数量不是那么大,您可以将他们的首选项存储在内存数据结构中,比如Map。否则,您可以使用文件系统或数据库,具体取决于您想要的安全类型。

+0

我应该如何管理这些偏好?从安装程序? – 2012-07-30 08:54:46

+0

客户端应该能够更新正确的偏好设置吗?所以给出默认偏好设置作为安装的一部分,并在您的应用程序中添加代码,该代码需要客户端首选项并在必要时进行更新。 – Byter 2012-07-30 09:59:06

+0

客户端不应该能够更改此权限,因为它涉及此应用程序中客户端可用的功能。 – 2012-07-30 12:30:03

1

您可以尝试在文件中对其进行编码。我假设每个用户都有自己的安装/版本的应用程序,对吧?我进一步假设应用程序不需要检查一些网络资源。因此你需要在一个文件中实现它。

但是,您应该对该文件进行加密,并将盐和密钥放置在代码中不易被反编译的地方。另外创建一个散列来检查文件的修改。该散列可以基于应用程序的大小或其他内容。

请注意,没有100%的安全性,任何黑客都可能破解你的应用程序。但在这种情况下,这将需要商业界不常见的某种形式的犯罪​​能量。

+0

,所以你有一个属性文件的想法,但我应该在生成最终的jar之前手动从IDE管理这个文件吗?或者有更好的方法来做到这一点? – 2012-07-30 09:04:46

+0

那么,你可以在IDE中管理文件,但在这种情况下,你可能无法提供他们不应该得到的功能。或者提供所有功能,但使用加密文件启用/禁用它们。您需要考虑的是如何保护该文件,并根据您的客户群,您可能需要投入更多或更少的努力(商业客户通常倾向于不破解应用程序:))。 – Thomas 2012-07-30 09:17:07

+0

我不明白这个部分“或者提供所有的功能,但使用加密文件启用/禁用它们”你的意思是该文件应该在jar之外?以及如何更改加密文件?你能澄清一点吗? – 2012-07-30 09:23:43

0

这是非常开放的 - 它取决于你想要达到什么,以及你的功能是什么。

一种方法是使用基于插件的体系结构。例如你有一个接口

public interface Feature {} 

并提供你的每个十个功能作为这个接口的实现者。然后有一些在应用程序启动时运行的方法,该方法在类路径中查找Feature子类。

您可以通过在类路径中仅包含相关的功能来控制客户端具有的功能,例如,使用maven。

+0

如果功能非常庞大,那么请查看像OSGi这样的真正的插件框架。 – StuartIzon 2012-08-03 11:36:16

+0

如果功能重叠且不容易分开,您将不得不重新考虑使您能够制作此模块并推出您自己的更多定制解决方案的能力。 – StuartIzon 2012-08-03 11:37:06

1

模块化应用程序并将其部署到每个客户端只有他想要/可以访问的那些部分。有很多方法可以完成它(最完整但重量级最大的OSGi),但具体取决于您的情况和要求。

实现它的最快方法可能是简单地在单独的JAR中提取额外的功能,并在部署中适当地更新类路径。

2

您应该考虑使用许可证管理api来执行相同的操作,这将为您提供更改许可证安装前/安装后的安全性和功能。

这是不可取的建立即席许可capabilty,看看License3jTrueLicense,它们都是免费的,可以帮助你获得新的认识和更好地满足您的要求