鍍金池/ 教程/ Java/ Shiro Web應(yīng)用程序
Shiro特點(diǎn)
Shiro Web應(yīng)用程序
Shiro教程
Shiro術(shù)語
Shiro是什么?
Shiro 10分鐘教程
Shiro快速入門教程

Shiro Web應(yīng)用程序

[TOC]

本文章是使用Apache Shiro保護(hù)Web應(yīng)用程序的介紹性分步教程。Shiro的介紹性知識,并且假設(shè)您至少熟悉以下介紹性文章:

  • Shiro快速入門教程

這個(gè)分步教程應(yīng)該需要大概45分鐘到1小時(shí)完成。 當(dāng)你按照本文中給出的步驟一步步完成后,您應(yīng)該會有一個(gè)很好的了解:Shiro是如何在一個(gè)Web應(yīng)用程序中工作的。

概述

雖然Apache Shiro的核心設(shè)計(jì)目標(biāo)允許它用于保護(hù)任何基于JVM的應(yīng)用程序(如命令行應(yīng)用程序,服務(wù)器守護(hù)程序,Web應(yīng)用程序等),但本指南將集中介紹最常見的用例:保護(hù)正在一個(gè)Servlet容器(如Tomcat或Jetty)中運(yùn)行的Web應(yīng)用程序。

先決條件

以下工具預(yù)計(jì)將安裝在本地開發(fā)機(jī)器上,以便遵循本教程。

  • Git(1.7+)
  • Java SDK 7
  • Maven 3

選擇您最喜歡的IDE,如:IntelliJ IDEA或Eclipse,甚至一個(gè)簡單的文本編輯器,查看文件和進(jìn)行更改。

教程格式

這是一個(gè)分步教程。 本教程及其所有步驟作為Git存儲庫存在。 當(dāng)您克隆git存儲庫時(shí),主分支是您的起點(diǎn)。本教程中的每一步都是一個(gè)單獨(dú)的分支。可以簡單地通過檢查反映你當(dāng)前正在審查的教程步驟的git分支。

應(yīng)用程序

我們將要構(gòu)建的Web應(yīng)用程序是一個(gè)超級web應(yīng)用程序,可以用作您自己的應(yīng)用程序的起點(diǎn)。 在這個(gè)應(yīng)用程序中將演示用戶登錄,注銷,用戶特定的歡迎消息,對Web應(yīng)用程序的某些部分的訪問控制,以及插入安全數(shù)據(jù)存儲的集成。

我們將首先設(shè)置項(xiàng)目,包括構(gòu)建工具和聲明依賴項(xiàng),以及配置servlet的web.xml文件以啟動Web應(yīng)用程序和Shiro環(huán)境。
完成設(shè)置后,我們將分層單獨(dú)的功能,包括與安全數(shù)據(jù)存儲集成,然后啟用用戶登錄,注銷和訪問控制。

項(xiàng)目設(shè)置

這里不必手動設(shè)置目錄結(jié)構(gòu)和初始的基本文件集,我們已經(jīng)在一個(gè)git存儲庫中為您做了這些工作了。

1. 下載教程項(xiàng)目

在GitHub上,訪問教程項(xiàng)目,然后單擊右上角的綠色clone or download按鈕或者直接下載,并將下載后的文件解壓到一個(gè)目錄中,在本教程中放在:F:\worksp\shiro\apache-shiro-tutorial-webapp-master 目錄中。

2. 項(xiàng)目結(jié)構(gòu)

當(dāng)前下載的文件目錄(F:\worksp\shiro\shiro-webapp)具有以下結(jié)構(gòu):

    shiro-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

