[翻譯-Shiro]-10分鐘教會你Apache Shiro
最近在研究Apache Shiro準備將自認為比較重要的資料翻譯成中文(明天去拔牙,嗚嗚)。時間允許的情況下會盡可能多的翻譯
前言
歡迎來到Apache Shiro 10分鐘之旅!
希望通過這個簡單、快速的示例,可以讓你對應用程式中使用Shiro有個深入的瞭解。嗯,10分鐘你應該可以搞定它。
概述
Apache Shiro是什麼?
Apache Shiro一個功能強大,使用簡單的Java安全框架,它為開發人員提供一個直觀而全面的認證,授權,加密及會話管理的解決方案。
實際上,Shiro的主要功能是管理應用程式中與安全相關的全部,同時儘可能支援多種實現方法。Shiro是建立在完善的介面驅動設計和麵向物件原則之上的,支援各種自定義行為。Shiro提供的預設實現,使其能完成與其他安全框架同樣的功能,這不也是我們一直努力想要得到的嗎!
那麼Apache Shiro能用來做什麼呢?
很多,很多,嘿嘿。但是不在快速指南中做介紹,如果你想知道,那怎麼辦呢?去這裡找尋你的答案吧。當然如果你還想知道我們什麼時候,以及為什麼要“創造”Shiro,去看看Shrio的歷史和使命吧。
OK,現在讓我們動手做點兒什麼吧。
注:Shiro可以在任何環境下執行,小到最簡單的命令列應用,大到大型的企業應用以及叢集應用。但是我們準備在快速指南中使用最最簡單的main方法的方式,讓你對Shiro的API有個感官的認識。
下載
- 確保已經安裝了JDK1.5+和Maven2.2+
- 去這裡下載最新已釋出的原始碼。例子中我們使用1.1.0釋出版本。
- 解壓原始碼
進入快速指南資料夾
cd shiro-root-1.1.0/samples/quickstart
執行快速指南
mvn compile exec:java
過程中會輸出日誌資訊,用來告訴你正在進行的是什麼,最後退出執行。可以在這裡“samples/quickstart/src/main/java/Quickstart.java ”找到原始碼,也可以進行修改,記得修改後執行“mvn compile exec:java ”即可。
Quickstart.java
Quickstart.java中包含剛剛我們提到的所有內容(認證、授權等等),通過這個簡單的示例可以讓你輕鬆的熟悉Shiro的API。那麼,讓我們把Quickstart.java中的程式碼,一點一點剖析,這樣便於理解它們的作用。 幾乎所有的環境下,都可以通過這種方式獲取當前使用者:
Subject currentUser = SecurityUtils.getSubject();
通過SecurityUtils.getSubject(),就可以獲取當前Subject。Subject是應用中使用者的一個特定安全的縮影,雖然感覺上直接使用User會更貼切,但是實際上它的意義遠遠超過了User。而且每個應用程式都會有自己的使用者以及框架,我們可不想和它們混淆在一起,況且Subject就是安全領域公認的名詞。OK,我們繼續。
在單應用系統中,呼叫getSubject()會返回一個Subject,它是位於應用程式中特定位置的使用者資訊;在伺服器中執行的情況下(比如web應用),getSubject會返回一個位於當前執行緒或請求中的使用者資訊。 現在你已經得到了Subject物件,那麼用它可以做什麼呢?
如果你想得到應用中使用者當前Session的其他引數,可以這樣獲取Session物件:
Session session = currentUser.getSession();
session.setAttribute( "someKey", "aValue" );
這個Session物件是Shiro中特有的物件,它和我們經常使用的HttpSession非常相似,但還提供了額外的東西,其中與HttpSession最大的不同就是Shiro中的Session不依賴HTTP環境(換句話說,可以在非HTTP 容器下執行)。
如果將Shiro部署在web應用程式中,那麼這個Session就是基於HttpSession的。但是像QuickStart示例那樣,在非web環境下使用,Shiro則預設使用EnterpriseSessionManagment。也就是說,不論在應用中的任何一層使用同樣的API,卻不需要考慮部署環境,這一優點為應用開啟一個全新的世界,因為應用中要獲取Session物件再也不用依賴於HttpSession或者EJB的會話Bean。而且任何客戶端技術都可以共享session 資料。
現在你可以得到當前Subject和它的Session物件。那麼我們如何驗證比如角色和許可權這些東西呢?
很簡單,可以通過已得到的user物件進行驗證。Subject物件代表當前使用者,但是,誰才是當前使用者呢?他們可是匿名使用者啊。也就是說,必須登入才能獲取到當前使用者。沒問題,這樣就可以搞定:
if ( !currentUser.isAuthenticated() ) {
//collect user principals and credentials in a gui specific manner
//such as username/password html form, X509 certificate, OpenID, etc.
//We'll use the username/password example here since it is the most common.
//(do you know what movie this is from? ;)
UsernamePasswordToken token = new UsernamePasswordToken("lonestarr", "vespa");
//this is all you have to do to support 'remember me' (no config - built in!):
token.setRememberMe(true);
currentUser.login(token);
}
就是這樣,太簡單了吧!
那登入失敗了怎麼處理呢?可以通過捕獲各類異常,根據不同型別的異常做出不同的處理:
try {
currentUser.login( token );
//if no exception, that's it, we're done!
} catch ( UnknownAccountException uae ) {
//username wasn't in the system, show them an error message?
} catch ( IncorrectCredentialsException ice ) {
//password didn't match, try again?
} catch ( LockedAccountException lae ) {
//account for that username is locked - can't login. Show them a message?
}
... more types exceptions to check if you want ...
} catch ( AuthenticationException ae ) {
//unexpected condition - error?
}
可以捕獲Shiro提供的各種異常,也可以丟擲自定義類異常用於處理Shiro未考慮到的情況。預知詳情,可以去了解AuthenticationException JavaDoc。
提示:最安全的做法是將登入失敗的訊息告知使用者,你總不會幫助攻擊者入侵你的系統吧!
OK,現在已經擁有一個登入使用者了,我們還能做點兒什麼呢?
比方說,他們是誰:
//print their identifying principal (in this case, a username):
log.info( "User [" + currentUser.getPrincipal() + "] logged in successfully." );
也可以判斷使用者是否擁有特定的角色:
if ( currentUser.hasRole( "schwartz" ) ) {
log.info("May the Schwartz be with you!" );
} else {
log.info( "Hello, mere mortal." );
}
還可以判斷使用者是否對特定某實體有操作許可權:
if ( currentUser.isPermitted( "lightsaber:weild" ) ) {
log.info("You may use a lightsaber ring. Use it wisely.");
} else {
log.info("Sorry, lightsaber rings are for schwartz masters only.");
}
當然,還可以進行功能強大的例項級別的許可權驗證。通過它可以判斷使用者是否有訪問特定型別例項的許可權:
if ( currentUser.isPermitted( "winnebago:drive:eagle5" ) ) {
log.info("You are permitted to 'drive' the 'winnebago' with license plate (id) 'eagle5'. " +"Here are the keys - have fun!");
} else {
log.info("Sorry, you aren't allowed to drive the 'eagle5' winnebago!");
}
小菜一碟,對吧。
最後,當使用者使用完畢,還可以退出應用。
currentUser.logout(); //removes all identifying information and invalidates their session too.
這些就是使用Apache Shiro開發應用的核心了,當然,Apache Shiro已將將很多複雜的東西封裝在內部了,但是現在它就是這麼簡單。
你會有疑問吧,使用者登入時,誰負責把使用者資訊(使用者名稱、密碼、角色、許可權等)取出來,還有執行時,誰負責安全認證呢?當然由你決定了啊。通過將一個實現了Shiro中的Realm的Reaml配置到Shiro中即可。
至於如何配置很大程度上取決於你的執行時環境,比如在單應用、web應用、基於Spring或JEE 容器的應用或者組合模式中使用Shiro,配置都有所不同。如何配置已經超出QuickStart示例的範圍,因為它的主要目的是幫助你熟悉Shiro的API和概念。
如果想進一步瞭解Shiro,可以看看Authentication Guide和Authorization Guide。也可以檢視其他文件(特別是Reference Manual),這裡可以解決你的各種疑問。
感謝一路同行,希望你能喜歡使用Apache Shiro。
相關文章
- [翻譯-Shiro]-Apache Shiro 簡介Apache
- [翻譯-Shiro]-Apache Shiro 框架解析Apache框架
- [翻譯-Shiro]-Apache Shiro Java認證指南ApacheJava
- [翻譯-Shiro]-Apache Shiro Java 授權指南ApacheJava
- [翻譯-Shiro]-Apache Shiro Java註解列表ApacheJava
- [翻譯-Shiro]-Apache Shiro JSP/GSP標籤庫ApacheJS
- [翻譯-Shiro]-整合Apache Shiro到基於Spring的應用ApacheSpring
- Apache Shiro 快速入門教程,shiro 基礎教程Apache
- org.apache.shiro.authc.UsernamePasswordTokenApache
- shiro org.apache.shiro.session.mgt.SimpleSession物件 反序列化失敗ApacheSession物件
- 3分鐘教會你如何釋出Qt程式QT
- Apache Shiro 反序列化漏洞分析Apache
- Apache Shiro 550反序列化漏洞Apache
- [譯] 用 Apache Shiro 來保護一個 Spring Boot 應用ApacheSpring Boot
- shiro教程(2): shiro介紹
- Shiro報錯-[org.apache.shiro.mgt.AbstractRememberMeManager] - There was a failure while trying to retrieve remembered principals.ApacheREMAIWhile
- 【Shiro】4.Springboot整合ShiroSpring Boot
- C# 10分鐘完成百度翻譯(機器翻譯)——入門篇C#
- Shiro 教程
- Shiro【授權、整合Spirng、Shiro過濾器】過濾器
- Shiro系列教程之一Shiro簡介
- java反序列化——apache-shiro復現分析JavaApache
- Spring MVC 中使用 Apache Shiro 安全框架詳解SpringMVCApache框架
- 基於spring框架的apache shiro簡單整合Spring框架Apache
- shiro 整合MybatisMyBatis
- shiro面試題面試題
- 你的安卓專案編譯要花 10 分鐘,如何縮短到 1 分鐘?安卓編譯
- Shiro許可權管理框架(一):Shiro的基本使用框架
- 關於shiro安全框架和shiro的認證流程框架
- 【shiro】11.shiro過濾器鑑權setFilterChainDefinitionMap過濾器FilterAI
- web開發安全框架中的Apache Shiro的應用Web框架Apache
- 兩分鐘教會你重灌系統Windows10,簡單到全程自動化搞定Windows
- spring shiro+cas 前後端分離Spring後端
- shiro remembeMe 原理分析REM
- spring-shiroSpring
- Shiro(授權Authorization)
- springMVC整合shiroSpringMVC
- 10分鐘教你用Python實現微信翻譯機器人Python機器人