本地开发集成炎黄AWS PAAS插件
已有
aws客户端可以从跳过安装步骤,直接阅读 “使用idea启动AWS平台”
安装AWS客户端
aws服务端安装包下载地址
Linux版本:https://pan.baidu.com/share/init?surl=q8MB6q1FBHHCe00jnbF22w
密码:986e
win版本:https://pan.baidu.com/share/init?surl=vZorhYd-KPxY3SGJY4tR9g
密码:qhci
1.解压AWS程序的压缩包
2.打开文件夹并找到install.bat文件并打开

3.开始安装aws 程序,根据自己需求安装aws

4.在数据库配置时,选择自己使用的数据库,输入数据库名时,可以选择已有的数据库(数据库名不能出现特殊字符如:_下划线,-分割线等),也可以在安装时创建数据库,安装时会自动创建和初始化数据库,后面就根据自己的需求一步一步进行就好
5.安装好aws程序之后打开数据库的orguser表,查看是否出现中文乱码的问题,若出现了中文乱码的问题可以重置数据库,删除所有数据表,在安装安装好的程序目录中找到对应数据库的脚本(我的目录:D:\release\db_script),在数据库中运行就好,
测试aws是否安装成功
1.找到安装文件的目录找到文件下的bin目录并打开
2.找到httpd-startup.bat和startup.bat程序,依次打开

3.打开浏览器,在地址栏输入localhost:8088/portal/console

4.输入admin(用户名)/1(初始密码)完成登录,aws服务在本地安装完成
使用IDEA启动AWS PAAS 程序
1.访问https://github.com/haiifenng/AWSIdeaPlugin/blob/master/AWSIdeaPlugin. zip 下载插件 zip
`
下载完成后会得到 AWSIdeaPlugin.zip 的压缩包(注意:不需要解压)`
2.打开 IDEA 开发工具,将 AWSIdeaPlugin.zip 设置到idea的 Plugin 中,选 择后会提示重启 IDEA,进行重启即可。

3.修改平台文件名称,将文件修改成 release(此过程非常重要)

4.打开开发工具,创建 java 项目 选择 java 项目,JAVAEE

5.然后下一步,不需要勾选 Createprojectfromtemplate


6.等待项目加载完毕
7.加载完毕后点击 Tools,然后再次点击 AWSLibrarieag 更新

8.此刻已将平台 aws_lib 资源创建完毕,接着点击 File-ProjectStructrue , 然后点击 Libraries,会出现 aws_lib,代表资源引入完毕

9.点击 Modules,选择到 Dependencies,点击加号,选择 library,选择到 aws_lib

10.最后一步,设置启动脚本

HZERO平台
- 
HZERO平台的使用可以参照HZERO平台文档:https://open.hand-china.com/hzero-docs/v1.2/zh/docs/ - 
本次任务主要使用的是平台的菜单配置功能,直接在文档的搜索框中搜索菜单配置,可详细阅读菜单配置功能
 
HZERO集成 AWS-PaaS 开发
HZERO集成AWSPaaS时, 只需要在aws工程内实现一个插件,我们称之为Oauth插件,在Oauth插件里实现对hzero请求的验证。 在hzero中配置路由(路由配置在本节的第五小节可以查看)时也比较简单,下面是一个例子:
http://XXXXXX/portal/r/or?cmd=CLIENT_USER_HOME&oauthName=test&access_token=XXX
其中 cmd 的值可以是访问aws应用端的 cmd,oauthName 参数是必须的参数,参数值是注册oauth插件时的名称,
access_token是HZERO平台登录的token
Oauth 插件开发
Oauth插件需要继承自com.actionsoft.bpms.commons.oauth.AbstractOauth类, 继承后需要实现 4 个方法,下面是一个例子:
public class TestOauth extends AbstractOauth {
@Override public boolean hasOauthPage() {
    return false; 
} 
    @Override 
    public String getOauthPage(RequestParams params) {
        return null; 
    } 
    @Override 
    public String validate(RequestParams params) throws IOException {
        return null;
    }
	@Override 
    public long getCookieTime(UserModel user) {
        return 0; 
    }
}
- 
hasOauthPage()方法- 这个方法代表是否有登录授权页,返回的值取决于三方系统提供的 
SSO 认证方式。一类认 证方式如Oauth2.0认证,需要先跳转到三方系统的登录授权页面,授权成功后再跳转到调 用方指定的页面,这类认证方式下,hasOauthPage()方法需要返回true。 另外一类认证时不 需要跳转到登录授权页, 会直接传过来ticket或者token参数,hasOauthPage()方法需要返 回false。 
@Override public boolean hasOauthPage() { return false; } - 这个方法代表是否有登录授权页,返回的值取决于三方系统提供的 
 - 