這里簡單解釋上面每個(gè)文件的含義:

  • pom.xml:Maven項(xiàng)目/構(gòu)建文件。它配置了Jetty,因此可以通過運(yùn)行mvn jetty:run來測試Web應(yīng)用程序。
  • README.md:一個(gè)簡單的項(xiàng)目自述文件。
  • LICENSE:項(xiàng)目的Apache 2.0許可證。
  • .travis.yml: Travis CI配置文件,可在項(xiàng)目上運(yùn)行持續(xù)集成,用來確保它始終構(gòu)建。
  • .gitignore: 一個(gè)git忽略文件,包含不應(yīng)該被檢入版本控制的后綴和目錄。
  • src/main/resources/logback.xml: 一個(gè)簡單的Logback配置文件。 對于本教程,我們選擇了SLF4J作為日志記錄API,Logback作為日志記錄實(shí)現(xiàn)。也可以選擇使用 Log4JJUL。
  • src/main/webapp/WEB-INF/web.xml:初始的web.xml文件,接下來將配置啟用Shiro。
  • src/main/webapp/include.jsp:包含常見導(dǎo)入和聲明的頁面,包含在其他JSP頁面中。 這允許在一個(gè)地方管理導(dǎo)入和聲明。
  • src/main/webapp/home.jsp: 這個(gè)webapp項(xiàng)目的簡單默認(rèn)主頁。 包括include.jsp。
  • src/main/webapp/index.jsp: 默認(rèn)站點(diǎn)索引頁 - 只是將請求轉(zhuǎn)發(fā)到home.jsp首頁。

3.運(yùn)行webapp

現(xiàn)在已經(jīng)完成了項(xiàng)目的基本配置,可以通過在命令行上執(zhí)行以下命令來運(yùn)行Web應(yīng)用程序:

$ mvn jetty:run

接下來,打開web瀏覽器訪問:http://localhost:8080 , 應(yīng)該會看到主頁上有一個(gè)Hello,World!問候提示。

提示:同時(shí)按住ctrl+C關(guān)閉退出上面Web應(yīng)用程序。

一、啟用 Shiro

初始存儲庫主分支只是一個(gè)簡單的通用Web應(yīng)用程序,可以用作任何應(yīng)用程序的模板。這里我們添加最低限度,以在Web應(yīng)用程序中啟用Shiro。

復(fù)制上面 shiro-webapp 項(xiàng)目為 shiro-webapp1

并添加了一個(gè)新的src/main/webapp/WEB-INF/shiro.ini文件, 同時(shí)修改 src/main/webapp/WEB-INF/web.xml 文件。

1. 添加 shiro.ini 文件

Shiro可以在Web應(yīng)用程序中以許多不同的方式進(jìn)行配置,具體取決于使用的Web和/或MVC框架。 例如,可以通過Spring,Guice,Tapestry等等來配置Shiro。

為了簡化現(xiàn)在,我們使用Shiro的默認(rèn)(非常簡單)基于INI的配置來啟動一個(gè)Shiro環(huán)境。
這個(gè)新的src/main/webapp/WEB-INF/shiro.ini文件的內(nèi)容(為了簡潔,刪除了標(biāo)頭注釋)如下所示:

[main]

# Let's use some in-memory caching to reduce the number of runtime lookups against a remote user store.
# 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

這個(gè).ini文件只包含一個(gè)帶有一些最小配置的[main]塊:

  • 它定義了一個(gè)新的cacheManager實(shí)例。 緩存是Shiro架構(gòu)的重要組成部分 - 它減少了到各種數(shù)據(jù)存儲的常規(guī)往返通信。 這個(gè)例子使用一個(gè)MemoryConstrainedCacheManager,它只對單個(gè)JVM應(yīng)用程序有用。 如果應(yīng)用程序部署在多個(gè)主機(jī)(例如,集群的Web服務(wù)器場)上,您需要使用集群化的CacheManager實(shí)現(xiàn)。
  • 它在Shiro securityManager上配置新的cacheManager實(shí)例。 Shiro SecurityManager實(shí)例始終存在,因此不需要顯式定義。

2. 在web.xml中啟用Shiro

雖然我們有一個(gè)shiro.ini配置,要實(shí)際加載它并啟動一個(gè)新的Shiro環(huán)境,并使該環(huán)境可用于Web應(yīng)用程序。還要向現(xiàn)有的src/main/webapp/WEB-INF/web.xml文件中添加一些內(nèi)容來完成所有這些:

<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>
  • <listener>聲明定義了一個(gè)ServletContextListener,在Web應(yīng)用程序啟動時(shí)啟動Shiro環(huán)境(包括Shiro SecurityManager)。 默認(rèn)情況下,此偵聽器自動查找用于Shiro配置的WEB-INF/shiro.ini文件。
  • <filter>聲明定義主ShiroFilter。 此過濾器將過濾所有到Web應(yīng)用程序的請求,以便Shiro可以在允許請求到達(dá)應(yīng)用程序之前執(zhí)行必要的身份和訪問控制操作。
  • <filter-mapping>聲明確保所有請求類型都由ShiroFilter提交。 通常,過濾器映射聲明不指定<dispatcher>元素,但Shiro需要它們?nèi)慷x,因此它可以過濾可能為Web應(yīng)用程序執(zhí)行的所有不同的請求類型。

3. 運(yùn)行webapp

完成 shiro-webapp1 項(xiàng)目配置后,運(yùn)行Web應(yīng)用程序:

$ mvn jetty:run

這一次,您將看到類似于以下內(nèi)容的日志輸出,這表明Shiro確實(shí)在webapp中運(yùn)行了:

二、連接到用戶存儲

復(fù)制上面 shiro-webapp1 項(xiàng)目為 shiro-webapp2

并添加了一個(gè)新的src/main/webapp/WEB-INF/shiro.ini文件, 同時(shí)修改 src/main/webapp/WEB-INF/web.xml 文件。

在上一步中已經(jīng)在webapp中集成并運(yùn)行了Shiro。 但是我們沒有實(shí)際告訴Shiro做任何事情。
在執(zhí)行登錄,注銷,執(zhí)行基于角色或基于權(quán)限的訪問控制或任何其他安全相關(guān)之前,我們需要有用戶。
我們需要配置Shiro以訪問某種類型的用戶存儲,所以它可以查找用戶執(zhí)行登錄嘗試,或檢查角色的安全決策等。任何應(yīng)用程序可能需要訪問的用戶存儲有許多類型: 也許你的用戶存儲在MySQL數(shù)據(jù)庫,也許在MongoDB,也許你的公司的用戶帳戶存儲在LDAP或Active Directory中的,也許你存儲在一個(gè)簡單的文件或一些其他專有的數(shù)據(jù)存儲。

但這都不要緊,Shiro通過它稱為一個(gè)領(lǐng)域(Realm)。Shiro文檔對Realm的解釋如下:

Realms act as the ‘bridge’ or ‘connector’ between Shiro and your application’s security data. When it comes time to actually interact with security-related data like user accounts to perform authentication (login) and authorization (access control), Shiro looks up many of these things from one or more Realms configured for an application.
In this sense a Realm is essentially a security-specific DAO: it encapsulates connection details for data sources and makes the associated data available to Shiro as needed. When configuring Shiro, you must specify at least one Realm to use for authentication and/or authorization. The SecurityManager may be configured with multiple Realms, but at least one is required.
Shiro provides out-of-the-box Realms to connect to a number of security data sources (aka directories) such as LDAP, relational databases (JDBC), text configuration sources like INI and properties files, and more. You can plug-in your own Realm implementations to represent custom data sources if the default Realms do not meet your needs.

因此,需要配置一個(gè)領(lǐng)域(Realm),以便我們可以訪問用戶。

3. 配置Stormpath

本教程盡可能簡單,所以沒有引入復(fù)雜性或范圍,分散我們的學(xué)習(xí)Shiro的目的,將使用一個(gè)最簡單的Realm:一個(gè)Stormpath Realm。

Stormpath是一個(gè)云托管的用戶管理服務(wù),完全免費(fèi)用于開發(fā)目的。所以啟用Stormpath后,您將以下東西就會準(zhǔn)備好了:

  • 當(dāng)學(xué)習(xí)這個(gè)教程:用于管理應(yīng)用程序,目錄,帳戶和組的用戶界面。但Shiro不提供這些,所以使用 Stormpath 是非常方便,也節(jié)省您的時(shí)間。
  • 用于用戶密碼的安全存儲機(jī)制。應(yīng)用程序從不需要擔(dān)心密碼安全性,密碼比較或存儲密碼。 雖然Shiro可以做這些事情,還要你去配置它們,并知道加密概念。而Stormpath自動化密碼安全,所以你(和Shiro)不需要擔(dān)心它。

  • 安全工作流程,如帳戶電子郵件驗(yàn)證和通過電子郵件重置密碼。 Shiro不支持這個(gè),因?yàn)樗ǔJ菓?yīng)用程序特定。

  • 托管很方便 - 我們不必設(shè)置任何東西或維護(hù)任何東西。

對于本教程的目的,Stormpath比設(shè)置單獨(dú)的RDBMS服務(wù)器和擔(dān)心SQL或密碼加密問題簡單得多。所以我們現(xiàn)在就使用它吧。
當(dāng)然,Stormpath只是Shiro可以通信的許多后端數(shù)據(jù)存儲之一。 稍后我們將討論更復(fù)雜的數(shù)據(jù)存儲和特定于應(yīng)用程序的配置。

注冊Stormpath帳號

  1. 填寫并提交Stormpath注冊表單 - http://api.stormpath.com/register 。并發(fā)送確認(rèn)電子郵件。
  2. 打開電子郵件,點(diǎn)擊確認(rèn)電子郵件中的鏈接,完事。

獲取Stormpath API密鑰
Stormpath RealmStormpath通信需要Stormpath API密鑰。按以下步驟獲取Stormpath API密鑰:

  1. 使用您在Stormpath注冊的電子郵件地址和密碼登錄Stormpath管理控制臺。
  2. 在中間右側(cè)的結(jié)果頁面上,訪問頁面的DEVELOPER TOOLS部分中的API Keys: Manage API Keys
  3. 在“帳戶詳細(xì)信息”頁面的“Security Credentials”部分中,在“Api Keys”下單擊“Create API Key”。這將生成您的API密鑰并將其作為apiKey.properties文件下載到您的計(jì)算機(jī)。 如果在文本編輯器中打開文件,您將看到類似于以下內(nèi)容的內(nèi)容:
    apiKey.id = 144JVZINOF5EBNCMG9EXAMPLE
    apiKey.secret = lWxOiKqKPNwJmSldbiSkEbkNjgh2uRSNAb+AEXAMPLE
    
  4. 將此文件保存在安全位置,例如,在用戶主目錄下的.stormpath目錄中。例如:
    $HOME/.stormpath/apiKey.properties
    
  5. 還要更改文件權(quán)限,以確保只有您可以讀取此文件。 例如,在 *nix 操作系統(tǒng):
    $ chmod go-rwx $HOME/.stormpath/apiKey.properties
    $ chmod u-w $HOME/.stormpath/apiKey.properties
    
    在Windows上,您可以類似地設(shè)置文件權(quán)限,參考:http://msdn.microsoft.com/en-us/library/bb727008.aspx 。

檢索默認(rèn)的Stormpath應(yīng)用程序

當(dāng)您注冊Stormpath時(shí),會自動為您創(chuàng)建一個(gè)空應(yīng)用程序。 它的名稱是:My Application。

我們必須使用Stormpath注冊我們的Web應(yīng)用程序,以允許應(yīng)用程序使用Stormpath進(jìn)行用戶管理和身份驗(yàn)證。 為了使用Stormpath 的 My Application 應(yīng)用程序注冊我們的Web應(yīng)用程序,我們需要知道一些信息。我們可以使用Stormpath API檢索這些信息。

首先,需要您的租戶在Stormpath中的位置。使用以下方法得到:

curl -i --user $YOUR_API_KEY_ID:$YOUR_API_KEY_SECRET \
'http://api.stormpath.com/v1/tenants/current'

其中:
$YOUR_API_KEY_IDapiKey.properties文件中的apiKey.id
$YOUR_API_KEY_SECRETapiKey.properties文件中的apiKey.secret

執(zhí)行curl后會得到這樣的響應(yīng):

HTTP/1.1 302 Found
Date: Fri, 28 Aug 2015 18:34:51 GMT
Location: http://api.stormpath.com/v1/tenants/sOmELoNgRaNDoMIdHeRe
Server: Apache
Set-Cookie: rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 27-Aug-2015 18:34:52 GMT
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Content-Length: 0
Connection: keep-alive

注意:Windows系統(tǒng)默認(rèn)沒有 CURL 命令,需要額外安裝。請參考:http://www.baidu.com/s?wd=window+curl&

注意Location頭信息。這是您的Stormpath租戶的位置。 現(xiàn)在再次使用API檢索 Stormpath 的 My Application應(yīng)用程序的位置:

curl -u $API_KEY_ID:$API_KEY_SECRET \
     -H "Accept: application/json" \
     '$TENANT_HREF/applications?name=My%20Application'

