如何开发一个权限控制插件(Not Permission)

Skip to end of metadata



Go to start of metadata


 

在本教程中,我们将遵循开发插件  开发我们的Not Permission插件的  指导原则。 有关更多详细信息步骤,请参阅第一个教程  如何开发一个Bean Shell哈希变量插件


1.什么问题?

我想配置userview权限或表单权限不在组,部门或其他 


2.你有什么想法来解决这个问题?

我们可以开发一个  Userview权限/表单权限插件  来反转其他权限插件的结果。


3.你的插件需要什么输入?

要开发一个Not Permission插件,我们可以考虑提供以下内容作为输入。

  1. 权限:配置一个权限插件来得到相反的结果。
  2. 必须登录用户:只有当用户也是登录用户时,结果才有效。

4.你的插件的输出和预期结果是什么?

配置的权限插件的反向值。


5.有没有可重用的资源/ API?

您可以参考  如何开发甘特图用户视图菜单如何重用现有的插件。


6.准备你的开发环境

我们需要始终准备好Joget Workflow Source Code,并按照这个指导方针建立起来  。 

本教程的以下内容是使用Macbook Pro和Joget源代码5.0.0版编写的。 其他平台命令请参考  如何开发插件

让我们说我们的文件夹目录如下。 

- Home

  - joget

    - plugins

    - jw-community

      -5.0.1

“plugins”目录是我们要创建和存储我们所有插件的文件夹,“jw-community”目录是Joget Workflow源代码存储的地方。

运行以下命令在“plugins”目录下创建一个maven项目。

cd joget/plugins/

~/joget/jw-community/5.0.1/wflow-plugin-archetype/create-plugin.sh org.joget.tutorial not_permission 5.0.1

然后,shell脚本将要求我们为您的插件输入一个版本,并在生成maven项目之前要求我们确认。

Define value for property 'version': 1.0-SNAPSHOT: : 5.0.0

[INFO] Using property: package = org.joget.tutorial

Confirm properties configuration:

groupId: org.joget.tutorial

artifactId: not_permission

version: 5.0.0

package: org.joget.tutorial

Y: : y

我们应该在终端上显示“BUILD SUCCESS”消息,在“plugins”文件夹中创建一个“not_permission”文件夹。

用你喜欢的IDE打开maven项目。我将使用  NetBeans。 


7. Just code it!

a. 扩展插件类型的抽象类

在“org.joget.tutorial”包下创建一个“NotPermission”类。然后,用org.joget.apps.userview.model.UserviewPermission  抽象类扩展  该类并实现org.joget.apps.form.model.FormPermission接口。请参阅  Userview权限/表单权限插件


b. 实现所有的抽象方法

像往常一样,我们必须执行所有的抽象方法。我们将使用AppPluginUtil.getMessage方法来支持i18n,并使用常量变量MESSAGE_PATH作为消息资源包目录。

Implementation of all basic abstract methods

 Expand source


然后,我们必须为管理员用户提供一个UI来为我们的插件提供输入。在getPropertyOptions方法中,我们已经指定了  插件属性选项和配置  定义文件位于“/properties/notPermission.json”。让我们在“not_permission / src / main”目录下创建一个“resources / properties”目录。创建目录后,在“properties”文件夹中创建一个名为“notPermission.json”的文件。

在属性定义选项文件中,我们需要提供如下的选项。请注意,我们可以在我们的属性选项中使用“@@ message.key @@”语法来支持i18n。

[{

    title : '@@userview.notpermission.config@@',

    properties : [{

        name : 'permission',

        label : '@@userview.notpermission.permission@@',

        type : 'elementselect',

        options_ajax : '[CONTEXT_PATH]/web/property/json/getElements?classname=org.joget.apps.userview.model.UserviewPermission',

        url : '[CONTEXT_PATH]/web/property/json[APP_PATH]/getPropertyOptions'

    },

    {

        name : 'loggedIn',

        label : '@@userview.notpermission.loggedIn@@',

        type : 'checkbox',

        value : 'true',

        options : [{

            value : 'true',

            label : ''

        }]

    }]

}]

在完成收集输入的属性选项后,我们可以使用isAuthorize方法。

@Override

public boolean isAuthorize() {

    boolean isAuthorize = false;

    try {

        if ("true".equals(getPropertyString("loggedIn")) && WorkflowUtil.isCurrentUserAnonymous()) {

            return false;

        }

         

        //get the binder

        Object permissionData = getProperty("permission");

        if (permissionData != null && permissionData instanceof Map) {

            Map pMap = (Map) permissionData;

            if (pMap != null && pMap.containsKey("className") && !pMap.get("className").toString().isEmpty()) {

                PluginManager pluginManager = (PluginManager) AppUtil.getApplicationContext().getBean("pluginManager");

                UserviewPermission permission = (UserviewPermission) pluginManager.getPlugin(pMap.get("className").toString());

                if (permission != null) {

                    Map pProps = (Map) pMap.get("properties");

                    permission.setProperties(pProps);

                    permission.setCurrentUser(getCurrentUser());

                    permission.setRequestParameters(getRequestParameters());

                     

                    isAuthorize = !permission.isAuthorize();

                }

            }

        }

    catch (Exception e) {

        LogUtil.error(getClassName(), e, "");

    }

    return isAuthorize;

}

c. 管理你的插件的依赖库

这个插件没有额外的依赖。


d. 让你的插件国际化(国际化)准备就绪

我们在getLabel和getDescription方法中使用i18n消息密钥。我们还在我们的属性选项定义中使用了i18n消息密钥。所以,我们需要为我们的插件创建一个消息资源包属性文件。

在“not_permission / src / main”目录下创建目录“resources / messages”。然后,在该文件夹中创建一个“NotPermission.properties”文件。在属性文件中,让我们添加所有的消息键和它的标签如下。

org.joget.tutorial.NotPermission.pluginLabel=Not Permission

org.joget.tutorial.NotPermission.pluginDesc=Used to reverse the result of other permission plugin

userview.notpermission.config=Configure Not Permission

userview.notpermission.permission=Permission

userview.notpermission.loggedIn=Must be Logged In User

e. 注册你的插件在Felix框架中

我们将不得不在Activator类(在同一个类包中自动生成)中注册我们的插件类,以告诉Felix框架这是一个插件。

public void start(BundleContext context) {

    registrationList = new ArrayList<ServiceRegistration>();

    //Register plugin here

    registrationList.add(context.registerService(NotPermission.class.getName(), new NotPermission(), null));

}

f. 建设和测试

让我们建立我们的插件。一旦构建过程完成,我们将在“not_permission / target”目录下创建一个“not_permission-5.0.0.jar”文件。

然后,让插件jar上传到  管理插件。上传jar文件后,仔细检查插件是否正确上传和激活。

让我们打开一个用户视图,并将其中一个类别权限更改为不允许。我们希望当前用户不在“Managers”组中。

完成配置并保存用户视图。让我们来测试它。首先检查管理员用户是否在“Managers”组中。

检查用户视图,在“管理员”组中未配置的“Personal”类别显示正确。

现在,将“admin”用户分配给“Mangers”组。

“Personal”类别现在消失了。


8. 再进一步,分享或出售

您可以从not_permission.zip下载源代码  。

要下载现成的插件jar,请在http://marketplace.joget.org/上找到它  。

文档更新时间: 2018-11-06 06:26   作者:李庆