javascript
使用Java Servlet,JSP标签和Stormpath快速构建Java Web App
建筑物身份管理,包括身份驗證和授權? 嘗試Stormpath! 我們的REST API和強大的Java SDK支持可以消除您的安全風險,并且可以在幾分鐘內實現。 注冊 ,再也不會建立auth了!
我們剛剛發布了Java SDK的主要升級版本,現在包括Java Webapp(Servlet 3.0+)支持以及大量用戶自動化功能。 只需將我們的Servlet插件放入您的Java Web應用程序中,然后開始繁榮—無需編寫代碼即可進行即時用戶管理。
這篇文章是一個快速教程,向您展示如何快速建立具有完整的身份驗證和用戶管理功能以及使用Stormpath的用戶界面的Java Web應用程序。
如果您已經構建了Java Web應用程序,那么您將了解建立適當的身份驗證和用戶管理所涉及的時間和痛苦 。
即使您使用了Apache Shiro或Spring Security這樣的出色框架,仍然有很多無聊的UI工作和高風險的后端工作。
至少,除了處理每個視圖的控制器,注銷處理程序等之外,您還必須構建用于注冊,登錄和忘記密碼的UI屏幕。
然后,您必須擔心安全性問題,例如密碼哈希方案,隨著計算的改進而更新哈希算法,跨站點請求偽造(CSRF)保護,跨站點腳本(xss)攻擊等等。
Stormpath可以連接到典型的Java Web應用程序,并為開發人員提供了開箱即用的所有身份驗證,授權和用戶安全性,因此您可以繼續進行真正關心的應用程序。 實際上,您無需編寫任何代碼即可獲得完整的用戶界面。 太棒了
到本教程完成時(不到15分鐘),您將擁有一個功能全面的Java Web應用程序。 我們將重點介紹具有大量用戶自動化功能的Stormpath-Servlet插件。 您只需將插件放到Web應用程序中便可以蓬勃發展–無需編寫代碼即可進行即時用戶管理。
您將在此Java Servlet教程中構建什么:
您將使用標準的Servlet 3+和JSP API構建一個簡單的Java Web應用程序。 完成后,您將能夠:
- 使用電子郵件和密碼創建(注冊)新的用戶帳戶
- 驗證新用戶帳戶的注冊電子郵件地址
- 使用電子郵件和密碼登錄(認證)您的新帳戶
- 登錄后顯示可自定義的用戶帳戶儀表板,僅已登錄的用戶可以訪問
- 將嘗試訪問儀表板的未經身份驗證的用戶重定向到登錄頁面
- 允許登錄用戶注銷
- 允許用戶通過基于電子郵件的忘記密碼工作流程重置密碼
這是最好的部分–對于上述所有方面, 您無需編寫任何代碼 -只需進行一些配置即可!
但是,僅出于娛樂目的,我們將編寫一個簡單的歡迎頁面和一個用戶帳戶儀表板頁面,這些頁面很可能存在于實際應用程序中。
此示例的所有代碼都在Stormpath Java SDK項目中 。
聽起來不錯? 大! 讓我們開始吧!
您需要什么:Stormpath,JDK,Maven或Gradle
- 約15分鐘的時間
- 與Stormpath通信的Stormpath API密鑰
- JDK 1.6或更高版本
- Maven 3.0+或Gradle 2.2+
如何完成本指南
如果您已經設置了Stormpath API密鑰并使用Maven / Gradle構建了項目,則可以從頭開始并完成每個步驟,也可以跳過基本的設置步驟 。
從頭開始教程
如果您想從頭開始,則需要首先獲得一個Stormpath API密鑰 。
然后,您將需要根據自己的喜好使用Maven或Gradle進行構建 。
下載Stormpath API密鑰
與Stormpath的所有通信都必須通過API密鑰進行身份驗證。
- Unix,Linux和Mac OS上的~/.stormpath/apiKey.properties
- Windows上的C:\Users\YOUR_USERNAME\.stormpath\apiKey.properties
在Windows上,您可以類似地設置API密鑰文件權限 。
使用Maven構建項目
選擇您要用于項目的目錄。 在該目錄中,創建以下maven pom.xml文件:
pom.xml
使用Gradle構建項目
選擇您要用于項目的目錄。 在該目錄中,創建以下build.gradle文件:
build.gradle
跳過教程基礎
將依賴項添加到您的Web應用程序(.war)項目中:
Maven:
<dependency><groupId>com.stormpath.sdk</groupId><artifactId>stormpath-servlet-plugin</artifactId><version>1.0.RC9.2</version> </dependency>搖籃:
dependencies {compile 'com.stormpath.sdk:stormpath-servlet-plugin:1.0.RC9.2' }構建應用程序的目錄結構
我們需要在各個目錄中創建一些文件。 確保項目目錄下存在以下目錄結構:
-- src/|-- main/|-- java/| |-- tutorial/|-- webapp|-- WEB-INF/|-- jsp/|-- tags/例如,在* nix操作系統上:
mkdir -p src/main/java/tutorial mkdir -p src/main/webapp/WEB-INF/jsp mkdir -p src/main/webapp/WEB-INF/tags使用JSP標簽為您的應用創建頁面模板
我們可能希望我們的Web應用程序頁面具有相同的外觀。 我們可以使用頁面模板輕松地做到這一點。 而且,由于JSP 2.0通過JSP標簽自動支持頁面模板,因此無需引入其他模板庫。 讓我們創建一個包含以下內容的新模板標簽文件:
src/main/webapp/WEB-INF/tags/page.tag
這只是擴展名為.tag而不是.jsp的標準JSP文件。 的 元素將被使用此模板的任何頁面的頁面內容替換。
寫一個家庭控制器
出于安全原因,我們希望確保在請求期間絕對不能直接訪問JSP文件本身。 相反,我們希望Controller處理請求,然后將JSP呈現給請求。 為此,我們將創建一個簡單的“ Home”控制器,該控制器呈現內部home.jsp頁面:
src/main/java/tutorial/HomeController.java:
src/main/webapp/WEB-INF/jsp/home.jsp:
<%@ page session="false"%> <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><t:page><jsp:attribute name="title">Welcome!</jsp:attribute><jsp:body><div class="jumbotron" id="welcome"><h1>Welcome to the Stormpath Webapp Sample Application!</h1><p class="lead"><br/><br/>Welcome to this <i>gloriously simple</i><a href="https://docs.stormpath.com/java/servlet-plugin/">Stormpath Java Webapp</a> sample application!<ul><li>First, take a look through this very basic site.</li><li>Then, check out this project's source code<a href="https://github.com/stormpath/stormpath-sdk-java/examples/servlet">on GitHub</a>.</li><li>Lastly, integrate Stormpath into your own sites!</li></ul></p><br/><br/><h2>What This Sample App Demonstrates</h2><br/><br/><p>This simple application demonstrates how easy it is to register, login, and securely authenticateusers on your website using the Stormpath Servlet Plugin.</p><p>Not a Stormpath user yet? <a href="https://stormpath.com">Go signup now!</a></p><br/><br/><p class="bigbutton"><a class="bigbutton btn btn-lg btn-danger"href="${pageContext.request.contextPath}/register" role="button">Register</a></p></div></jsp:body> </t:page>最后,我們需要添加一個web.xml文件,以告知servlet容器在訪問Web應用程序的默認路徑時調用我們的Home Controller:
src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><servlet><servlet-name>HomeController</servlet-name><servlet-class>tutorial.HomeController</servlet-class></servlet><servlet-mapping><servlet-name>HomeController</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/assets/*</url-pattern></servlet-mapping></web-app>使用Maven或Gradle啟動Webapp
您是否可以相信,在添加單個主頁后,您將擁有一個具有完整用戶管理功能的功能性Web應用程序?
不相信我嗎? 試試吧!
使用您選擇的構建工具,讓我們啟動Web應用程序。 例如:
Maven:
搖籃:
gradle tomcatRun打開瀏覽器,然后訪問http://localhost:8080 。 您將在上方看到我們剛剛創建的主頁:
太酷了! 現在,老實說,這并不令人興奮。 那畢竟是應該發生的。 但是令人敬畏的功能-您一直在等待的部分-都是自動的東西。 例如,登錄頁面!
嘗試Stormpath用戶登錄頁面
單擊頁面右上方的“ Login按鈕,或手動訪問http://localhost:8080/login ,您將看到以下信息:
那就對了! 內置了最佳實踐跨站點請求偽造(CSRF)保護的登錄頁面, 您無需編寫任何內容 。 既然是真棒! 您可以使用完整的國際化(i18n)功能自定義以什么順序顯示哪些字段,以及根據需要定制整個外觀。 這超出了本文的范圍,但是如果需要,您可以稍后閱讀有關自定義視圖的信息 。
當然,它還不止這些–您可以獲得各種各樣的好東西,例如用戶帳戶注冊,電子郵件驗證和忘記密碼自動操作,令牌身份驗證等等!
向Stormpath注冊新用戶
現在,您必須先創建用戶帳戶,然后才能登錄,然后繼續并單擊“創建帳戶”鏈接,或手動訪問http://localhost:8080/register頁面,您將看到以下內容:
繼續并填寫并提交表單-您將獲得一個新的用戶帳戶,可用于立即登錄。
驗證用戶電子郵件地址
現在,如何進行電子郵件驗證? 許多Web應用程序都希望確保新注冊的用戶必須先驗證其電子郵件地址,然后才能登錄該應用程序。 這有助于確保:
- 電子郵件地址不能被不擁有電子郵件地址的人濫用
- 應用程序可以根據需要與用戶進行通信
- 注冊過程是由人類完成的(而不是執行自動注冊的“機器人”,它可能會用于惡意目的)。
這也涵蓋了! 您只需要按照文檔中所述啟用電子郵件驗證即可。 由于這是一個簡短的教程,我們將繼續進行,但是如果您愿意,可以嘗試將其打開。
注銷您的用戶
如果您仍然登錄,請單擊右上方的logout按鈕。 這將訪問/logout ,它將自動注銷您,然后默認情況下將您重定向回Web應用程序的上下文根頁面( / )(您可以稍后自定義下一個URI)。
我們還將對Web應用程序進行另一項更改,因此請繼續并按CTRL-C關閉該應用程序。
為忘記密碼,更改密碼等實施視圖
該插件還支持其他開箱即用的視圖,您可以在文檔中閱讀這些視圖。 但是,在結束本教程之前,我們想向您展示另外一件事:訪問控制。
使用Stormpath實施訪問控制(授權)
Stormpath Java Webapp插件還具有根據URI路徑實施訪問控制的功能。 例如你
可以確保只有經過身份驗證的用戶才能訪問您應用程序中的/account URI。 或者那也許僅僅是
admin組中的帳戶可以訪問/admin URI。
為了說明這一點,我們將創建一個/dashboard視圖,只有經過身份驗證的用戶才能看到。 這代表一個常見的“登錄頁面”,登錄后可能立即顯示用戶。
讓我們創建一個“儀表板”控制器:
src/main/java/tutorial/DashboardController.java
package tutorial;import com.stormpath.sdk.account.Account; import com.stormpath.sdk.directory.CustomData; import com.stormpath.sdk.lang.Strings; import com.stormpath.sdk.servlet.account.AccountResolver;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;public class DashboardController extends HttpServlet {private static final String VIEW_TEMPLATE_PATH = "/WEB-INF/jsp/dashboard.jsp";@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String birthday = "";String color = "";Account account = AccountResolver.INSTANCE.getAccount(req);if (account != null) {CustomData data = account.getCustomData();birthday = (String)data.get("birthday");color = (String)data.get("color");}req.setAttribute("birthday", birthday);req.setAttribute("color", color);req.getRequestDispatcher(VIEW_TEMPLATE_PATH).forward(req, resp);}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String birthday = req.getParameter("birthday");String color = req.getParameter("color");//get the currently-logged-in account:Account account = AccountResolver.INSTANCE.getAccount(req);if (account != null) {CustomData data = account.getCustomData();if (Strings.hasText(birthday)) {data.put("birthday", birthday);} else {data.remove("birthday");}if (Strings.hasText(color)) {data.put("color", color);} else {data.remove("color");}data.save();}req.setAttribute("birthday", birthday);req.setAttribute("color", color);req.getRequestDispatcher(VIEW_TEMPLATE_PATH).forward(req, resp);} }DashboardController展示了一個非常好的Stormpath功能:可以將您自己的自定義數據直接“附加”到Stormpath REST資源,例如用戶帳戶的生日或喜歡的顏色。
讓我們創建將由控制器渲染的視圖文件:
src/main/webapp/WEB-INF/jsp/dashboard.jsp
<%@ page session="false"%> <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="t" tagdir="/WEB-INF/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><t:page><jsp:attribute name="title">Dashboard</jsp:attribute><jsp:body><div class="dashboard"><div class="row"><div class="col-lg-12"><div class="jumbotron"><h1>Dashboard</h1><br/><br/><p>Welcome to your user dashboard!</p><p>This page displays some of your account information and also allows you to change customdata.</p><p>If you click the Logout link in the navbar at the top of this page, you'll be logged outof your account and redirected back to the main page of this site.</p><br/><br/><h2>Your Account Custom Data</h2><br/><br/><p>Your Email: <span class="data">${account.email}</span></p><c:set var="noBirthday" value="You haven't entered a birthday yet!"/><p>Your Birthday: <span class="data">${!empty account.customData['birthday'] ? account.customData['birthday'] : noBirthday}</span></p><c:set var="noColor" value="You haven't entered a color yet!"/><p>Your Favorite Color: <span class="data">${!empty account.customData['color'] ? account.customData['color'] : noColor}</span></p><br/><br/><p>Stormpath allows you to store up to 10MB of custom user data oneach user account. Data can be anything (in JSON format). The aboveexample shows two custom fields (<code>birthday</code> and<code>color</code>), but you can add whatever fields you'd like.</p><p>You can also store complicated nested JSON documents!</p><br/><br/><h2>Update Custom Data</h2><br/><br/><p>If you enter values below, we'll send and store thesevalues with your user account on Stormpath.</p><p>Please note, we are not doing any validation in this simpleexample -- in a real world scenario, you'd want to check user input on the server side!</p><br/><br/><form method="post" class="bs-example form-horizontal" action="${pageContext.request.contextPath}/dashboard"><div class="form-group"><label for="birthday" class="col-lg-2 control-label">Birthday</label><div class="col-lg-4"><input type="text" class="form-control" id="birthday" name="birthday" placeholder="mm/dd/yyyy"value="${!empty account.customData['birthday'] ? account.customData['birthday'] : ''}"></div></div><div class="form-group"><label for="color" class="col-lg-2 control-label">Favorite Color</label><div class="col-lg-4"><input type="text" class="form-control" id="color" name="color" placeholder="color"value="${!empty account.customData['color'] ? account.customData['color'] : ''}"></div></div><div class="form-group"><div class="col-lg-10 col-lg-offset-2"><button type="submit" class="btn btn-primary">Update Custom Data</button></div></div></form></div></div></div></div></jsp:body> </t:page>而且,我們需要更新web.xml以將新視圖告知Servlet容器。 web.xml現在應如下所示:
src/main/webapp/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.1"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"><servlet><servlet-name>HomeController</servlet-name><servlet-class>tutorial.HomeController</servlet-class></servlet><servlet-mapping><servlet-name>HomeController</servlet-name><url-pattern>/</url-pattern></servlet-mapping><servlet><servlet-name>DashboardController</servlet-name><servlet-class>tutorial.DashboardController</servlet-class></servlet><servlet-mapping><servlet-name>DashboardController</servlet-name><url-pattern>/dashboard</url-pattern></servlet-mapping><servlet-mapping><servlet-name>default</servlet-name><url-pattern>/assets/*</url-pattern></servlet-mapping></web-app>為您的應用配置Java Servlet插件
請注意,到現在為止,我們沒有需要配置插件本身都 :一切都只是工作“。 但是現在我們有了一些特定于應用程序的實施規則,我們需要通過一個簡單的stormpath.properties配置文件告訴插件該做什么。 讓我們創建這個文件:
src/main/webapp/WEB-INF/stormpath.properties
stormpath.web.login.nextUri = /dashboardstormpath.web.uris./dashboard = authc- 第一行表示“用戶成功登錄后,我希望他們訪問的下一個URI是/dashboard ”。 插件的登錄控制器將自動將新認證的用戶重定向到此位置。
- 第二行表示“為了使任何人都可以訪問/dashboard URI,必須對其進行身份驗證('authc'是'authenticated'的縮寫)。 這將強制所有請求由有效的用戶帳戶進行身份驗證,然后再允許其繼續。 如果不是,它們將被重定向到登錄頁面以首先登錄,然后自動被重定向回其最初請求的URI。
運行更新的應用程序
現在,我們已經添加了儀表板視圖和控制器,以及一個簡單的stormpath.properties文件,讓我們嘗試一下!
如果還沒有,請按CTRL-C關閉應用程序。
現在啟動它:
Maven:
mvn tomcat7:run搖籃:
gradle tomcatRun現在嘗試訪問http://localhost:8080/dashboard –您將按預期重定向到登錄名。 使用您先前創建的用戶帳戶登錄,然后它將自動將您重定向回儀表板。 真好!
Stormpath Java Servlet插件-高級功能
恭喜你! 您現在擁有了一個完整的Web應用程序,其中包括自動用戶注冊,登錄,忘記密碼/重置工作流,注銷,自定義數據編輯和訪問控制執行!
但是,我們只是摸索了您可以做的事情。 還支持:
- 具有國際化(i18n)支持的完全默認視圖自定義。
- 授權斷言(基于帳戶數據(例如用戶名),它們屬于的組等)
- 針對Javascript和移動客戶端的令牌身份驗證(我們為您實現了OAuth)
- 用戶名/密碼和API密鑰的HTTP基本身份驗證
- 事件偵聽器對登錄,注銷,注冊等事件做出反應。
- 緩存可增強性能。
- 用于自定義身份驗證或授權規則的便捷過濾器鏈定義。
- Easy Stormpath SDK客戶端配置和請求訪問
- 和更多!
請參閱完整的Stormpath Java Servlet插件文檔以獲取完整信息。
建筑物身份管理,包括身份驗證和授權? 嘗試Stormpath! 我們的REST API和強大的Java SDK支持可以消除您的安全風險,并且可以在幾分鐘內實現。 注冊 ,再也不會建立auth了!
翻譯自: https://www.javacodegeeks.com/2016/07/build-java-web-app-quickly-java-servlet-jsp-tags-stormpath.html
總結
以上是生活随笔為你收集整理的使用Java Servlet,JSP标签和Stormpath快速构建Java Web App的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓es文件管理器(安卓es)
- 下一篇: 什么是Spring Boot以及为什么它