getOauthPage()方法- 如果 
hasOauthPage()方法返回的值是false, 返回null即可。如果hasOauthPage()方法返回 的值是true,则此处返回三方系统的登录授权页地址 
public String getOauthPage(RequestParams params) { StringBuilder redriectUrl = new StringBuilder(); redriectUrl.append(SDK.getConfAPI().getPortalUrl()).append("/r/ov?cmd=OAUTH_VALIDATE");//此处构造的是三方系统授权成功后重定向到 AWS 系统的页面地址 Map<String, String> map = params.asMap(); for(String key : map.keySet() ){ if (key.equals("responseType")){ redriectUrl.append("&").append(key).append("=").append("token"); }else { redriectUrl.append("&").append(key).append("=").append(map.get(key)); } } StringBuilder urlBuidler = new StringBuilder(); try { urlBuidler.append("http://hzeronb.saas.hand-china.com/oauth/oauth/authorize?").append("response_type=token&client_id=hzero-front-dev").append("&redirect_uri=") .append(URLEncoder.encode(redriectUrl.toString(), "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(System.err); } return urlBuidler.toString(); }redriectUrl: 重定向到AWS系统的页面地址urlBuidler:hzero平台的认证地址和 重定向到AWS系统的页面地址 - 如果 
 - 
Validate()方法Validate方法用来验证来自三方系统的请求是否可信。如果不可信,返回null即可,如果可信,则返回识别出的loginName:
 
  public String validate(RequestParams params) throws IOException {
       Map<String,String> map= params.asMap();
       StringBuilder url = new StringBuilder();
       url.append("http://hzeronb.saas.hand-china.com/iam/hzero/v1/users/self");
        for(String key : map.keySet() ){
            if (key.equals("access_token")){
                url.append("?").append(key).append("=").append(map.get(key));
            }
        }
        String loginName = this.getHzeroUsername(url.toString());//获取hzero账户的用户名
        return loginName;
        }
- 
getCookieTime()方法- 为避免每次登录到
AWSPaaS都进行认证,我们提供了Session保存到Cookie中的机制。getCookieTime()方法用来指定Session在Cookie中多长时间失效。 返回 0 时不保 存, 小于 0 时关闭浏览器时session失效, 大于 0 时session将在相应的秒数后过期。 
public long getCookieTime(UserModel user) { //下面的值代表与 AWS PaaS 会话过期时间一致 //因平台会话过期时间以分钟计,所以需要乘以 60 return user.getSessionTime() * 60; } - 为避免每次登录到
 - 
getHzeroUsername()方法- 获取当前浏览器中登录
hzero的用户信息 
public String getHzeroUsername(String redirectUrl){ String location = null; String res=""; JsonObject object = null; StringBuilder buffer = new StringBuilder(); InputStream is = null; InputStreamReader isr = null; BufferedReader br = null; try{ URL url = new URL(redirectUrl); HttpURLConnection urlCon= (HttpURLConnection)url.openConnection(); if(200==urlCon.getResponseCode()){ is = urlCon.getInputStream(); isr = new InputStreamReader(is,charSetName); br = new BufferedReader(isr); String str = null; while((str = br.readLine())!=null){ buffer.append(str); } res = buffer.toString(); JsonParser parse =new JsonParser(); object = (JsonObject) parse.parse(res); } }catch(IOException e){ LOGGER.debug("this "+redirectUrl +"has error"); }finally { if (br!=null) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } if (object!=null){ Set<Map.Entry<String, JsonElement>> set = object.entrySet(); Iterator<Map.Entry<String, JsonElement>> iterable = set.iterator(); while (iterable.hasNext()){ Map.Entry<String , JsonElement> entry = iterable.next(); if ("loginName".equals(entry.getKey())) { location = entry.getValue().toString(); location= location.substring(1,location.length()-1); if (UserCache.getModel(location)!=null){ return location; } } } } return null; } - 获取当前浏览器中登录
 
Oauth 插件注册
在 PluginListener 中注册Oauth插件,定义 Oauth 插件名称。 插件名称在hzero访问 AWS PaaS 系统时会用到。
public class Plugins implements PluginListener {
	public Plugins() { 
	} 
    @Override 
    public List<AWSPluginProfile> register(AppContext context) { 
        List<AWSPluginProfile> list = new ArrayList<AWSPluginProfile>();
//Oauth 插件注册名称为 ‘test’ , TestOauth.class就是上面开发的TestOauth类
        list.add(new OauthPluginProfile("test",TestOauth.class.getName(), ""));
		return list;
	}
}
访问
http://localhost:8088/portal/r/or?cmd=CLIENT_USER_HOME&oauthName=test&access_token=XXXX
- 其中
test为Oauth插件注册的名称 - 在浏览器打开该地址就能访问
aws应用端了 
Oauth插件打包
- 打开
idea>File-ProjectStructrue>Artifacts 





- 
在release/bin目录下创建一个plugs文件夹,并将打包好的jar包放在plugs文件夹中
 - 
重启aws服务端
 
Oauth插件配置
1.打开并登录aws paas的控制端(localhost:8088/portal/console)
2.打开应用管理下的应用开发菜单
3.打开配置应用
4.在下拉框中选择AWS Portal门户

5.进入配置页面,选择监听器
6.在插件中添加自己写的PluginListener(填写包名.类名)

Oauth插件测试
1.在浏览器中打开
http://localhost:8088/portal/r/or?cmd=CLIENT_USER_HOME&oauthName=test&access_token=XXXX

2.浏览器向aws发送请求,根据OauthName指向我的写的PluginListener监听器
3.然后会调用自己书写的TestOauth插件
4.身份认证成功后
5.就会直接跳转到aws的应用端界面(跳过登录过程)

6.身份认证失败,则会弹出认证失败的页面程)

Hzero平台上配置aws客户端
1.登录hzero平台,在搜索框中输入“菜单配置” , 进入菜单配置界面


2.点击右上角的新建按钮,弹出新建菜单,新建左侧导航栏菜单

- 
类型:根目录(位于平台左侧导航栏)
 - 
层级:平台层/租户层
 - 
目录编码:
hzero.aws(根据需求填写) - 
目录名称:
炎黄AWS PAAS(根据菜单性质填写,简洁明了) - 
快速索引:
YHAWS 
3.创建好导航栏根目录之后,创建子菜单


- 类别:选择内部链接(一定要选择内部链接不然在平台内无法登录aws应用端)
 - 链接编码:
AWS PAAS 客户端 - 链接名称:根据菜单性质填写
 - 路由:访问
AWS PAAS 客户端的路由(上节测试中的链接:http://localhost:8088/portal/r/or?cmd=CLIENT_USER_HOME&oauthName=test,链接上不需要再拼接access_token=xxx信息,内部链接会自动拼上access_token) 4.创建完成之后,就可以在平台导航栏上看到创建的菜单 

修改aws应用的配置文件
将
aws嵌入到平台上需要的配置,新开页面不需要修改配置文件
- 打开
aws平台后会浏览器控制台会报出:Uncaught DOMException: Blocked a frame with origin "http://XXXXXX:8088" from accessing a cross-origin frame跨域 

此时需要修改aws应用中的配置文件
- 
idea打开项目只需要打开全局替换(ctrl+shift+r)
 - 
脚本修改:创建一个
run.sh文件git pull export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true find -name '*.js' | xargs sed -i "s top.window window g" echo ">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" 
进入aws应用下的\webserver\webapps下portal运行文件即可(我的文件目录为D:\release\webserver\webapps\portal)
运行测试
- 
登录
hzero平台,在导航栏菜单上找到炎黄aws,点击炎黄aws下的aws客户端进入aws应用端 - 
在
hzero平台下可以直接打开aws应用端的界面,使用当前hzero用户进行登录,aws应用端页面的所有功能都可以在平台内使用 
