天天看點

Shiro 學習筆記(1)-Helloworld 和 身份認證

Shiro 入門與身份認證

使用者資訊存放在記憶體中

使用者資訊存放在資料庫中

本節介紹了 Shiro 的入門示例程式。

“身份認證”是 Shiro 裡很重要的概念。“認證”就是通過輸入使用者名和密碼,到記憶體中或者到資料庫中去查詢是否有這個使用者名的資訊(且密碼也比對)。

Shiro 學習筆記(1)-Helloworld 和 身份認證

使用者資訊存放在“記憶體”中,意即将使用者的使用者名和密碼資訊存放在一個名為 shiro.ini 的檔案中。更多的情況是,我們把使用者的使用者名和密碼資訊存放在資料庫中,這也是我們以前做的項目的絕大多數情況下的做法。

項目結構:

Shiro 學習筆記(1)-Helloworld 和 身份認證

建立 maven 項目。

1、引入 gav 依賴:

如果使用 gradle 建構,則坐标為

2、編寫 shiro 核心配置檔案 shiro.ini

3、編寫 HelloWorld 代碼

這裡要特别注意:<code>SecurityManager</code> 所在的包名應該是<code>org.apache.shiro.mgt</code>。

4、引入 slf4j 的 log4j 實作配置檔案:log4j.properties

Subject 認證主體包含兩個資訊:

Principals:身份,可以是使用者名,郵件,手機号碼等等,用來辨別一個登入主體身份;(我們可以了解成使用者名)

Credentials:憑證,常見有密碼,數字證書等等;(我們可以了解成密碼)

下面我們介紹使用 JdbcRealm。那麼什麼是 Realm 呢?Realm 可以了解為主體的資料源(資料來源,裡面存放的都是正确的使用者名和密碼)。

Realm 的意思是域,Shiro 從 Realm 中擷取驗證資料。

隻須要對上面的代碼稍稍作修改就可以實作将使用者資訊存放在資料庫中,通過資料庫中的使用者資訊進行登入比對。既然使用的是 JdbcRealm,就須要使用到 jdbc 的相關技術。

首先我們引入依賴:

再向資料庫裡寫入資料:

這裡的表名和字段名都是固定的,這一點我們通過看 JdbcRealm 的源代碼就可以知道。不過顯然這樣的方式顯然是不靈活的。

配置檔案 jdbc_realm.ini:

配置檔案解釋:

<code>jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm</code> 表示執行個體化右邊字元串表示的類,賦給左邊字元串表示的變量。

<code>dataSource.jdbcUrl=jdbc:mysql://localhost:3306/db_shiro</code> 表示對 dataSource 這個變量設定屬性值 jdbcUrl ,這個屬性值是一個字元串。

<code>jdbcRealm.dataSource=$dataSource</code> 表示對 jdbcRealm 這個變量設定屬性值 dataSource , 這個 dataSource 屬性是上面執行個體化的一個對象,是以表示這個對象要使用字首 <code>$</code>。

測試代碼(和上一節沒有什麼不同,隻是配置檔案不一樣而已):

補充:在 <code>currentUser.login(token);</code> 這一行捕獲的異常,這裡隻是簡單地捕獲了 <code>AuthenticationException</code> 這個異常,我們還可以具體地捕獲使用者名不存在異常和密碼不存在異常。

總結:

使用 Shiro 進行身份認證的流程是:将使用者的使用者名和密碼資訊存放在一個 <code>UsernamePasswordToken</code> 對象中,通過 <code>Subject</code> 的 <code>login()</code> 方法把 <code>UsernamePasswordToken</code> 對象傳進去。

此時 Shiro 架構會去 shiro.ini 檔案中找指定的安全資料源 <code>Realm</code>。預設是 IniRealm ,如果我們配置了 JdbcRealm ,就使用 JdbcRealm。

使用者名是否存在,使用者名存在的前提下密碼是否也比對,這個操作是由 Shiro 幫助我們完成的。