Apache Shiro:簡化應用程序安全性

考慮到JAVA已有10多年的歷史了,對于需要在其應用程序中內置身份驗證和授權的應用程序開發人員來說,選擇的數量非常少。

在JAVA和J2EE中,JAAS規范是一種嘗試解決安全性的問題。 盡管JAAS用于身份驗證,但授權部分卻過于繁瑣而無法使用。 EJB和Servlet規范在方法和資源級別提供了粗粒度的授權。 但是這些太粗糙了,無法在實際應用中使用。 對于Spring用戶,Spring Security是替代方法。 但是使用起來有點復雜,尤其是授權模型。 大多數應用程序最終都會構建用于身份驗證和授權的本地解決方案。

Apache Shiro是解決此問題的開源JAVA安全框架。 它是一個優雅的框架,可讓您輕松地向應用程序添加身份驗證,授權和會話管理。

Shiro的亮點是:

它是一個純Java框架。 它可以與各種JAVA應用程序一起使用:J2SE,J2EE,Web,獨立或分布式。

它可以輕松地與各種存儲庫集成,這些存儲庫可以承載用戶和權限元數據,例如RDBM,LDAP。

它具有一個簡單直觀的權限模型,可以應用于各種問題領域。 它是一個模型,可讓您專注于問題域,而不會陷入框架中。

它內置了對會話管理的支持。

它內置了對緩存元數據的支持。

它非常容易與Spring集成。 同樣適用于任何J2EE應用程序服務器。

最重要的是,它非常易于使用。 大多數時候,集成Shiro所需要做的就是實現將Shiro與用戶和權限元數據聯系起來的REALM。

Shiro概念

SecurityManager封裝了使用Shiro的應用程序的安全配置。

主題是正在使用系統的用戶的運行時視圖。 創建主題時,不會對其進行身份驗證。 對于身份驗證,必須調用login方法,并傳遞適當的憑據。

會話表示與已驗證主題關聯的會話。 會話具有會話ID。 應用程序可以在會話中存儲任意數據。 該會話有效,直到用戶注銷或會話超時。

權限表示主題可以對應用程序中的資源執行的操作。 開箱即用Shiro支持用冒號分隔的令牌表示的權限。 每個標記都有一些邏輯含義。 例如,我的應用程序可以將權限定義為ResourceType:actions:ResourceInstance。 更具體地說,File:read:contacts.doc表示讀取文件contact.doc的權限。 該權限必須與用戶關聯,才能將該權限授予該用戶。

角色是權限的集合,這些權限可能表示執行某些組織功能的能力。 角色使用戶和權限之間的關聯更易于管理。

領域為Shiro提取用戶,權限和角色元數據。 通過實現領域并將其插入Shiro,可以使此數據可用于Shiro。 典型的領域使用關系數據庫或LDAP來存儲用戶數據。

講解

讓我們構建一個簡單的java應用程序,該應用程序執行一些身份驗證和授權。 對于本教程,您將需要:

  1. 阿帕克史郎
  2. 一個Java開發環境。 我使用Eclipse。 但是您也可以使用其他IDE或命令行工具。
  3. 您可以從simpleshiro.zip下載此示例的源代碼。

步驟1:創建Shiro.ini配置文件

我們將使用Shiro隨附的默認文件庫領域。 這將從shiro.ini文件中讀取用戶/權限元數據。 在隨后的教程中,我將展示如何構建一個從關系數據庫獲取數據的領域。

在Ini文件中,讓我們定義一些用戶并將一些角色與其關聯。

# 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個用戶和3個角色。 權限建模
作為冒號分隔的標記。 每個令牌可以具有多個逗號分隔的部分。 每個域和部分都授予對某個特定于應用程序的域的權限。

步驟2:將BootStrap shiro插入您的應用程序

Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);

IniSecurityManagerFactory從shiro.ini加載配置,并為該應用程序創建單例SecurityManager。 為簡單起見,我們的shiro.ini使用默認的SecurityManager配置,該配置使用基于文本的領域,并從shiro.ini文件獲取用戶,權限和角色元數據。

步驟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是一種工廠類,用于獲取現有主題或創建新主題。 使用AuthenticationToken傳遞憑據。 在這種情況下,我們要傳遞用戶名和密碼,并因此使用UsernamePasswordToken。 然后,我們在傳入身份驗證令牌的主題上調用登錄方法。

步驟4:檢查使用者是否有權限

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 ");
}

主題有一個isPermitted方法,該方法將一個權限字符串作為參數并返回true / false。

步驟5:登出

usr.logout();