其中:

$YOUR_API_KEY_IDapiKey.properties文件中的apiKey.id
$YOUR_API_KEY_SECRETapiKey.properties文件中的apiKey.secret
$TENANT_HREF是上一步驟的Location頭信息的值

這個(gè)響應(yīng)有很多信息。下面只是響應(yīng)中的一個(gè)例子的一部分:

{
    ...
    "href": "http://api.stormpath.com/v1/applications/aLoNGrAnDoMAppIdHeRe",
    "name": "My Application",
    "description": "This application was automatically created for you in Stormpath for use with our Quickstart guides(http://docs.stormpath.com). It does apply to your subscription's number of reserved applications and can be renamed or reused for your own purposes.",
    "status": "ENABLED",
    "tenant": {
        "href": "http://api.stormpath.com/v1/tenants/sOmELoNgRaNDoMIdHeRe"
    },
    ...
}

從上面記下你的頂層href - 將使用這個(gè)hrefshiro.ini配置下。

創(chuàng)建應(yīng)用程序測試用戶帳戶

現(xiàn)在我們有一個(gè)應(yīng)用程序,接下來將要為這個(gè)應(yīng)用程序創(chuàng)建一個(gè)sample/test用戶:

curl --request 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"
        }' \
 "$YOUR_APPLICATION_HREF/accounts"

在上面代碼中:

$YOUR_API_KEY_IDapiKey.properties文件中的apiKey.id
$YOUR_API_KEY_SECRETapiKey.properties中的apiKey.secret
$YOUR_APPLICATION_HREF是您記下的應(yīng)用程序href,
同樣,不要忘記更改上面的網(wǎng)址中的$YOUR_APPLICATION_HREF以匹配應(yīng)用程序的ID!

2. 配置 shiro.ini中的Realm

選擇至少一個(gè)用戶存儲來連接到Shiro,需要配置一個(gè)Realm來代表該數(shù)據(jù)存儲,然后告訴Shiro SecurityManager。

src/main/webapp/WEB-INF/shiro.ini 文件的[main]部分添加以下內(nèi)容:

# Configure a Realm to connect to a user datastore.  In this simple tutorial, we'll just point to Stormpath since it
# takes 5 minutes to set up:
stormpathClient = com.stormpath.shiro.client.ClientFactory
stormpathClient.cacheManager = $cacheManager

# (Optional) If you put your apiKey.properties in the non-default location, you set the location here
#stormpathClient.apiKeyFileLocation = $HOME/.stormpath/apiKey.properties

stormpathRealm = com.stormpath.shiro.realm.ApplicationRealm
stormpathRealm.client = $stormpathClient

# Find this URL in your Stormpath console for an application you create:
# Applications -> (choose application name) --> Details --> REST URL
# (Optional) If you only have one Application
#stormpathRealm.applicationRestUrl = http://api.stormpath.com/v1/applications/$STORMPATH_APPLICATION_ID

stormpathRealm.groupRoleResolver.modeNames = name
securityManager.realm = $stormpathRealm

注意可選行:

如果您已經(jīng)使用Stormpath一段時(shí)間,并且有多個(gè)Stormpath應(yīng)用程序,則必須設(shè)置stormpathRealm.applicationRestUrl屬性。

3. 運(yùn)行webapp

按照步驟1步驟2中的指定進(jìn)行更改后,繼續(xù)并運(yùn)行Web應(yīng)用程序:

mvn jetty:run

這一次,您將看到類似于以下的日志輸出,表明Shiro和新的 Realm 在您的webapp中正確配置:

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.

三、啟用登錄和注銷

現(xiàn)在我們有用戶,可以在UI中輕松添加,刪除和禁用它們。 現(xiàn)在可以在我們的應(yīng)用程序中啟用諸如登錄/注銷和訪問控制等功能。

復(fù)制上面 shiro-webapp2 項(xiàng)目為 shiro-webapp3

并添加以下2個(gè)附加文件:

  • 添加了一個(gè)新的src/main/webapp/login.jsp文件和一個(gè)簡單的登錄表單以使用它來登錄。
  • 更新shiro.ini文件,以支持特定于Web(URL)的功能。

1. 啟用Shiro表單登錄和注銷支持

src/main/webapp/WEB-INF/shiro.ini 文件包含以下2個(gè)附加項(xiàng):

[main]

shiro.loginUrl = /login.jsp

# Stuff we've configured here previously is omitted for brevity

[urls]
/login.jsp = authc
/logout = logout

shiro.* 行

[main]部分的頂部,添加有一個(gè)新行:

shiro.loginUrl = /login.jsp

這是一個(gè)特殊的配置指令,告訴Shiro“對于任何具有loginUrl屬性的Shiro默認(rèn)過濾器,我希望將屬性值設(shè)置為/login.jsp“。

這允許Shiro的默認(rèn)authc過濾器(默認(rèn)情況下,FormAuthenticationFilter)了解登錄頁面。 這是FormAuthenticationFilter正常工作所必需的。

[urls]部分

[urls]部分是一個(gè)新的特定于web的INI部分。

本部分允許您使用非常簡潔的名稱/值對語法來告訴shiro如何過濾任何給定URL路徑的請求。 [urls]中的所有路徑都是相對于Web應(yīng)用程序的HttpServletRequest.getContextPath()) 值。

這些名稱/值對提供了一種非常強(qiáng)大的方法來過濾請求,允許各種安全規(guī)則。 更深的URL和過濾器鏈的覆蓋范圍超出了本文檔的范圍,但如果你有興趣,請閱讀: http://shiro.apache.org/web.html

現(xiàn)在,我們將介紹說明以下添加的兩行:

/login.jsp = authc
/logout = logout
  • 第一行表示“每當(dāng)Shiro看到對/login.jsp的 URL 請求時(shí),請求期間啟用Shiro authc過濾器”。
  • 第二行表示“每當(dāng)Shiro看到對/logout的 URL 請求,請求期間啟用Shiro logout 過濾器。

這兩個(gè)過濾器有點(diǎn)特別:實(shí)際上不需要任何東西“在它們的后面”。他們實(shí)際上只是完全處理請求。沒有任何東西可以處理這些URL - 因?yàn)闆]有編寫任何控制器! Shiro將根據(jù)需要處理請求。

2. 添加登錄頁面

由于步驟3啟用登錄和注銷支持,現(xiàn)在我們需要確保有一個(gè)/login.jsp頁面來顯示登錄表單。

在這個(gè)新的src/main/webapp/login.jsp頁面中。 這是一個(gè)簡單的引導(dǎo)主題的HTML登錄頁面,它有四個(gè)重要的事情:

  1. 表單的操作值是空字符串。當(dāng)表單沒有操作值時(shí),瀏覽器會將表單請求提交到同一個(gè)網(wǎng)址。 Shiro可以自動處理任何登錄提交。shiro.ini中的/login.jsp = authc行是告訴authc過濾器處理提交的內(nèi)容。
  2. 有一個(gè)用戶名(username)表單字段。 Shiro authc過濾器將在登錄提交期間自動查找用戶名(username)請求參數(shù),并將其用作登錄期間的值(許多Realms允許這是電子郵件或用戶名)。
  3. 有一個(gè)密碼(password)表單字段。 Shiro authc過濾器將在登錄提交期間自動查找密碼請求參數(shù)。
  4. 有一個(gè)rememberMe復(fù)選框,其“選中”狀態(tài)可以是“true”值(true,t,1enabled,y,yesopen)。

login.jsp中的表單只使用默認(rèn)的:用戶名,密碼和rememberMe表單字段名。 如果想要更改這些名稱,可以配置這些名稱 - 有關(guān)更改配置信息,請參閱FormAuthenticationFilter JavaDoc。

3. 運(yùn)行webapp

按照步驟1步驟2中的指定進(jìn)行更改后,繼續(xù)并運(yùn)行Web應(yīng)用程序:

mvn jetty:run

4. 嘗試登錄

使用Web瀏覽器,導(dǎo)航訪問: localhost:8080/login.jsp , 將看到新的登錄表單。

輸入您在步驟2結(jié)束時(shí)創(chuàng)建的帳戶的用戶名和密碼,然后點(diǎn)擊“登錄”。 如果登錄成功,您將被定向到主頁! 如果登錄失敗,您將再次顯示登錄頁面。