TIP:相应的代码在step-7文件夹中(https://github.com/vert-x3/vertx-guide-for-java-devs)java
在这个章节中咱们在Vert.x实现安全和访问控制是简单的,咱们将作下面的事情:git
1.把http改为用httpsgithub
2.添加基于组的权限的用户身份验证web
3.用JSON web tokens (JWT)控制访问的APIapache
Vert.x的HTTPS支持浏览器
Vert.x支持SSL-encrypted的网络链接,常见的在生产环境提供HTTP server服务,经过像Nginx这样的HTTP服务/proxy,使用HTTPS来处理链接服务。固然Vert.x自身也能够提供HTTPS而且end-to-end encryption。安全
证书能够存储在java keystore文件中,你可能须要建立一个测试证书,这里是如何建立一个server-keystore.jks keyStore服务器
咱们能够经过HttpServerOptions在建立HTTP服务的地方加入KeyStore文件来支持SSL微信
咱们可使用浏览器访问 https://localhost:8080/,由于那个证书是self-signed,因此会在好的浏览器的认证中提示安全警告信息。网络
而后,咱们须要更新测试用例ApiTest中的,web client请求的代码:
1.设置SSL为true
2.既然那个证书是self-signed,咱们须要选择相信它,不然链接会失败,就像浏览器上看到的同样。
访问控制和认证
Vert.x提供了不少的身份认证和受权的可选项,官方支持模块包括知名厂商的JDBC, MongoDB, Apache Shiro, OAuth2和 JWT (JSON web tokens)。
在下一节将涵盖JWT,将使用Apache Shiro 来作认证,LDAP or Active Directory服务返回认证信息。在咱们的例子里,在咱们的例子中咱们能够简单的将凭证存储在属性文件中,但对一个LDAP服务器API的使用是同样的。
目标是要求用户使用wiki须要验证,和基于角色的权限控制:
1.若是不是某种角色只能浏览
2.若是有写的角色就能够编辑页面
3.若是有编辑的角色就能够建立,编辑和删除页面
4.若是有管理员权限,那能够有全部的权限了
WARNING:
关于Vert.x与Apache Shiro集成内部实现有一些问题,部分阻塞可能影响性能,一些数据的存储使用了 thread local,你不该该滥用内部API。
添加Apache Shiro认证
第一步咱们先把vertx-auth-shiro模块加入pom.xml中:
在配置文件中定义了咱们使用的,位于src/main/resources/wiki-users.properties
带有user-前缀的是用户帐号,第一个字段是密码,后面接着的是角色。好比bar用户的密码是bar,角色事writer,writer有update的权限。
回到HttpServerVerticle类中,咱们使用 Apache Shiro建立一个一个权限认证提供者:
ShiroAuth对象用于处理服务端的用户会话:
1.咱们为请求创建一个用户会话吹程序
2.当请求尚未用户会话的时候将会重定向到登陆页面
3.咱们将加入authHandler用来认证
最后咱们须要建立3个请求,用于登陆,提交表单,注销:
1.FormLoginHandler用于处理登陆请求,默认状况下,HTTP的post请求中有登录信息的username,password,return_url用于重定向到成功页面。
2.注销用户的瘦须要清除RoutingContext终端额会话信息。
下面是RoutingContext的实现:
HTML页面的模板 src/main/resources/templates/login.ftl
页面显示的效果:
支持基于角色的功能
功能是更具用户的权限来的,在下面的截图,管理员角色能够建立一个网页和执行备份:
用户没有角色不能执行这些操做:
咱们能够访问RoutingContext,来查询权限信息。下面是indexHandler方法实现:
1.这是是查询权限,是个异步操做
2.操做result
3.应用到HTML模板中
4.获取登陆信息
咱们修改模板中的代码,来渲染canCreatePage的显示:
这个代码和更新或者删除的页面和访问Git repository的处理是同样的。
不单单在HTML页面须要检查HTTP POST请求的数据,在服务端的处理程序也须要检查。事实上,恶意攻击者能够根据请求执行不被认证的权限,这里的pageDeletionHandler程序用来保护页面删除的权限控制:
原文连接:http://vertx.io/docs/guide-for-java-devs/
个人微信公众号: