本地开发集成炎黄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.3/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
应用端页面的所有功能都可以在平台内使用