2012-10-09 97 views
4

我有一个Java类,它有一些我不想提供给任何未经授权的类的机密信息。
限制某些java包的访问

我想在某些软件包中访问这个类(这个软件包中的类将使用机密信息),这样我的安全类应该可以在这些软件包中访问。

有没有什么办法可以检查方法的调用者是否来自授权包的授权类?我知道公共/私人/默认所有的东西(所以请不要问我使用它),但这些在这里没有用,因为我想要一个类可以在一些包中访问(不是一个/相同) 。

+0

你能承受得起它的笨拙吗?您的呼叫者需要付出多少努力? –

+1

@RohitJain - 实际上有几种方法来处理这个问题,但他们需要一些努力来实现。 –

+0

你是说实际的类定义包含你想要保护的数据,还是它存储在其他地方的数据的对象载体? – Link19

回答

0

您可以使用proxy pattern,由Proxy类在Java中实现 - 它的设计完全是为了您的目的。

Here是一个如何做。

编辑:AFAIK,您不能使用静态方法的常规代理机制,因为代理和代理类必须实现通用接口。不过,还有更高级的工具,可以帮助你像javassist。不幸的是我自己并不熟悉它。

+0

嗨kostja,这对我有用:)谢谢,但如果我的类有静态方法,我可以应用相同的东西吗? – Patriks

+0

@ Patriks - 编辑答案 – kostja

1

您可以创建一个Exception(不需要将其抛出)并使用getStackTrace()来分析调用堆栈。不过,我总是觉得它很难看。

也就是说,你放入客户端机器的任何东西都容易受到该机器的影响;如果你有真正保密的东西保护你的服务器;使其仅作为服务提供。

2

Java中的可见性修饰符不是安全工具,而是OO设计工具。无论你做什么,如果有人使用你的班级,它可以使用反射访问任何班级的私人成员。

如果您的对象包含机密信息,请将这些对象留在您的安全服务器中。

5

我觉得你走错了方向。这可能是一个设计问题。

安全要求是您的业务逻辑。您应该以某种方式实现您的安全策略,而不是依赖于Java语言级别的可见性修饰符或调用者程序包名称。因为如果你把瓶子给某人,他可以无论如何都可以访问你的“保密”课程。

此外,一个类是一个类型,抽象的东西。它不应该包含“数据”。很确定有时conf信息被写成静态变量等。但是,如果某些数据是敏感的,它不应该写在课堂上。它可以存储在数据库或加密文件等。一旦对敏感信息提出请求,就会检查实施的安全策略,如果允许访问这些数据。

只是我的2分钱小费

+0

在java中没有任何方法来保护我们的.jar/.class文件吗? – Patriks

+0

@ Patriks是的!但目标是保护jar文件不被解编。或者让某人非常难以阅读/理解你的已编译的类。例如,http://www.yworks.com/en/products_yguard_about.htm。然而,这是否适合你的情况? – Kent

0

你也许可以在这里利用AspectJ的。从理论上讲,可以根据当前流程范围拦截给定类的方法的调用,并让方面抛出异常或其他东西。尽管我并不擅长,但“cflow”切入点限定词将是您最有可能的选择。也许像这样

! cflow(call(* com。mycom.AllowedClient *))

我还没有测试过这种切入点,但我相信它会起作用。

虽然你可能希望在这种情况下编译时织入(而不是加载时织入)。

作为一个侧面说明,我同意其他一些人,我认为这是错误的做法。你保护数据。您基于登录的用户权限保护功能访问。您通常不保护来自其他类的函数调用。

+1

马特你是对的,甚至我同意他们,但这不是100%来保护这些机密数据,有些%是项目设计的一部分,我只想让一些软件包访问我的一些类。并限制从某些软件包访问某些类。 – Patriks