<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 21. Beginner's Webapp Tutorial 初學者web應用教程 # 21. Beginner's Webapp Tutorial 初學者web應用教程 本文是一篇循序漸進介紹用 Apache Shiro 保護 web 應用程序的教程。 它假定讀者已經具備了 Shiro 的入門知識,并假設至少熟悉以下兩個介紹性文檔: - [用Shiro保護你的應用安全](22.%20Application%20Security%20With%20Apache%20Shiro%20%E7%94%A8Shiro%E4%BF%9D%E6%8A%A4%E4%BD%A0%E7%9A%84%E5%BA%94%E7%94%A8%E5%AE%89%E5%85%A8%20.md) - [Apache Shiro 十分鐘教程](20.%2010%20Minute%20Tutorial%20%E5%8D%81%E5%88%86%E9%92%9F%E6%95%99%E7%A8%8B.md) 學習本教程應該需要45分鐘到1個小時時間。 當你完成后,你將有一個很好的關于 Shiro 是如何在一個 web 應用程序的概念。 目錄 Overview Project Setup Step 1: Enable Shiro Step 2: Connect to a User Store Step 3: Enable Login and Logout Step 4: User-Specific UI Changes Step 5: Allow Access to Only Authenticated Users Step 6: Role-based Access Control Step 7: Permission-based Access Control ## Overview 概述 雖然 Apache Shiro 的核心設計目標允許它被用于任何基于 java 的應用程序的安全,如命令行應用程序、服務器守護進程 ,web 應用程序,等等,本指南將專注于最常見的用例:確保 web 應用程序安全運行在一個 servlet 容器,例如 Tomcat 或 Jetty。 ### Prerequisites 先決條件 以下工具將被安裝在本地開發機器為了跟隨本教程。 - Git(測試版 w/1.7) - Java SDK 7 - Maven 3 - 你最喜歡的IDE,比如 IntelliJ IDEA 或 Eclipse ,甚至一個簡單的文本編輯器用于查看文件和更改。 ### Tutorial Format 教程格式 這是一個循序漸進的教程。 本教程,和它的所有步驟,存在Git存儲庫。 當你復制 git 存儲庫, master 分支是你的起點。 在教程的每一步都是一個獨立的分支。 你可以跟隨只需查看 git 分支反映本教程一步你審查 ### The Application 應用程序 我們將構建的 web 應用程序是一個超級網絡應用,可以作為一個起點為您自己的應用程序。 它將展示用戶登錄,注銷,特定于用戶的歡迎消息,訪問控制web 應用程序的某些部分,plugglable 安全數據存儲和集成。 我們將開始通過建立項目,包括構建工具和聲明依賴性,以及配置 servlet的 web.xml 文件啟動 web 應用程序和 Shiro 的環境。 一旦我們完成設置,我們將層的各個部分的功能,包括集成的安全數據存儲,然后讓用戶登錄,注銷,訪問控制。 ## Project Setup項目設置 不必手動設置一個目錄結構和初始基本文件,我們已為你這樣做好了一個 git 存儲庫。 ### 1. Fork the tutorial project 先fork本教程項目 在 github,瀏覽[tutorial project](https://github.com/lhazlewood/apache-shiro-tutorial-webapp) 項目,點擊 Fork 按鈕 ### 2. Clone your tutorial repository 復制教程存儲庫 現在您已經將項目 fork 在你的 GitHub 帳戶,克隆它在本地機器上: > $ git clone git@github.com:$YOUR\_GITHUB\_USERNAME/apache-shiro-tutorial-webapp.git (其中 $YOUR\_GITHUB\_USERNAME 是你的 GitHub 用戶名) 用 cd 進入本地的項目目錄查看項目結構: > $ cd apache-shiro-tutorial-webapp ### 3. Review project structure 審查項目結構 當前項目結構為: ``` apache-shiro-tutorial-webapp/ |-- src/ | |-- main/ | |-- resources/ | |-- logback.xml | |-- webapp/ | |-- WEB-INF/ | |-- web.xml | |-- home.jsp | |-- include.jsp | |-- index.jsp |-- .gitignore |-- .travis.yml |-- LICENSE |-- README.md |-- pom.xml ``` 解釋下: - pom.xml :Maven 項目/構建文件。 它有Jetty 配置,這樣你就可以馬上運行 mvn jetty:run 測試您的 web 應用程序運行。 - README.md :一個簡單的項目的自述文件 - LICENSE :該項目是 Apache 2.0 許可協議 - .travis.yml :一個 [Travis CI](https://travis-ci.org/) 配置文件以確保它總是在項目構建時,持續運行集成構建您的項目。 - .gitignore :一個 git 忽略文件,包含的后綴和目錄是那些不應該納入到版本控制中。 - src/main/resources/logback.xml:一個簡單的 [Logback](http://logback.qos.ch/) 配置文件。 對于本教程,我們選擇 [SLF4J](http://www.slf4j.org/) 的日志 API 和 Logback 日志的實現。 這可能很容易被熟悉 Log4J 或者 JUL 的人所接受。 - src/main/webapp/WEB-INF/web.xml :最初的 web.xml 文件,我們將配置很快使用Shiro。 - src/main/webapp/include.jsp :一個頁面,其中包含常見的引入和聲明,包括其他的JSP頁面。 這讓我們在一個地方來管理引入和聲明。 - src/main/webapp/home.jsp :應用的簡單的默認主頁。 包括 include.jsp (如將其他人,因為我們很快就會看到)。 - src/main/webapp/index.jsp :默認站點索引頁面-這僅僅是將請求轉發給我們 home.jsp 主頁。 ### 4. Run the webapp 運行 運行 > $ mvn jetty:run 打開瀏覽器訪問 [localhost:8080](http://localhost:8080/),頁面將會輸出 Hello, World! 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 1: Enable Shiro 啟動 shiro 我們最初的 master 庫 只是一個簡單的通用的 web 應用程序,可以作為任何應用程序的模板。 讓我們添加的最低限度,啟動 Shiro web 應用程序。 執行以下git checkout 命令加載 Step1 分支: > $ git checkout step1 檢出的分支,有兩點變化 1. 添加了一個 src/main/webapp/WEB-INF/shiro.ini 文件 2. src/main/webapp/WEB-INF/web.xml 改變了. ### 1a: Add a shiro.ini file 可以配置 Shiro 在許多不同的方式在一個web應用程序,這取決于您所使用的web和/或MVC框架。 例如,您可以通過Spring配置Shiro,Guice,Tapestry,和許多更多。 為了簡單起見,我們將啟動一個 Shiro 環境使用Shiro的默認值(非常簡單的) INI [配置](https://github.com/waylau/apache-shiro-1.2.x-reference/blob/master/I.%20Overview%20%E6%80%BB%E8%A7%88/4.%20Configuration%20%E9%85%8D%E7%BD%AE.md) 。 如果你簽出 Step1 分支,您將看到這個新的的內容 src/main/webapp/WEB-INF/shiro.ini 文件(簡短標題刪除注釋): ``` [main] # Let's use some in-memory caching to reduce the number of runtime lookups against Stormpath. # A real application might want to use a more robust caching solution (e.g. ehcache or a # distributed cache). When using such caches, be aware of your cache TTL settings: too high # a TTL and the cache won't reflect any potential changes in Stormpath fast enough. Too low # and the cache could evict too often, reducing performance. cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager securityManager.cacheManager = $cacheManager ``` ini 包含一個簡單的 \[main\] 和一些最小的配置: - 它定義了一個新的 cacheManager (緩存管理器) 實例。 緩存是Shiro的體系結構的一個重要組成部分,它減少了不斷往返通信各種數據存儲。 這個示例使用 MemoryConstrainedCacheManager 這是唯一真正好的單個JVM 的應用程序。 如果您的應用程序部署在多個主機(如集群網絡服務器),您需要使用集群緩存管理器實現。 - 在Shiro securityManager 它配置新 cacheManager (緩存管理器) 的實例 。 一個Shiro SecurityManager 實例總是存在的,所以它不需要顯式地定義。 ### 1b: Enable Shiro in web.xml 當我們有一個 shiro.ini 配置,我們需要加載它,并開始一個新的 Shiro 環境和使 web 應用程序環境的實現。 我們所做的這一切通過添加現有的幾件事到 src/main/webapp/WEB-INF/web.xml 文件: ``` <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping> ``` ### 1c: Run the webapp 當檢出 step1 分支,運行 > $ mvn jetty:run 這一次,你會看到日志輸出類似于以下,表明 Shiro 確實是運行在你的應用: ``` 16:04:19.807 [main] INFO o.a.shiro.web.env.EnvironmentLoader - Starting Shiro environment initialization. 16:04:19.904 [main] INFO o.a.shiro.web.env.EnvironmentLoader - Shiro environment initialized in 95 ms. ``` 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 2: Connect to a User Store 連接用戶存儲 檢出 step2 分支 > $ git checkout step2 現在我們已經在 webapp 中集成和運行了 Shiro。 但是我們還沒有真正告訴 Shiro 做任何事! 之前我們可以登錄,注銷,或執行基于角色或基于許可的訪問控制,或任何其他安全相關的,我們需要用戶! 我們需要配置 Shiro 訪問 用戶存儲 的一些類型的,所以它可以查找用戶執行登錄嘗試,或檢查角色的安全決策,等等。有許多類型的用戶存儲任何應用程序可能需要訪問:也許你在 MySQL 數據庫中存儲用戶,也許在MongoDB,也許你的公司將用戶帳戶存儲在 LDAP 或 Active Directory,也許你將它們存儲在一個簡單的文件,或其他專有數據存儲。 Shiro 通過所謂的 Realm 來實現這些。 Shiro 的文檔: > Reamls 是 Shiro 和你的程序安全數據之間的“橋”或者“連接”,它用來實際和安全相關的數據如用戶執行身份認證(登錄)的帳號和授權(訪問控制)進行交互,Shiro 從一個或多個程序配置的 Realm 中查找這些東西。 Realm 本質上是一個特定的安全 DAO:它封裝與數據源連接的細節,得到Shiro 所需的相關的數據。在配置 Shiro 的時候,你必須指定至少一個Realm 來實現認證(authentication)和/或授權(authorization)。SecurityManager 可以配置多個復雜的 Realm,但是至少有一個是需要的。 Shiro 提供開箱即用的 Realms 來連接安全數據源(或叫地址)如 LDAP、JDBC、文件配置如INI和屬性文件等,如果已有的Realm不能滿足你的需求你也可以開發自己的Realm實現。 和其它內部組件一樣,Shiro SecurityManager 管理如何使用 Realms獲取 Subject 實例所代表的安全和身份信息。(*譯者注*:詳見[說明文檔](https://github.com/waylau/apache-shiro-1.2.x-reference/blob/master/II.%20Core%20%E6%A0%B8%E5%BF%83/7.%20Realms.md)) 因此,我們需要配置一個領域,那么我們可以訪問用戶。 ### 2a: Set up Stormpath 本教程的精神是保持盡可能簡單,不引入復雜性或范圍干擾了我們的學習Shiro 的目的,我們將使用一個簡單的 realm : Stormpath realm。 [Stormpath](http://stormpath.com/) 云托管用戶管理服務,以完全自由發展為目的。 這意味著啟用 Stormpath 之后,你已經準備好如下: - 一個用戶界面來管理應用程序,目錄,帳戶和組。 Shiro 不提供這個,所以通過本教程這將是方便和節省你的時間。 - 一個安全的存儲用戶密碼的機制。 您的應用程序不需要擔心密碼安全、密碼比較或存儲密碼。 雖然 Shiro 可以做這些事情,你必須配置它們,知道密碼的概念。 Stormpath 自動化密碼安全所以你(Shiro)不需要擔心如何“步入正軌”。 - 過電子郵件帳戶電子郵件驗證和密碼重置的安全工作流通。 Shiro不支持這個,因為它通常是特定于應用程序的。 - 主持/管理”always on“基礎設施——你不需要設置任何或維持任何東西。 對于本教程,Stormpath 比建立一個獨立的 RDBMS 服務器還有擔心 SQL 或密碼加密問題等等簡單的多了。 所以我們將使用它。 當然,Stormpath 只是許多 Shiro 可以連接的后端數據存儲之一。 我們將討論更復雜的數據存儲和特定于應用程序的配置之后。 #### Sign up for Stormpath 注冊 1. 填寫 [Stormpath 注冊表單](https://api.stormpath.com/register), 它會發郵件確認 2. 確認郵件 #### Get a Stormpath API Key 獲取API Key Stormpath API 所需的關鍵是 Stormpath Realm 用來與 Stormpath 交流。 獲得 Stormpath API Key: 1. 登錄到 [Stormpath 管理控制臺](https://api.stormpath.com/) 使用你的Stormpath 注冊使用的電子郵件地址和密碼 2. 在結果頁面的右上角,訪問 Settings > My Account 。 3. 在賬戶信息頁面, Security Credentials, 點擊 Create API Key 。 這將生成 API Key 并下載到你的電腦 apiKey.properties 文件。 如果你在文本編輯器中打開文件,您將看到類似于下面的: ``` apiKey.id = 144JVZINOF5EBNCMG9EXAMPLE apiKey.secret = lWxOiKqKPNwJmSldbiSkEbkNjgh2uRSNAb+AEXAMPLE ``` 將該文件保存在一個安全的位置,比如在一個隱藏您的主目錄 .stormpath 目錄中。 例如: ``` $HOME/.stormpath/apiKey.properties ``` 還改變文件權限,以確保只有你能讀這個文件。 例如,在 \*nix 操作系統: ``` $ chmod go-rwx $HOME/.stormpath/apiKey.properties ``` #### Register the web application with Stormpath 注冊web應用 我們必須通過 Stormpath 注冊我們的 web 應用程序,用于用戶的管理和身份驗證。簡單通過REST請求, POST 到一個新的 Stormpath 應用程序資源 URL: ``` curl -X POST --user $YOUR_API_KEY_ID:$YOUR_API_KEY_SECRET \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "name" : "Apache Shiro Tutorial Webapp" }' \ 'https://api.stormpath.com/v1/applications?createDirectory=true' ``` 其中 - $YOUR\_API\_KEY\_ID 是 apiKey.properties 文件中 apiKey.id 值 - YOUR\_API\_KEY\_SECRET 是 apiKey.properties 文件中 apiKey.secret 值 那樣就將會創建你的應用, 下面是一個響應示例: ``` { "href": "https://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeRe", "name": "Apache Shiro Tutorial Webapp", "description": null, "status": "ENABLED", "tenant": { "href": "https://api.stormpath.com/v1/tenants/sOmELoNgRaNDoMIdHeRe" }, "accounts": { "href": "https://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeRe/accounts" }, "groups": { "href": "https://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeRe/groups" }, "loginAttempts": { "href": "https://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeR/loginAttempts" }, "passwordResetTokens": { "href": "https://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeRe/passwordResetTokens" } } ``` 注意頂層的 href ,如 [https://api.stormpath.com/v1/applications/$YOUR\_APPLICATION\_ID](https://api.stormpath.com/v1/applications/%24YOUR_APPLICATION_ID) ,接下來我們將在 shiro.ini 配置使用這個 href 。 #### Create an application test user account 創建應用測試用戶賬號 現在有了應用,我們要創建一個簡單的測試用戶 ``` curl -X POST --user $YOUR_API_KEY_ID:$YOUR_API_KEY_SECRET \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "givenName": "Jean-Luc", "surname": "Picard", "username": "jlpicard", "email": "capt@enterprise.com", "password":"Changeme1" }' \ "https://api.stormpath.com/v1/applications/$YOUR_APPLICATION_ID/accounts" ``` 同樣的,不要忘了修改 $YOUR\_APPLICATION\_ID ### 2b: Configure the Realm in shiro.ini 配置 一旦你選擇至少一個用戶連接存儲,我們將需要配置一個 Realm 來表示數據存儲,然后告訴 Shiro SecurityManager 。 如果你已經簽出了 step2 分支,你會注意到的 shiro.ini 文件的 (主要) 現在部分有以下補充: ``` # 配置 Realm 來連接用戶存儲.本教程只簡單的指向 Stormpath # 花 5 分鐘進行設置: stormpathClient = com.stormpath.shiro.client.ClientFactory stormpathClient.cacheManager = $cacheManager stormpathClient.apiKeyFileLocation = $HOME/.stormpath/apiKey.properties stormpathRealm = com.stormpath.shiro.realm.ApplicationRealm stormpathRealm.client = $stormpathClient # 找到這個 你在Stormpath 創建應用時的 URL : # Applications -> (choose application name) --> Details --> REST URL stormpathRealm.applicationRestUrl = https://api.stormpath.com/v1/applications/$STORMPATH_APPLICATION_ID stormpathRealm.groupRoleResolver.modeNames = name securityManager.realm = $stormpathRealm ``` 做以下修改: - 改變 $ HOME 占位符實際主目錄路徑,例如 /home/jsmith 所以最后 stormpathClient.apiKeyFileLocation 值是類似 /home/jsmith/.stormpath/apiKey.properties 。 這條路必須匹配的位置 apiKey.properties 你在 Step 2a.中從Stormpath下載一個文件。 - 改變 step2 中 Stormpath 返回來的 href 中 $STORMPATH\_APPLICATION\_ID 占位符中的實際ID值。 最后的 stormpathRealm.applicationRestUrl 值應該類似 <https://api.stormpath.com/v1/applications/6hsPwoRZ0hCk6ToytVxi4D> (當然有不同的應用程序ID)。 ### 2c: Commit your changes 提交修改 替換 $ HOME 和 STORMPATH\_APPLICATION\_ID 值是特定于您的應用程序。 繼續提交這些更改你的分支: ``` $ git add . && git commit -m "updated app-specific placeholders" . ``` ### 2d: Run the webapp 運行 ``` $ mvn jetty:run ``` 看到如下輸出: ``` 16:08:25.466 [main] INFO o.a.shiro.web.env.EnvironmentLoader - Starting Shiro environment initialization. 16:08:26.201 [main] INFO o.a.s.c.IniSecurityManagerFactory - Realms have been explicitly set on the SecurityManager instance - auto-setting of realms will not occur. 16:08:26.201 [main] INFO o.a.shiro.web.env.EnvironmentLoader - Shiro environment initialized in 731 ms. ``` 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 3: Enable Login and Logout 啟用登錄、登出 現在我們有了用戶,可以簡單的再 UI 里面增加、刪除、禁用他們。現在我們要用到登錄、登出功能了。 檢出 step3 分支 ``` $ git checkout step3 ``` 這次檢出的內容,增加了下面兩項: - 新增了一個登錄界面 src/main/webapp/login.jsp 包含一個簡單的登錄框,讓我們登入 - shiro.ini 文件更新了,從而能支持 web (URL) 特性 ### Step 3a: Enable Shiro form login and logout support step3 分支中 src/main/webapp/WEB-INF/shiro.ini 文件包含了下面兩個內容: ``` [main] shiro.loginUrl = /login.jsp # Stuff we've configured here previously is omitted for brevity [urls] /login.jsp = authc /logout = logout ``` #### shiro.\* lines 其中 shiro.loginUrl = /login.jsp 這個是設置 Shiro 的登錄頁面是 /login.jsp 設置 Shiro 的默認 authc filter (默認是 [FormAuthenticationFilter](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.html)) 識別這個登錄頁面. 這使得 FormAuthenticationFilter 能夠正常工作 #### The \[urls\] section \[urls\] 是一個新的 web 特性的 INI 這部分允許您使用一個非常簡潔的名稱/值對語法告訴 shiro 如何過濾請求任何給定的 UR L路徑。 所有的路徑 \[url\] 相對于web應用程序的\[HttpServletRequest.getContextPath())( [http://java.sun.com/j2ee/sdk\_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html getContextPath()](http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.html#getContextPath()) )的值。 這些名稱/值對提供了一個非常強大的方式來過濾請求,允許各種各樣的安全規則。 更深入的報道 url 和過濾器鏈超出了本文的范圍,但請做 閱讀更多[關于它](https://github.com/waylau/apache-shiro-1.2.x-reference/blob/master/III.%20Web%20Applications/10.%20Web.md), 如果你感興趣。 現在,我們將討論的兩行補充道: /login.jsp = authc /logout = logout - 第一行意思“每當 Shiro 看到 /login.jsp 的 url 請求,都將會在請求中啟用 Shiro authc 過濾器”。 - 第二行意味著“每當 Shiro 看到 /logout 的 url 請求,都將會在請求中啟用 Shiro 注銷過濾器。” 這兩個過濾器是有點特別的:他們實際上并不需要背后的東西。 而不是過濾,他們會完全處理請求。 這就意味著什么都不用為這些 url 請求 做什么——不用寫控制器! Shiro 將處理這些請求。 ### Step 3b: Add a login page 從 step3 啟用登錄和注銷的支持,現在我們需要確保實際上有一個 /login.jsp 頁面顯示一個登錄表單。 step3 分支包含一個新 src/main/webapp/login.jsp 頁面。 這是一個簡單的足夠 bootstrap 風格的 HTML 登錄頁面,但有四個重要的事情: - form 的 action 值是空字符串。當一個 form 不包含 action 值,則瀏覽器將會提交 form 請求到相同的 URL。這是可以的,因為我們將告訴 Shiro 該 URL 是什么,所以 Shiro 可以快速自動處理任何登錄提交。 /login.jsp = authc 這句是告訴我們 authc 過濾器去處理提交。 - 有一個 username 表單字段。 Shiro authc 過濾器自動尋找 username 的請求參數 在 login 提交時,并且在登錄期間使用那個值 (很多 Realms 允許 這個可以是 email 或者是 username ). - 有一個 password 表單字段。 Shiro authc 過濾器自動尋找 password 的請求參數 在 login 提交時。 - 有一個 rememberMe 的 checkbox,當選中時,值表示 ‘是’ (如 true, t, 1, enabled, y, yes等等). 我們的 login.jsp 表單只使用默認值 username , password , rememberme 表單字段的名稱。 名稱是可配置的,如果你希望改變他們,看 [FormAuthenticationFilter](http://shiro.apache.org/static/current/apidocs/org/apache/shiro/web/filter/authc/FormAuthenticationFilter.html) 的 javadoc 獲取信息。 ### Step 3c: Run the webapp ``` $ mvn jetty:run ``` ### Step 3d: Try to Login 瀏覽器 訪問 <localhost:8080/login.jsp> ,就能看到登錄界面 輸入 Step 2 中的 登錄名稱、密碼。點擊登錄,成功則去到主頁,失敗則返回到登錄界面 如果想登錄后去到跟主頁不同的任意界面,可以設置 authc.successUrl = /任意頁面 ,即可 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 4: User-specific UI changes 如果想實現界面——當前登錄用戶是誰——這個功能的話,只需要簡單用到 shiro 的 jsp 標簽 檢出 step4 分支 $ git checkout step4 在 home.jsp 中就幾個新增內容: - 當用戶沒有登錄,則在登錄頁面顯示 ‘Welcome Guest’. - 當用戶登入,則能看到用戶名稱 ‘Welcome username’ 并且有一個登出的鏈接t. - 這個 UI 是非常常見的,操作按鈕在屏幕右上方. ### Step 4a: Add the Shiro Tag Library Declaration home.jsp 修改包含下面內容: ``` <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> ``` 允許使用 Core (c:) 和 Shiro (shiro:) 兩個 jsp 標簽庫 ### Step 4b: Add Shiro Guest and User tags 修改 home.jsp 包含下面 和 兩個標簽 ``` p>Hi <shiro:guest>Guest</shiro:guest><shiro:user> <% //This should never be done in a normal page and should exist in a proper MVC controller of some sort, but for this //tutorial, we'll just pull out Stormpath Account data from Shiro's PrincipalCollection to reference in the //<c:out/> tag next: request.setAttribute("account", org.apache.shiro.SecurityUtils.getSubject().getPrincipals().oneByType(java.util.Map.class)); %> <c:out value="${account.givenName}"/></shiro:user>! ( <shiro:user><a href="<c:url value="/logout"/>">Log out</a></shiro:user> <shiro:guest><a href="<c:url value="/login.jsp"/>">Log in</a></shiro:guest> ) </p> ``` 看起來有點難懂: - : 這個標簽只顯示 Shiro Subject 在應用里面是 ‘guest’時的內容. Shiro 定義了 guest 是任何 沒有登錄系統,或者沒有被前次登錄記住的 Subject (使用 Shiro ‘remember me’ 功能). - : 這個標簽只顯示 Shiro Subject 在應用里面是 ‘user’時的內容. Shiro 定義了 user 是任何登錄系統,或者被前次登錄記住的 Subject (使用 Shiro ‘remember me’ 功能). 上面的代碼片段將呈現以下,如果 Subject 是 guest: Hi Guest! (Log in) 其中“Log in”是一個超鏈接到 /login.jsp 它將呈現以下,如果 Subject 是 user: Hi jsmith! (Log out) 假設 jsmith 的帳戶的用戶名登錄。 “Log out”是一個超鏈接到 ‘/logout’ 注銷 過濾器。 正如您可以看到的,你可以關掉或整個頁面上部分,特性和 UI 組件。 除了 和 , Shiro 支持許多其他有用的 JSP 標簽 ,您可以使用自定義 UI 知道當前基于各種各樣的 Subject。 ### Step 4c: Run the webapp 運行: ``` $ mvn jetty:run ``` 訪問 <localhost:8080>用 guest 身份, 而后登錄。成功登錄后,看頁面顯示,知道你先是一個用戶了! 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 5: Allow Access to Only Authenticated Users 雖然您可以更改頁面內容基于 Subject 的狀態,很多時候你會想要限制你的整個部分應用基于是否有人 證明 他們的身份(身份驗證)在他們當前的與 web 應用程序的交互。 這是特別重要的,如果一個用戶只能部分的應用顯示敏感信息,如帳單細節或控制其他用戶的能力。 執行以下git checkout 命令 加載 step5 分支: ``` $ git checkout step5 ``` Step 5 包含下面三點變化: - 我們添加了新的部分 (url 路徑) ,想限制只有通過身份驗證的用戶。 - 改變了 shiro.ini 告訴 shiro 只允許經過身份驗證的用戶應用 web 應用程序的一部分 - 改變了主頁,輸出內容是基于 當前 Subject 是否被驗證. ### Step 5a: Add a new restricted section 新的 src/main/webapp/account 目錄添加進來了。這個目錄及下面的目錄,只有登錄用戶可見。 src/main/webapp/account/index.jsp 文件只是一個占位符一個模擬 “home account” 頁面。 ### Step 5b: Configure shiro.ini shiro.ini 修改了: ``` /account/** = authc ``` 這 過濾器鏈定義的意思是“任何請求訪問 /account (或其子路徑) 必須經過身份驗證”。 但是如果有人試圖訪問路徑或它的任何孩子路徑? 但是你還記得在 step3 中添加以下行來 (主要) 部分: shiro.loginUrl = /login.jsp 這條自動配置 authc 與我們的 webapp 的登錄 URL 過濾器。 基于這一配置, authc 過濾器已經足夠聰明知道如果當前 Subject 訪問 /account 時還沒有經過身份驗證 ,它將自動重定向到 /login.jsp 頁面。 成功登錄后,它會自動將用戶重定向回他們試圖訪問的頁面( /account )。 方便! ### Step 5c: Update our home page 修改 /home.jsp 頁面讓用戶知道他們可以訪問新網站的一部分。添加歡迎以下信息: ``` <shiro:authenticated><p>Visit your <a href="<c:url value="/account"/>">account page</a>.</p></shiro:authenticated> <shiro:notAuthenticated><p>If you want to access the authenticated-only <a href="<c:url value="/account"/>">account page</a>, you will need to log-in first.</p></shiro:notAuthenticated> ``` 標簽只會顯示內容如果當前 Subject 已經登錄在當前會話(身份驗證)。 這是為什么 Subject 知道他們可以訪問新網站的一部分。 標簽只會顯示內容如果當前 Subject 在當前還沒有經過身份驗證的會話。 但你注意到 notAuthenticated 還有一個URL的內容 /account ? 沒關系,我們 authc 過濾器將處理 登錄并且重定向 的流程。如上所述。 試一試! ### Step 5d: Run the webapp ``` $ mvn jetty:run ``` 訪問 <localhost:8080>, 點擊 /account 鏈接重定向強制你登錄。成功登錄后,看頁面顯示,知道你已經登錄了!嘗試登錄、登出。 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 6: Role-Based Access Control 基于角色的訪問控制 除了控制訪問身份驗證的基礎上,它通常是一個要求限制訪問應用程序的某些部分基于角色分配給當前 Subject 檢出 step6 ``` $ git checkout step6 ``` ### Step 6a: Add Roles 為了實現基于角色的訪問控制,我們需要角色存在。 本教程是最快的方式來填充一些內容到 Stormpath。 要做到這一點,登錄到用戶界面和導航如下: **Directories > Apache Shiro Tutorial Webapp Directory > Groups** 添加下面組 - Captains - Officers - Enlisted (這個是 [Star-Trek《星際迷航》](http://www.baidu.com/link?url=BNAZzFmwj-ekabSIip0OXJp8rx-qLv3KbGTDKvfxZeBdjWTKsB9Ig2yeu4FJgiNh) 里面的角色) 一旦你創建了組,添加 Jean-Luc Picard 到 Captains 和 Officers 分組。 您可能想要創建一些特別賬戶,并將它們添加到您喜歡的任何組。 確保一些帳戶不重疊組,這樣你就可以看到變化基于單獨的組分配到用戶帳戶。 ### Step 6b: RBAC Tags 修改 home.jsp 內容 ``` <h2>Roles</h2> section of the home page: <h2>Roles</h2> <p>Here are the roles you have and don't have. Log out and log back in under different user accounts to see different roles.</p> <h3>Roles you have:</h3> <p> <shiro:hasRole name="Captains">Captains<br/></shiro:hasRole> <shiro:hasRole name="Officers">Bad Guys<br/></shiro:hasRole> <shiro:hasRole name="Enlisted">Enlisted<br/></shiro:hasRole> </p> <h3>Roles you DON'T have:</h3> <p> <shiro:lacksRole name="Captains">Captains<br/></shiro:lacksRole> <shiro:lacksRole name="Officers">Officers<br/></shiro:lacksRole> <shiro:lacksRole name="Enlisted">Enlisted<br/></shiro:lacksRole> </p> ``` 標簽只會顯示內容如果當前 Subject 分配指定的角色。 如果當前標簽只會顯示內容 Subject 沒有 被分配指定的角色。 ### Step 6c: RBAC filter chains 留給讀者的練習(不是定義步驟)是創建一個新的部分的網站和限制的URL訪問部分網站基于角色分配給當前用戶。 ### Step 6d: Run the webapp ``` $ mvn jetty:run ``` 訪問 <localhost:8080>, 和不同的用戶帳戶登錄看主頁的分配不同的角色, 角色部分內容改變! 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Step 7: Permission-Based Access Control 基于權限的訪問控制 基于角色的訪問控制是好的,但它存在一個主要問題:你不能在運行時添加或刪除角色。 角色名字在角色檢查是硬編碼的,所以如果你改變了角色名稱或角色配置,或添加或刪除角色,你必須回去和改變你的代碼! 正因為如此,Shiro 有強大的特點:內置的支持 權限 。 Shiro 的 權限是一個原始語句的功能,例如 ‘open a door’ ‘create a blog entry’, ‘delete the jsmith user’等權限反映了應用的原始功能,所以當你改變應用的功能時你只需要更改權限的檢查——而不是改變你的角色或用戶模型。 為了證明這一點,我們將創建一些權限,并將它們分配給一個用戶,然后定制我們的基于用戶的授權(權限) web UI ## Step 7a: Add Permissions Shiro Realms 是只讀的組件:每個數據存儲模型的角色,組織、權限、賬號,以及它們之間的關系不同,所以 Shiro 沒有“寫”API來修改這些資源。 修改底層模型對象,你只是通過任何 API 直接修改你想要的。 是這樣的,因為我們使用 Stormpath 在這個示例應用程序中,我們將權限分配給一個帳戶和組在 Stormpath API-specific 方式。 讓我們執行 cURL 請求添加一些權限給我們以前創建的 Jean-Luc Picard 帳戶。 使用該帳戶的 href URL,我們會請求 apacheShiroPermissions 賬戶通過 自定義數據 : ``` curl -X POST --user $YOUR_API_KEY_ID:$YOUR_API_KEY_SECRET \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -d '{ "apacheShiroPermissions": [ "ship:NCC-1701-D:command", "user:jlpicard:edit" ] }' \ "https://api.stormpath.com/v1/accounts/$JLPICARD_ACCOUNT_ID/customData" ``` $JLPICARD\_ACCOUNT\_ID 匹配 創建Jean-Luc Picard 時 的 uid 添加兩個權限到 Stormpath 賬戶: - ship:NCC-1701-D:command - user:jlpicard:edit 第一句含義是,你有權限 ‘command’ 編號是 ‘NCC-1701-D’ 的 ‘ship’。 第二句是有權限 edit 賬戶是 jlpicard 的 user 想知道 Stormpath 是如何存儲權限的,請參閱[Shiro Stormpath plugin documentation.](https://github.com/stormpath/stormpath-shiro/wiki#permissions) ### Step 7b: Permission Tags 就像我們對角色檢查 JSP 標記,并行標記存在權限檢查。 我們更新 /home.jsp 頁面,讓用戶知道如果他們允許做一些基于權限分配給他們。 這些消息被添加在一個新的 ## Permissions 部分的主頁: ``` <h2>Permissions</h2> <ul> <li>You may <shiro:lacksPermission name="ship:NCC-1701-D:command"><b>NOT</b> </shiro:lacksPermission> command the NCC-1701-D Starship!</li> <li>You may <shiro:lacksPermission name="user:${account.username}:edit"><b>NOT</b> </shiro:lacksPermission> edit the ${account.username} user!</li> </ul> ``` 當你訪問主頁,看到如下輸出 You may NOT command the NCC-1701-D Starship! You may NOT edit the user! 當用 Jean-Luc Picard 賬戶登錄 ,您將看到這個: You may command the NCC-1701-D Starship! You may edit the user! 使用 shiro [WildcardPermission](https://github.com/waylau/apache-shiro-1.2.x-reference/blob/master/II.%20Core%20%E6%A0%B8%E5%BF%83/6.1.%20Permissions%20%E6%9D%83%E9%99%90.md) 中的語法 您可以看到,Shiro解決,通過身份驗證的用戶權限,和輸出在一個適當的方式呈現。 你也可以使用 標記為肯定的權限檢查。 最后,我們將呼吁關注一個非常強大的功能和權限檢查。 你看到第二個使用權限檢查,如何運行時生成權限值? ... ${account.username} 在運行時解釋,形成最終的值 user:aUsername:edit,然后最后一個字符串值是用于權限檢查。 這是極強大的:你可以執行權限檢查基于當前用戶是誰, 目前正在與什么交互。 這些基于運行時 runtime實例級權限檢查基本技術發展高度可定制的、安全的應用程序。 ### Step 7c: Run the webapp ``` $ mvn jetty:run ``` 訪問 <localhost:8080> 并用 Jean-Luc Picard 賬戶(和其他賬戶)登錄、登出,看到基于權限分配的頁面輸出變化(或者木有) 按`ctl-C` (或者 mac 中的 `cmd-C`) 來關閉應用 ## Summary 總結 我們希望你發現這個入門教程 Shiro-enabled webapps有用。 在未來版本的教程中,我們將介紹: 插入不同的用戶數據存儲,如 RDBMS 或 NoSQL 數據存儲。 ### Fixes and Pull Requests 修復和 pull 請求 請發送任何修復勘誤表作為 [GitHub pull 請求](https://help.github.com/articles/creating-a-pull-request) 到 <https://github.com/lhazlewood/apache-shiro-tutorial-webapp> 存儲庫。 我們很感激! ! ! *譯者注:*本文參考:<http://shiro.apache.org/webapp-tutorial.html>。如果對本中文翻譯有疑議的或發現勘誤歡迎指正,[點此](https://github.com/waylau/apache-shiro-1.2.x-reference/issues)提問。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看