注銷方法將用戶注銷。
要熟悉Shiro,請嘗試更改UsernamePasswordToken并以其他用戶身份登錄。 檢查其他權限。 修改Shiro.ini文件以創建具有不同權限的新用戶和角色。 使用不同的元數據和不同的輸入多次運行該程序。

在生產環境中,您不需要ini文件中的用戶和角色。 您希望它們位于關系數據庫或LDAP之類的安全存儲庫中。 在下一部分中,我將向您展示如何構建可以使用關系數據庫中的用戶,角色,權限元數據的Shiro領域。

參考: Apache Shiro:我們的JCG合作伙伴 Manoj在The Khangaonkar Report博客上簡化了 應用程序安全性

相關文章:

  • 任何軟件開發公司應存在的服務,實踐和工具,第2部分
  • 使用Spring Security保護GWT應用程序
  • Java EE中的配置管理
  • 2011年排名前25位的最危險軟件錯誤
  • Spring MVC攔截器示例
  • Java中的Google ClientLogin實用程序

翻譯自: https://www.javacodegeeks.com/2011/10/apache-shiro-application-security-made.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Maven 導出依賴Jar,生成source.jar,javadoc.jar

下載最新版的Maven http://maven.apache.org/download.cgi 解壓到本地文件夾新建環境變量 MAVEN_HOME maven解壓目錄在path加入 %MAVEN_HOME%/bin;需要確保已經有Java環境變量 (打開cmd java -version,javac -version兩個命令看正常不)一、導出到默認目…

python提取包含特定字符串的行_python語言----txt中搜索特定字符串所在行

打開IDLE(python),并新創建一個py文件,編輯內容為: 本示例演示如何在一個txt文件中搜索特定的字符串,并將其行顯示# 1. 打開文件# 2. 讀取行信息# 3. 判斷是否包含關鍵詞# 4. 不包含則循環操作,包含的話將行顯示并退出…

asp.net 分布式應用開發

Net Framework推出的許多新技術為上述任務的實現提供了相對簡單的解決方案。其中,基于SOAP的Web Service在處理分布式應用時具有比傳統的DCOM/CORBA明顯的優點,結合基于Web的ASP.NET頁面開發技術和SQL Server數據存儲技術(或Xml文檔&#xff…

Spring Data JPA的持久層

1.概述 本文將重點介紹Spring 3.1,JPA和Spring Data的持久層的配置和實現。 有關使用基于Java的配置和項目的基本Maven pom設置Spring上下文的分步介紹,請參閱本文 。 持久性與春天 系列 : 第1部分 – 具有Spring 3.1和Hibernate的持久層 …

C語言開發筆記(三)自加和自減

看到一段代碼&#xff0c;被坑了。 #include <stdio.h>int main(void) {int a 7;printf("%d\n", a);printf("%d\n", a--);printf("%d\n", -a);printf("%d\n", -a--);printf("%d\n", a);return 0; } 結果為 -a的邏輯…

求解數獨回溯算法

實現的java代碼如下&#xff08;該算法只是將結果打印輸出&#xff0c;并沒有對原數組實現更改&#xff09;&#xff1a; //判斷a[i][j]取值val是否有效public boolean isValid(int[][] a, int i, int j, int val){//判斷是否跟同行沖突for(int j10;j1<9;j1){if(a[i][j1]val…

python語言屬于哪一種語言_Python與Java:你應該學習哪種語言,他們有什么區別?...

在企業招聘中&#xff0c; Python和Java經常是需求最大的編程語言。這兩種編程功能強大&#xff0c;靈活且面向對象的語言&#xff0c;通常在組織中和各種其他設置中使用。這可能會導致我們提出一個不可避免的問題&#xff1a;哪個更好&#xff1f; 這是一個復雜的問題&#xf…

關于手機端CSS Sprite圖標定位的一些領悟

今天在某個群里面閑逛&#xff0c;看見一個童鞋分享了一個攜程的移動端的頁面。地址這里我也分享下吧&#xff1a;http://m.ctrip.com/html5/在手機端我都很少用雪碧圖合并定位圖標&#xff0c;用的比較多就是用字體圖標來代替&#xff0c;有些圖標不多的時候就自己單個的切出來…

將Java向前推進? 一個定義。 一年回顧。

這篇文章是許多其他“年終”博客文章和評論之一。 但這并不是這樣。 我正在嘗試總結我在2011年所學到的有關Oracle和Java的知識&#xff0c;還試圖解釋“將Java向前推進”對我的意義以及我認為應該更好或更簡單地改變的東西。 感謝您全年關注我的博客&#xff0c;也感謝您在Twi…

c語言程序源代碼_程序的編譯、鏈接和執行

同學們總是抱怨每次見到一道面試題都很難把它轉化為程序源代碼。然而不幸的是&#xff0c;即使是程序源代碼對于計算機來說也還是太高級了。要想讓計算機執行一段程序&#xff0c;我們必須把它翻譯成最底層的機器指令才行。這其中要經歷很多步驟。幸運的是有很多現成的工具可以…

Ubuntu下tftp服務器的搭建

參考博客&#xff1a;http://blog.chinaunix.net/uid-26495963-id-3206829.html1. 安裝$ apt-get install tftp-hpa tftpd-hpa2. 建立目錄$ mkdir /tftpboot # 這是建立tftp傳輸目錄。$ sudo chmod 777 /tftpboot$ sudo touch test.txt # test.txt文件最好輸入內容以便區分3. 配…

【程序員眼中的統計學(1)】信息圖形化:第一印象

信息圖形化&#xff1a;第一印象 作者 白寧超 2015年10月13日23:23:13 摘要&#xff1a;程序員眼中的統計學系列是作者和團隊共同學習筆記的整理。首先提到統計學&#xff0c;很多人認為是經濟學或者數學的專利&#xff0c;與計算機并沒有交集。誠然在傳統學科中&#xff0c;其…

JBoss AS 7.0.2“ Arc”發布–使用綁定選項

有關JBoss AS7方面的更多好消息。 JBoss AS 7.0.2.Final“ Arc”已經發布&#xff01; 自AS 7.0.1發布以來已經過去了一個月。 在這短時間內&#xff0c;已修復了許多錯誤&#xff0c;并實現了更多功能和改進。 所有這些錯誤修復和功能已包含在此7.0.2版本中。 此新版本主要包…

C語言開發筆記(五)字符串常量

#include <stdio.h> #include <string.h>int main(void) {char *str "sting";strcpy(str, "hello");printf("%s\n", str);return 0; } 代碼為什么會運行錯誤&#xff0c;異常退出&#xff1f; 這段代碼是新手常見錯誤之一。 定義…

不屬于python標準庫的是_python標準庫和擴展庫

Tkinter ———— Python 默認的圖形界面接口。 Tkinter 是一個和 Tk 接口的模塊&#xff0c; Tkinter 庫提供 了對 Tk API 的接口&#xff0c;它屬于 Tcl/Tk 的 GUI 工具組。 Tcl/Tk 是由 John Ousterhout 發展的書寫和 圖形設備。 Tcl( 工具命令語言 ) 是個宏語言&#xff0c…

Android N 新特性 + APP開發注意事項

1. 多窗口MultiWindow 多窗口MultiWindow&#xff0c;這是Android N里對開發者影響比較大的特性&#xff0c;也是大家疑問比較多的地方。站在開發者的角度其實不必太擔心這個特性會導致我們需要修改很多代碼來適配系統。Google的工程師們也不希望這個特性導致很多應用出現問題&…

C語言開發筆記(六)實參和形參

舉例說明 #include <stdio.h>void swap(int x, int y) {int temp 0;temp x;x y;y temp; }int main(void) {int a 1, b 2;swap(a, b);printf("a%d, b%d\n", a, b);return 0; }結果為 在函數調用時&#xff0c;a的值傳給x&#xff0c;b的值傳給y。執行完…

Spring Singleton,請求,會話Bean和線程安全

由眾多有用框架組成的Spring框架生態系統已成為許多Java EE應用程序的基礎。 但是在所有Spring產品的核心中&#xff0c;我們仍然擁有Spring DI / IOC框架&#xff0c;該框架將Spring推向了新的高度。 隨著越來越多的人將Spring MVC或JSF-Spring集成用于他們的應用程序&#xf…

some fragments

1.fullpage 2.one page.js 3.scrollReveal.js 4.wow.js 5.瀏覽器前綴&#xff1a; -webkit- &#xff1a; Safari&#xff0c;Chrome -o- &#xff1a; Opera -moz- &#xff1a; Firefox -ms- &#xff1a; IE   6.css3過渡動畫&#xff1a;transitio…

面試之ajax原理(轉載)

總結1 總結2 AJAX全稱為“Asynchronous JavaScript and XML”&#xff08;異步JavaScript和XML&#xff09;&#xff0c;是一種創建交互式網頁應用的網頁開發技術&#xff0c; 是幾種原有技術的結合體。它由下列技術組合而成。 1.使用CSS和XHTML來表示。 2. 使用DOM模型來交互和…