這篇文章主要講解了“Shiro Realm權(quán)限認(rèn)證怎么實(shí)現(xiàn)”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Shiro Realm權(quán)限認(rèn)證怎么實(shí)現(xiàn)”吧!
公司專注于為企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、微信公眾號(hào)開(kāi)發(fā)、商城網(wǎng)站制作,成都小程序開(kāi)發(fā),軟件按需規(guī)劃網(wǎng)站等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。憑借多年豐富的經(jīng)驗(yàn),我們會(huì)仔細(xì)了解各客戶的需求而做出多方面的分析、設(shè)計(jì)、整合,為客戶設(shè)計(jì)出具風(fēng)格及創(chuàng)意性的商業(yè)解決方案,創(chuàng)新互聯(lián)建站更提供一系列網(wǎng)站制作和網(wǎng)站推廣的服務(wù)。
要學(xué)習(xí) shiro,我們首先需求去 shiro 官網(wǎng)下載 shiro,官網(wǎng)地址地址 https://shiro.apache.org/,截至本文寫(xiě)作時(shí),shiro 的最新穩(wěn)定版本為 1.4.0 ,本文將采用這個(gè)版本。當(dāng)然,shiro 我們也可以從 github 上下載到源碼。兩個(gè)源碼下載地址如下:
apache shiro
github-shiro
上面我主要是和小伙伴們介紹下源碼的下載,并沒(méi)有涉及到 jar 包的下載,jar 包我們到時(shí)候直接使用 maven 即可。
這里我們先不急著寫(xiě)代碼,我們先打開(kāi)剛剛下載到的源碼,源碼中有一個(gè)samples目錄,如下:
這個(gè) samples 目錄是官方給我們的一些演示案例,其中有一個(gè) quickstart 項(xiàng)目,這個(gè)項(xiàng)目是一個(gè) maven 項(xiàng)目,參考這個(gè) quickstart ,我們來(lái)創(chuàng)建一個(gè)自己的演示工程。
首先使用 maven 創(chuàng)建一個(gè) JavaSE 工程
工程創(chuàng)建成功后在pom文件中添加如下依賴:
org.apache.shiro
shiro-all
RELEASE
配置用戶
參考 quickstart 項(xiàng)目中的 shiro.ini 文件,我們來(lái)配置一個(gè)用戶,配置方式如下:首先在 resources 目錄下創(chuàng)建一個(gè) shiro.ini 文件,文件內(nèi)容如下:
[users]
sang=123,admin
[roles]
admin=*
以上配置表示我們創(chuàng)建了一個(gè)名為 sang 的用戶,該用戶的密碼是 123 ,該用戶的角色是 admin ,而 admin 具有操作所有資源的權(quán)限。
執(zhí)行登錄
OK,做完上面幾步之后,我們就可以來(lái)看看如何實(shí)現(xiàn)一次簡(jiǎn)單的登錄操作了。這個(gè)登錄操作我們依然是參考 quickstart 項(xiàng)目中的類來(lái)實(shí)現(xiàn),首先我們要通過(guò) shiro.ini 創(chuàng)建一個(gè) SecurityManager ,再將這個(gè) SecurityManager 設(shè)置為單例模式,如下:
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
如此之后,我們就配置好了一個(gè)基本的 Shiro 環(huán)境,注意此時(shí)的用戶和角色信息我們配置在 shiro.ini 這個(gè)配置文件中,接下來(lái)我們就可以獲取一個(gè) Subject 了,這個(gè) Subject 就是我們當(dāng)前的用戶對(duì)象,獲取方式如下:
Subject currentUser = SecurityUtils.getSubject();
拿到這個(gè)用戶對(duì)象之后,接下來(lái)我們可以獲取一個(gè) session 了,這個(gè) session 和我們 web 中的 HttpSession 的操作基本上是一致的,不同的是,這個(gè) session 不依賴任何容器,可以隨時(shí)隨地獲取,獲取和操作方式如下:
//獲取session
Session session = currentUser.getSession();
//給session設(shè)置屬性值
session.setAttribute("someKey", "aValue");
//獲取session中的屬性值
String value = (String) session.getAttribute("someKey");
說(shuō)了這么多,我們的用戶到現(xiàn)在還沒(méi)有登錄呢,Subject 中有一個(gè) isAuthenticated 方法用來(lái)判斷當(dāng)前用戶是否已經(jīng)登錄,如果 isAuthenticated 方法返回一個(gè) false,則表示當(dāng)前用戶未登錄,那我們就可以執(zhí)行登陸,登錄方式如下:
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) {
}
}
首先構(gòu)造 UsernamePasswordToken ,兩個(gè)參數(shù)就是我們的用戶名和密碼,然后調(diào)用 Subject 中的 login 方法執(zhí)行登錄,當(dāng)用戶名輸錯(cuò),密碼輸錯(cuò)、或者賬戶鎖定等問(wèn)題出現(xiàn)時(shí),系統(tǒng)會(huì)通過(guò)拋異常告知調(diào)用者這些問(wèn)題。
當(dāng)?shù)卿洺晒χ?,我們可以通過(guò)如下方式獲取當(dāng)前登陸用戶的用戶名:
log.info("User [" + currentUser.getPrincipal() + "] logged in successfully.");
我們也可以通過(guò)調(diào)用 Subject 中的 hasRole 和 isPermitted 方法來(lái)判斷當(dāng)前用戶是否具備某種角色或者某種權(quán)限,如下:
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.");
}
最后,我們可以通過(guò) logout 方法注銷本次登錄,如下:
currentUser.logout();
感謝各位的閱讀,以上就是“Shiro Realm權(quán)限認(rèn)證怎么實(shí)現(xiàn)”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Shiro Realm權(quán)限認(rèn)證怎么實(shí)現(xiàn)這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!