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/
個人微信公衆號: