我有一个Java应用程序,我想使它可扩展.要创建扩展,我们公司内的开发人员将编写一个实现特定接口的Java类.他们也可能希望编写相关的帮助程序类.我想在没有中断的情况下将这些扩展加载到应用程序中.
我想限制这个类可以对以下内容做什么:
在应用程序的API中调用方法(这将是构造函数的参数)
在同一个包中创建其他对象的实例(因此扩展类的作者可以使用其他类来完成工作).
调用类时,传入的API对象已经定义了"customer"并存储为成员变量.它将使用它来限制通过API访问该客户的数据.
我不希望这些类执行诸如访问数据库,写入磁盘或以其他方式处理等事情.这主要是依赖管理和封装的努力,因为同一个开发人员团队将有权编写扩展和核心系统.
有这种模式吗?我是在正确的轨道上吗?
你不需要寻找任何异国情调.处理此方案是Java安全体系结构的基本功能.
每个类都有一个"代码库",即加载它的位置.因此,如果您将每个扩展包装在单独的JAR中(或在单独的目录中展开),您将能够定制授予该代码库的权限.
在你的情况下,它听起来更简单.如果我理解正确,所有扩展将具有相同的权限,这些权限小于父应用程序的权限.因此,他们都可以共享代码库.
以下是策略文件的示例:
grant codeBase "file:/path/to/app/lib/*" { permission java.io.FilePermission "/path/to/app/-", "read"; permission java.io.FilePermission "/path/to/app/data/-", "read,write,delete"; }; grant codeBase "file:/path/to/app/ext/*" { permission java.util.PropertyPermission "java.io.tmpdir", "read"; permission java.io.FilePermission "${java.io.tmpdir}/myapp/-", "read,write,delete"; };
这个简单的例子应该适用于任何版本的Java.较新的版本具有扩展的策略语法,以向JAAS认证的主体授予权限.