您好,登錄后才能下訂單哦!
這篇文章主要講解了“Shiro Realm權限認證怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Shiro Realm權限認證怎么實現”吧!
要學習 shiro,我們首先需求去 shiro 官網下載 shiro,官網地址地址 https://shiro.apache.org/,截至本文寫作時,shiro 的最新穩定版本為 1.4.0 ,本文將采用這個版本。當然,shiro 我們也可以從 github 上下載到源碼。兩個源碼下載地址如下:
apache shiro
github-shiro
上面我主要是和小伙伴們介紹下源碼的下載,并沒有涉及到 jar 包的下載,jar 包我們到時候直接使用 maven 即可。
這里我們先不急著寫代碼,我們先打開剛剛下載到的源碼,源碼中有一個samples目錄,如下:
這個 samples 目錄是官方給我們的一些演示案例,其中有一個 quickstart 項目,這個項目是一個 maven 項目,參考這個 quickstart ,我們來創建一個自己的演示工程。
首先使用 maven 創建一個 JavaSE 工程
工程創建成功后在pom文件中添加如下依賴:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-all</artifactId>
<version>RELEASE</version>
</dependency>
配置用戶
參考 quickstart 項目中的 shiro.ini 文件,我們來配置一個用戶,配置方式如下:首先在 resources 目錄下創建一個 shiro.ini 文件,文件內容如下:
[users]
sang=123,admin
[roles]
admin=*
以上配置表示我們創建了一個名為 sang 的用戶,該用戶的密碼是 123 ,該用戶的角色是 admin ,而 admin 具有操作所有資源的權限。
執行登錄
OK,做完上面幾步之后,我們就可以來看看如何實現一次簡單的登錄操作了。這個登錄操作我們依然是參考 quickstart 項目中的類來實現,首先我們要通過 shiro.ini 創建一個 SecurityManager ,再將這個 SecurityManager 設置為單例模式,如下:
Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
如此之后,我們就配置好了一個基本的 Shiro 環境,注意此時的用戶和角色信息我們配置在 shiro.ini 這個配置文件中,接下來我們就可以獲取一個 Subject 了,這個 Subject 就是我們當前的用戶對象,獲取方式如下:
Subject currentUser = SecurityUtils.getSubject();
拿到這個用戶對象之后,接下來我們可以獲取一個 session 了,這個 session 和我們 web 中的 HttpSession 的操作基本上是一致的,不同的是,這個 session 不依賴任何容器,可以隨時隨地獲取,獲取和操作方式如下:
//獲取session
Session session = currentUser.getSession();
//給session設置屬性值
session.setAttribute("someKey", "aValue");
//獲取session中的屬性值
String value = (String) session.getAttribute("someKey");
說了這么多,我們的用戶到現在還沒有登錄呢,Subject 中有一個 isAuthenticated 方法用來判斷當前用戶是否已經登錄,如果 isAuthenticated 方法返回一個 false,則表示當前用戶未登錄,那我們就可以執行登陸,登錄方式如下:
if (!currentUser.isAuthenticated()) {
UsernamePasswordToken token = new UsernamePasswordToken("sang", "123");
try {
currentUser.login(token);
} catch (UnknownAccountException uae) {
log.info("There is no user with username of " + token.getPrincipal());
} catch (IncorrectCredentialsException ice) {
log.info("Password for account " + token.getPrincipal() + " was incorrect!");
} catch (LockedAccountException lae) {
log.info("The account for username " + token.getPrincipal() + " is locked. " +
"Please contact your administrator to unlock it.");
}
catch (AuthenticationException ae) {
}
}
首先構造 UsernamePasswordToken ,兩個參數就是我們的用戶名和密碼,然后調用 Subject 中的 login 方法執行登錄,當用戶名輸錯,密碼輸錯、或者賬戶鎖定等問題出現時,系統會通過拋異常告知調用者這些問題。
當登錄成功之后,我們可以通過如下方式獲取當前登陸用戶的用戶名:
log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
我們也可以通過調用 Subject 中的 hasRole 和 isPermitted 方法來判斷當前用戶是否具備某種角色或者某種權限,如下:
if (currentUser.hasRole("admin")) {
log.info("May the Schwartz be with you!");
} else {
log.info("Hello, mere mortal.");
}
if (currentUser.isPermitted("lightsaber:wield")) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
最后,我們可以通過 logout 方法注銷本次登錄,如下:
currentUser.logout();
感謝各位的閱讀,以上就是“Shiro Realm權限認證怎么實現”的內容了,經過本文的學習后,相信大家對Shiro Realm權限認證怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。