apache shiro_Apache Shiro:简化应用程序安全性
apache shiro
考慮到JAVA已有10多年的歷史了,需要在其應(yīng)用程序中內(nèi)置身份驗(yàn)證和授權(quán)的應(yīng)用程序開發(fā)人員的選擇數(shù)量之低令人震驚。在JAVA和J2EE中,JAAS規(guī)范是一種嘗試解決安全性的問題。 盡管JAAS用于身份驗(yàn)證,但授權(quán)部分卻過于繁瑣而無法使用。 EJB和Servlet規(guī)范在方法和資源級(jí)別提供了粗粒度的授權(quán)。 但是這些都太粗糙了,無法在實(shí)際應(yīng)用中使用。 對(duì)于Spring用戶,Spring Security是替代方法。 但是使用起來有點(diǎn)復(fù)雜,尤其是授權(quán)模型。 大多數(shù)應(yīng)用程序最終都會(huì)構(gòu)建用于身份驗(yàn)證和授權(quán)的本地解決方案。
Apache Shiro是解決此問題的開源JAVA安全框架。 這是一個(gè)優(yōu)雅的框架,可讓您輕松地向應(yīng)用程序添加身份驗(yàn)證,授權(quán)和會(huì)話管理。
Shiro的亮點(diǎn)是:
這是一個(gè)純Java框架。 它可以與各種JAVA應(yīng)用程序一起使用:J2SE,J2EE,Web,獨(dú)立或分布式。
它可以輕松地與各種存儲(chǔ)庫(kù)集成,這些存儲(chǔ)庫(kù)可以承載用戶和權(quán)限元數(shù)據(jù),例如RDBM,LDAP。
它具有一個(gè)簡(jiǎn)單直觀的權(quán)限模型,可以應(yīng)用于各種問題域。 它是一個(gè)模型,可讓您專注于問題域而不會(huì)陷入框架中。
它內(nèi)置了對(duì)會(huì)話管理的支持。
它內(nèi)置了對(duì)緩存元數(shù)據(jù)的支持。
它非常容易與Spring集成。 同樣適用于任何J2EE應(yīng)用程序服務(wù)器。
最重要的是,它非常易于使用。 大多數(shù)時(shí)候,集成Shiro所需要做的就是實(shí)現(xiàn)將Shiro與用戶和權(quán)限元數(shù)據(jù)聯(lián)系起來的REALM。
Shiro概念
SecurityManager封裝了使用Shiro的應(yīng)用程序的安全配置。
主題是正在使用系統(tǒng)的用戶的運(yùn)行時(shí)視圖。 創(chuàng)建主題時(shí),不會(huì)對(duì)其進(jìn)行身份驗(yàn)證。 對(duì)于身份驗(yàn)證,必須調(diào)用login方法,并傳遞適當(dāng)?shù)膽{據(jù)。
會(huì)話表示與已驗(yàn)證主題關(guān)聯(lián)的會(huì)話。 會(huì)話具有會(huì)話ID。 應(yīng)用程序可以在會(huì)話中存儲(chǔ)任意數(shù)據(jù)。 該會(huì)話有效,直到用戶注銷或會(huì)話超時(shí)。
權(quán)限表示主題可以對(duì)應(yīng)用程序中的資源執(zhí)行的操作。 開箱即用Shiro支持用冒號(hào)分隔的令牌表示的權(quán)限。 每個(gè)標(biāo)記都有一些邏輯含義。 例如,我的應(yīng)用程序可以將權(quán)限定義為ResourceType:actions:ResourceInstance。 更具體地說,File:read:contacts.doc代表讀取文件contact.doc的權(quán)限。 該權(quán)限必須與用戶關(guān)聯(lián),才能將該權(quán)限授予該用戶。
角色是權(quán)限的集合,這些權(quán)限可能表示執(zhí)行某些組織功能的能力。 角色使用戶和權(quán)限之間的關(guān)聯(lián)更易于管理。
領(lǐng)域?yàn)镾hiro提取您的用戶,權(quán)限和角色元數(shù)據(jù)。 通過實(shí)現(xiàn)領(lǐng)域并將其插入Shiro,可以使此數(shù)據(jù)可用于Shiro。 典型的領(lǐng)域使用關(guān)系數(shù)據(jù)庫(kù)或LDAP來存儲(chǔ)用戶數(shù)據(jù)。
講解
讓我們構(gòu)建一個(gè)簡(jiǎn)單的java應(yīng)用程序,該應(yīng)用程序執(zhí)行一些身份驗(yàn)證和授權(quán)。 對(duì)于本教程,您將需要:
步驟1:創(chuàng)建Shiro.ini配置文件
我們將使用Shiro隨附的默認(rèn)文件庫(kù)領(lǐng)域。 這將從shiro.ini文件中讀取用戶/權(quán)限元數(shù)據(jù)。 在隨后的教程中,我將展示如何構(gòu)建一個(gè)從關(guān)系數(shù)據(jù)庫(kù)獲取數(shù)據(jù)的領(lǐng)域。
在Ini文件中,讓我們定義一些用戶并將一些角色與其關(guān)聯(lián)。
# Simple shiro.ini file [users] # user admin with password 123456 and role Administrator admin = 123456, Administrator # user mike with password abcdef and role Reader mike = abcdef, Reader # user joe with password !23abC2 and role Writer joe = !23abC2, Writer # ----------------------------------------------------------------------------- # Roles with assigned permissions [roles] # A permission is modeled as Resourcetype:actions:resourceinstances # Administrator has permission to do all actions on all resources Administrator = *:*:* # Reader has permission to read all files Reader = File:read:* # Writer role has permission to read and write all files Writer = File:read,write:* 在上面的shiro.ini中,我們定義了3個(gè)用戶和3個(gè)角色。 權(quán)限建模
作為冒號(hào)分隔的標(biāo)記。 每個(gè)令牌可以具有多個(gè)逗號(hào)分隔的部分。 每個(gè)域和每個(gè)部分都授予對(duì)某些特定于應(yīng)用程序的域的權(quán)限。
步驟2:將BootStrap shiro插入您的應(yīng)用程序
Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini"); SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager);IniSecurityManagerFactory從shiro.ini加載配置,并為應(yīng)用程序創(chuàng)建單例SecurityManager。 為簡(jiǎn)單起見,我們的shiro.ini使用默認(rèn)的SecurityManager配置,該配置使用基于文本的領(lǐng)域,并從shiro.ini文件獲取用戶,權(quán)限和角色元數(shù)據(jù)。
步驟3:登入
Subject usr = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("mike", "abcdef"); try {usr.login(token); } catch (AuthenticationException ae) {log.error(ae.toString()) ;return ; } log.info("User [" + usr.getPrincipal() + "] logged in successfully.");SecurityUtils是用于獲取現(xiàn)有主題或創(chuàng)建新主題的工廠類。 使用AuthenticationToken傳遞憑據(jù)。 在這種情況下,我們要傳遞用戶名和密碼,因此要使用UsernamePasswordToken。 然后,我們?cè)趥魅肷矸蒡?yàn)證令牌的主題上調(diào)用登錄方法。
步驟4:檢查使用者是否有權(quán)限
if (usr.isPermitted("File:write:xyz.doc")) {log.info(usr.getPrincipal() + " has permission to write xyz.doc "); } else {log.info(usr.getPrincipal() + " does not have permission to write xyz.doc "); } if (usr.isPermitted("File:read:xyz.doc")) {log.info(usr.getPrincipal() + " has permission to read xyz.doc "); } else {log.info(usr.getPrincipal() + " does not have permission to read xyz.doc "); }主題具有一個(gè)isPermitted方法,該方法將一個(gè)權(quán)限字符串作為參數(shù)并返回true / false。
步驟5:登出
usr.logout(); 注銷方法將用戶注銷。
要熟悉Shiro,請(qǐng)嘗試更改UsernamePasswordToken并以其他用戶身份登錄。 檢查其他一些權(quán)限。 修改Shiro.ini文件以創(chuàng)建具有不同權(quán)限的新用戶和角色。 使用不同的元數(shù)據(jù)和不同的輸入幾次運(yùn)行該程序。
在生產(chǎn)環(huán)境中,您不需要ini文件中的用戶和角色。 您希望它們位于關(guān)系數(shù)據(jù)庫(kù)或LDAP之類的安全存儲(chǔ)庫(kù)中。 在下一部分中,我將向您展示如何構(gòu)建可以使用關(guān)系數(shù)據(jù)庫(kù)中的用戶,角色,權(quán)限元數(shù)據(jù)的Shiro領(lǐng)域。
參考: Apache Shiro:我們的JCG合作伙伴 Manoj在The Khangaonkar Report博客上簡(jiǎn)化了 應(yīng)用程序安全性
相關(guān)文章:
- 任何軟件開發(fā)公司應(yīng)存在的服務(wù),實(shí)踐和工具,第2部分
- 使用Spring Security保護(hù)GWT應(yīng)用程序的安全
- Java EE中的配置管理
- 2011年最危險(xiǎn)的25個(gè)軟件錯(cuò)誤
- Spring MVC攔截器示例
- Java中的Google ClientLogin實(shí)用程序
翻譯自: https://www.javacodegeeks.com/2011/10/apache-shiro-application-security-made.html
apache shiro
總結(jié)
以上是生活随笔為你收集整理的apache shiro_Apache Shiro:简化应用程序安全性的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ES常见查询示例
- 下一篇: Java中多线程的性能比较