RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Shiro功能介紹

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-10-08 15:07 ? 次閱讀

記得做的第一個(gè)Web項(xiàng)目,系統(tǒng)認(rèn)證授權(quán)這塊就是基于Shiro實(shí)現(xiàn)的,當(dāng)時(shí)也是第一次接觸到這種類型的框架,同時(shí)是基于Spring做的集成,并且相關(guān)的配置都已經(jīng)是定制好的,只需要我們根據(jù)項(xiàng)目情況對(duì)極少部分配置進(jìn)行修改即可使用。對(duì)于其原理也只是知道個(gè)大概,具體實(shí)現(xiàn)細(xì)節(jié)可以說是一無所知。

Shiro作為安全框架,相比其他同類型框架,在整體結(jié)構(gòu)上更顯得簡(jiǎn)單且更易于理解,通過對(duì)Shrio的學(xué)習(xí),在理解里其實(shí)現(xiàn)原理后,對(duì)后面學(xué)習(xí)其他同類型的框架也會(huì)有很多幫助。

現(xiàn)在各種框架盛行,為解決企業(yè)問題提供了各種優(yōu)秀的解決方案,使開發(fā)者可以快速、簡(jiǎn)單、高效地搭建開發(fā)環(huán)境,用起來確實(shí)很方便,但是卻產(chǎn)生了強(qiáng)烈的依賴性,現(xiàn)在有多少人脫離了框架還能開發(fā)出想要的功能?當(dāng)然,框架我們還是要用的,但是隨著學(xué)習(xí)的不斷加深,在出現(xiàn)故障時(shí)我們及時(shí)定位問題,在當(dāng)前業(yè)務(wù)需求不滿足時(shí),我們需要快速找到解決方法。

功能介紹

以下是官網(wǎng)的一段話,直接介紹了Shiro能為我們做什么

Apache Shiro是一個(gè)功能強(qiáng)大且易于使用的Java安全框架,可執(zhí)行身份驗(yàn)證、授權(quán)、加密和會(huì)話管理。

圖片

特色

主要功能:

  • Authentication:身份認(rèn)證,證明用戶是否具有訪問系統(tǒng)的身份。
  • Authorization:訪問控制,即確定“誰”可以訪問系統(tǒng)的“什么”資源。
  • Session Management:會(huì)話管理,支持Web 或 EJB 應(yīng)用程序的會(huì)話管理。
  • Cryptography:使用密碼算法保持?jǐn)?shù)據(jù)安全,主要是密碼。
    其他功能:
    • Web Support::Shiro 的 Web 支持 API 有助于輕松保護(hù) Web 應(yīng)用程序。
    • Caching:緩存,確保 Apache Shiro API能夠快速和高效地操作。
    • Concurrency:Apache Shiro 支持多線程應(yīng)用程序的并發(fā)特性。
    • Testing:存在測(cè)試支持以幫助您編寫單元和集成測(cè)試,并確保您的代碼按預(yù)期執(zhí)行。
    • Run As:允許用戶假設(shè)為另一個(gè)用戶的身份的獲取其功能權(quán)限,在管理場(chǎng)景中很有用。
    • Remember Me:跨會(huì)話記住用戶的身份,在登錄時(shí)指明,省去下次登錄的過程。

實(shí)現(xiàn)架構(gòu)

圖片

架構(gòu)

  • Subject( org.apache.shiro.subject.Subject) 當(dāng)前與軟件交互的實(shí)體(用戶、第三方服務(wù)、cron任務(wù)等)的特定的安全性的“視圖”。
  • SecurityManager ( org.apache.shiro.mgt.SecurityManager ) SecurityManager是Shiro架構(gòu)的核心。它主要是一個(gè)綜合的大對(duì)象,用于協(xié)調(diào)其托管組件以確保它們順利協(xié)同工作。它還管理Shiro對(duì)每個(gè)應(yīng)用程序用戶的視圖,因此它知道如何為每個(gè)用戶執(zhí)行安全操作。
  • Authenticator ( org.apache.shiro.authc.Authenticator ) 該Authenticator組件負(fù)責(zé)執(zhí)行和響應(yīng)用戶的身份驗(yàn)證過程。當(dāng)用戶嘗試登錄時(shí),該邏輯由Authenticator實(shí)現(xiàn)并執(zhí)行。Authenticator通過用戶配置的多個(gè)Realms,按照一定的策略,驗(yàn)證提供的用戶是否滿足用戶身份。
    • AuthenticationStrategy ( org.apache.shiro.authc.pam.AuthenticationStrategy ) 當(dāng)配置了多個(gè)Realm時(shí),AuthenticationStrategy將協(xié)調(diào)調(diào)用Realm來確定用戶身份驗(yàn)證最終成功或失?。ū热缬幸粋€(gè)驗(yàn)證成功或每個(gè)都要驗(yàn)證成功)。
  • Authorizer ( org.apache.shiro.authz.Authorizer ) 是一個(gè)應(yīng)用訪問控制的組件。它是決定用戶是否被允許執(zhí)行某項(xiàng)操作。與Authenticator一樣,Authorizer能夠協(xié)調(diào)執(zhí)行多個(gè)Realm來獲取用戶的訪問角色和權(quán)限信息。
  • SessionManager ( org.apache.shiro.session.mgt.SessionManager ) 負(fù)責(zé)創(chuàng)建和管理用戶Session的生命周期。即使沒有可用的Web容器,Shiro能夠在任何環(huán)境中本地管理用戶會(huì)話。默認(rèn)情況下是基于Web容器實(shí)現(xiàn)會(huì)話機(jī)制,非Web環(huán)境則可以通過內(nèi)置的會(huì)話管理來提供相同的功能。可以通過SessionDAO實(shí)現(xiàn)會(huì)話的持久化。
    • SessionDAO ( org.apache.shiro.session.mgt.eis.SessionDAO ) 實(shí)現(xiàn)Session的持久化。
  • CacheManager ( org.apache.shiro.cache.CacheManager ) 因?yàn)镾hiro經(jīng)常訪問后端數(shù)據(jù)源進(jìn)行身份驗(yàn)證、授權(quán)和會(huì)話管理,通過緩存可以提高性能。
  • Cryptography( org.apache.shiro.crypto.* ) 密碼學(xué)是企業(yè)安全框架的擴(kuò)展。Shiro的crypto包含易于使用和理解的密碼、哈希(又名摘要)和不同編解碼器實(shí)現(xiàn)的實(shí)現(xiàn)。Shiro的加密API簡(jiǎn)化了復(fù)雜的Java機(jī)制,使密碼加密更容易。
  • Realm ( org.apache.shiro.realm.Realm ) Realm是Shiro和應(yīng)用程序安全數(shù)據(jù)之間的“橋梁”。當(dāng)用戶需要對(duì)身份進(jìn)行認(rèn)證或授權(quán)時(shí),Shiro會(huì)通過程序中配置的一個(gè)或多個(gè)Realm來查找滿足的數(shù)據(jù)。Shiro將根據(jù)需要與它們協(xié)調(diào)以進(jìn)行身份驗(yàn)證和授權(quán)。

相關(guān)術(shù)語

如果理解了官網(wǎng)里介紹的這些術(shù)語,那么在進(jìn)行shiro配置時(shí),需要配置哪些信息,,分別有什么作用,怎么配置應(yīng)該也會(huì)有一個(gè)較好的認(rèn)識(shí)。

Authentication是驗(yàn)證主體身份的過程——本質(zhì)上是證明某人確實(shí)是他們所說的那個(gè)人。當(dāng)身份驗(yàn)證嘗試成功時(shí),應(yīng)用程序可以相信該主體是應(yīng)用程序所期望的。

Authorization授權(quán),也稱為訪問控制,是確定是否允許用戶/主體做某事的過程。它通常通過檢查和解釋主題的角色和權(quán)限(見下文)然后允許或拒絕訪問請(qǐng)求的資源或功能來完成。

Cipher密碼是一種用于執(zhí)行加密或解密的算法。該算法通常依賴于稱為密鑰的一條信息。并且加密會(huì)根據(jù)密鑰而有所不同,因此如果沒有它,解密將非常困難。

密碼有不同的變體。塊密碼適用于通常具有固定大小的符號(hào)塊,而流密碼適用于連續(xù)的符號(hào)流。對(duì)稱密碼使用相同的密鑰進(jìn)行加密和解密,而非對(duì)稱密碼使用不同的密鑰。如果非對(duì)稱密碼中的密鑰不能從另一個(gè)密鑰導(dǎo)出,則可以公開共享一個(gè)密鑰,創(chuàng)建公鑰/私鑰對(duì)


Credential憑據(jù)是驗(yàn)證用戶/主體身份的一條信息 。在驗(yàn)證嘗試驗(yàn)證提交它們的用戶/主體實(shí)際上是關(guān)聯(lián)用戶期間,一個(gè)(或多個(gè))憑證與主體一起提交。憑證通常是只有特定用戶/主體才能知道的非常機(jī)密的東西,例如密碼或 PGP 密鑰或生物特征或類似機(jī)制。

這個(gè)想法是,對(duì)于委托人,只有一個(gè)人會(huì)知道與該委托人“配對(duì)”的正確憑證。如果當(dāng)前用戶/主題提供了與存儲(chǔ)在系統(tǒng)中的證書匹配的正確證書,那么系統(tǒng)可以假定并相信當(dāng)前用戶/主題確實(shí)是他們所說的那個(gè)人。信任程度隨著更安全的憑證類型(例如生物特征簽名 > 密碼)而增加。


Cryptography密碼學(xué)是一種通過隱藏信息或?qū)⑵滢D(zhuǎn)換為無意義的信息來保護(hù)信息免遭不受歡迎的訪問的做法,這樣其他人就無法閱讀它。Shiro 專注于密碼學(xué)的兩個(gè)核心元素:使用公鑰或私鑰對(duì)電子郵件等數(shù)據(jù)進(jìn)行加密的密碼,以及對(duì)密碼等數(shù)據(jù)進(jìn)行不可逆加密的哈希(又名消息摘要)。

Hash散列函數(shù)是將輸入源(有時(shí)稱為消息)單向、不可逆地轉(zhuǎn)換為編碼散列值(有時(shí)稱為消息摘要)。它通常用于密碼、數(shù)字指紋或具有底層字節(jié)數(shù)組的數(shù)據(jù)。

Permission至少在 Shiro 的解釋中,權(quán)限是描述應(yīng)用程序中原始功能的語句,僅此而已。權(quán)限是安全策略中最低級(jí)別的結(jié)構(gòu)。他們只定義應(yīng)用程序可以做什么。他們沒有描述“誰”能夠執(zhí)行這些操作。許可只是行為聲明,僅此而已。

Principal主體是應(yīng)用程序用戶(主題)的任何標(biāo)識(shí)屬性 “識(shí)別屬性”可以是任何對(duì)您的應(yīng)用程序有意義的東西——用戶名、姓氏、名字、社會(huì)安全號(hào)碼、用戶 ID 等等。就是這樣——沒什么瘋狂的。

Realm領(lǐng)域是可以訪問特定于應(yīng)用程序的安全數(shù)據(jù)(例如用戶、角色和權(quán)限)的組件。它可以被認(rèn)為是一個(gè)安全特定的 DAO(數(shù)據(jù)訪問對(duì)象)。Realm 將這種特定于應(yīng)用程序的數(shù)據(jù)轉(zhuǎn)換為 Shiro 可以理解的格式,因此無論存在多少數(shù)據(jù)源或您的數(shù)據(jù)可能是多么特定于應(yīng)用程序,Shiro 都可以反過來提供一個(gè)易于理解的主題編程 API。

領(lǐng)域通常與數(shù)據(jù)源(例如關(guān)系數(shù)據(jù)庫、LDAP 目錄、文件系統(tǒng)或其他類似資源)具有一對(duì)一的關(guān)聯(lián)。因此,Realm 接口的實(shí)現(xiàn)使用特定于數(shù)據(jù)源的 API 來發(fā)現(xiàn)授權(quán)數(shù)據(jù)(角色、權(quán)限等),例如 JDBC、文件 IO、Hibernate 或 JPA,或任何其他數(shù)據(jù)訪問 API。


Role角色的定義與交互的系統(tǒng)關(guān)聯(lián)。在許多應(yīng)用程序中,人們使用它來隱式定義安全策略充其量只是一個(gè)模糊的概念。Shiro 更喜歡將角色簡(jiǎn)單地解釋為權(quán)限的命名集合。就是這樣 - 聚合一個(gè)或多個(gè)權(quán)限聲明的應(yīng)用程序唯一名稱.

這是一個(gè)比許多應(yīng)用程序使用的隱含定義更具體的定義。如果您選擇讓您的數(shù)據(jù)模型反映 Shiro 的假設(shè),您會(huì)發(fā)現(xiàn)您將擁有更多控制安全策略的權(quán)力。

Session會(huì)話是與在一段時(shí)間內(nèi)與軟件系統(tǒng)交互的單個(gè)用戶/主體相關(guān)聯(lián)的有狀態(tài)數(shù)據(jù)上下文。當(dāng)主體使用應(yīng)用程序時(shí),可以從會(huì)話中添加/讀取/刪除數(shù)據(jù),并且應(yīng)用程序可以稍后在必要時(shí)使用這些數(shù)據(jù)。當(dāng)用戶/主體退出應(yīng)用程序或由于不活動(dòng)而超時(shí)時(shí),會(huì)話將終止。

對(duì)于熟悉 HttpSession 的人來說,ShiroSession具有相同的用途,除了 Shiro 會(huì)話可以在任何環(huán)境中使用,即使沒有可用的 Servlet 容器或 EJB 容器。


Subject主題只是花哨的安全術(shù)語,基本上意味著應(yīng)用程序用戶的特定于安全的“視圖” 。一個(gè)主題并不總是需要反映一個(gè)人 - 它可以代表一個(gè)調(diào)用您的應(yīng)用程序的外部進(jìn)程,或者可能是一個(gè)在一段時(shí)間內(nèi)間歇性執(zhí)行某些事情的守護(hù)程序系統(tǒng)帳戶(例如 cron 作業(yè))。它基本上是對(duì)應(yīng)用程序做某事的任何實(shí)體的表示。

關(guān)鍵模塊

EnvironmentLoaderListener

該類實(shí)現(xiàn)了ServletContextListener,因此我們?cè)趙eb.xml中配置后即可啟用,主要目的是為了構(gòu)建Enviroment對(duì)象并保存到ServleteContext中。

public class EnvironmentLoaderListener extends EnvironmentLoader implements ServletContextListener {

    public void contextInitialized(ServletContextEvent sce) {
        initEnvironment(sce.getServletContext());
    }

    public void contextDestroyed(ServletContextEvent sce) {
        destroyEnvironment(sce.getServletContext());
    }
}

Environment

Environment是一個(gè)Shiro容器,主要目的是提供SecurityManager對(duì)象。

public interface Environment {

    SecurityManager getSecurityManager();
}

SecurityManager

SecurityManager是Shiro框架中最核心的類,用戶的認(rèn)證、鑒權(quán)都是基于它來完成的,包含認(rèn)證、會(huì)話管理、RememberMe等功能,這也是開發(fā)者需要理解并配置較多的類。

public interface SecurityManager extends Authenticator, Authorizer, SessionManager {

    Subject login(Subject subject, AuthenticationToken authenticationToken) throws AuthenticationException;

    void logout(Subject subject);

    Subject createSubject(SubjectContext context);

}

Authenticator

實(shí)現(xiàn)了用戶的身份認(rèn)證邏輯,也就是密碼校驗(yàn),注意我們是通過對(duì)AuthenticationToken進(jìn)行認(rèn)證,在該Token中封裝了用戶提交的信息,

開發(fā)者只需要根據(jù)這些信息構(gòu)建AuthenticationInfo對(duì)象,密碼的校驗(yàn)過程是有Shiro代理完成的。

public interface Authenticator {

    public AuthenticationInfo authenticate(AuthenticationToken authenticationToken)
            throws AuthenticationException;
}

Authorizer

實(shí)現(xiàn)了用戶權(quán)限的鑒權(quán),包括權(quán)限和角色,鑒權(quán)過程在整個(gè)系統(tǒng)的生命周期中是比較頻繁的,我們應(yīng)該配置CacheManager來提高系統(tǒng)效率,避免頻繁的進(jìn)行DAO操作。

public interface Authorizer {

    boolean isPermitted(PrincipalCollection principals, String permission);

    boolean isPermittedAll(PrincipalCollection subjectPrincipal, String... permissions);

    void checkPermission(PrincipalCollection subjectPrincipal, String permission) throws AuthorizationException;

    boolean hasRole(PrincipalCollection subjectPrincipal, String roleIdentifier);

    boolean hasAllRoles(PrincipalCollection subjectPrincipal, Collection< String > roleIdentifiers);

    void checkRole(PrincipalCollection subjectPrincipal, String roleIdentifier) throws AuthorizationException;
 
 // ...
    
}

SessionManager

會(huì)話管理主要是為了實(shí)現(xiàn)認(rèn)證保持,即一次認(rèn)證成功后基于Cookie/Session機(jī)制,使下次會(huì)話不需要重復(fù)認(rèn)證。在集群環(huán)境中,如果通過容器來管理會(huì)話那樣就沒辦法實(shí)現(xiàn)會(huì)話共享,我們可以通過一些分布式會(huì)話管理框架來實(shí)現(xiàn)。

public interface SessionManager {

    Session start(SessionContext context);

    Session getSession(SessionKey key) throws SessionException;
}

SubjectDAO實(shí)現(xiàn)Subject對(duì)象的保存,比如將Subject保存的Session或者到數(shù)據(jù)庫。一般情況下,我們通過 SecurityUtils.getSubject()獲取Subject對(duì)象,這里沒有提供get方法。

public interface SubjectDAO {

    Subject save(Subject subject);

    void delete(Subject subject);
}

RememberMeManager

記住我,實(shí)現(xiàn)用戶在會(huì)話超時(shí)后,不需要重新登錄即可進(jìn)入系統(tǒng),默認(rèn)是基于Cookie實(shí)現(xiàn),主要將用戶信息寫入到Cookie中,并設(shè)置一個(gè)有效期,比如14天。

public interface RememberMeManager {

    PrincipalCollection getRememberedPrincipals(SubjectContext subjectContext);

    void forgetIdentity(SubjectContext subjectContext);

    void onSuccessfulLogin(Subject subject, AuthenticationToken token, AuthenticationInfo info);

    void onFailedLogin(Subject subject, AuthenticationToken token, AuthenticationException ae);

    void onLogout(Subject subject);
}

CacheManager

緩存,上面說到在鑒權(quán)時(shí)通過緩存提高API效率,還可以緩存Session實(shí)現(xiàn)Session快速存取。

public interface CacheManager {
    < K, V > Cache< K, V > getCache(String var1) throws CacheException;
}

Realm

Realm是開發(fā)者經(jīng)常需要重寫的,也是Shiro的擴(kuò)展點(diǎn),我們可以根據(jù)需要配置多個(gè)Realm,這樣可以實(shí)現(xiàn)多因子認(rèn)證,比如用戶名、郵箱、指紋等。一般可以通過繼承AuthenticatingRealm重寫抽象方法實(shí)現(xiàn)。

public interface Realm {

    String getName();

    boolean supports(AuthenticationToken token);

    AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException;

}

Subject

Subject也是Shiro中非常重要的對(duì)象,在系統(tǒng)中,我們的操作基本都是調(diào)用其內(nèi)部方法,最終由SecurityManager代理完成。比如常見的登錄、登出、是否有角色、是否有權(quán)限等。

public interface Subject {

 Object getPrincipal();
 
 PrincipalCollection getPrincipals();
 
 void login(AuthenticationToken token) throws AuthenticationException;

   // ...
}

AuthenticationToken

用戶提交的請(qǐng)求數(shù)據(jù)我們一般會(huì)進(jìn)行封裝,因?yàn)槌擞脩裘艽a,可能還會(huì)有一些其他信息,比如動(dòng)態(tài)碼、RememberMe標(biāo)識(shí),或者基于令牌的認(rèn)證。

public interface AuthenticationToken extends Serializable {

    Object getPrincipal();

    Object getCredentials();

}

SubjectContext

Subject上下文,保存了Subject相關(guān)的數(shù)據(jù),比如Subject、SecurityManager、Session等,在Subject間相互隔離。

public interface SubjectContext extends Map< String, Object > {

    Subject getSubject();

    PrincipalCollection getPrincipals();

    PrincipalCollection resolvePrincipals();

    Session getSession();

    Session resolveSession();

    boolean isAuthenticated();

    boolean isSessionCreationEnabled();

    boolean resolveAuthenticated();

    AuthenticationInfo getAuthenticationInfo();

    AuthenticationToken getAuthenticationToken();

}

ShiroFilter

Shiro過濾器鏈,前面一直提到基于Web的認(rèn)證基本都是通過Filter實(shí)現(xiàn),在一個(gè)Web項(xiàng)目中會(huì)有很多個(gè)Filter,而且會(huì)按照配置順序執(zhí)行,隱藏Shiro的過濾器會(huì)定義成鏈的模式,同時(shí)也是為了方便配置。開發(fā)者會(huì)根據(jù)業(yè)務(wù)需求配置過濾規(guī)則,最終都會(huì)由FilterChainResolver解析成過濾器鏈。

public class ShiroFilter extends AbstractShiroFilter {

    @Override
    public void init() throws Exception {
        WebEnvironment env = WebUtils.getRequiredWebEnvironment(getServletContext());

        setSecurityManager(env.getWebSecurityManager());

        FilterChainResolver resolver = env.getFilterChainResolver();
        if (resolver != null) {
            setFilterChainResolver(resolver);
        }
    }
}

Filter

在DefaultFilter中,我們可以看到這樣的定義,主要是為過濾器提供了別名方便開發(fā)者進(jìn)行配置。

anon(AnonymousFilter.class),
    authc(FormAuthenticationFilter.class),
    authcBasic(BasicHttpAuthenticationFilter.class),
    authcBearer(BearerHttpAuthenticationFilter.class),
    logout(LogoutFilter.class),
    noSessionCreation(NoSessionCreationFilter.class),
    perms(PermissionsAuthorizationFilter.class),
    port(PortFilter.class),
    rest(HttpMethodPermissionFilter.class),
    roles(RolesAuthorizationFilter.class),
    ssl(SslFilter.class),
    user(UserFilter.class),
    invalidRequest(InvalidRequestFilter.class);

一般配置如下:

/login.html = anon; //表示不需認(rèn)證也可訪問

/login.html = authc; //表示表單POST提交到/login.html請(qǐng)求時(shí)會(huì)根據(jù)提交的參數(shù)進(jìn)行身份認(rèn)證

/system = authcBasic; //根據(jù)請(qǐng)求頭Authorization:BASIC Base64(用戶名:密碼)的形式完成認(rèn)證

/system = authcBearer; //根據(jù)請(qǐng)求頭Authorization:Bearer Token的形式完成認(rèn)證

/logout = logout; //退出登錄

/authz = perms[update, :add, :delete: ]; //表示具有操作權(quán)限可訪問,支持' '通配符

/index.html = port[8080]; //表示8080請(qǐng)求端口才能訪問

//權(quán)限字符串由 type:action:instance 組成,在rest服務(wù)中,通過權(quán)限與請(qǐng)求方法構(gòu)建權(quán)限字符串[perm:mapping],

請(qǐng)求方法與action對(duì)應(yīng)關(guān)系如下:

// GET|HEAD|OPTIONS|TRACE -> read

// PUT -> update

// POST|MKCOL -> create

/ = rest

認(rèn)證流程

圖片

認(rèn)證流程

第1步:應(yīng)用程序代碼調(diào)用該Subject.login方法,傳入代表最終用戶的主體和憑據(jù)的構(gòu)造AuthenticationToken實(shí)例。

第2步:Subject實(shí)例,通常是一個(gè)類通過調(diào)用DelegatingSubject委托給應(yīng)用程序,實(shí)際的身份驗(yàn)證工作從這里開始。SecurityManagersecurityManager.login(token)

第3步:SecurityManager作為基本的綜合組件,接收令牌并通過調(diào)用簡(jiǎn)單地委托給其內(nèi)部Authenticator實(shí)例authenticator.authenticate(token)。一般是ModularRealmAuthenticator實(shí)例,它支持在身份驗(yàn)證期間協(xié)調(diào)一個(gè)或多個(gè)Realm實(shí)例。ModularRealmAuthenticator本質(zhì)上為 Apache Shiro提供了PAM樣式的范例(其中每個(gè)Realm 都是 PAM 術(shù)語中的“模塊”)。

第4步:如果Realm為應(yīng)用程序配置了多個(gè),ModularRealmAuthenticator實(shí)例將Realm使用其配置的 啟動(dòng)多重身份驗(yàn)證嘗試策略AuthenticationStrategy。Realms在調(diào)用 進(jìn)行身份驗(yàn)證之前、期間和之后,AuthenticationStrategy將根據(jù)每個(gè)Realm的執(zhí)行結(jié)果做出最終認(rèn)證的決定。

第5步:根據(jù)每一個(gè)配置Realm,判斷supports是否提交AuthenticationToken。如果匹配則以token為參數(shù)調(diào)用Realm的getAuthenticationInfo方法。該方法代表了Realm的一次身份驗(yàn)證嘗試。

結(jié)束語

關(guān)于shiro,很多都是介紹框架關(guān)鍵組件,比如SecurityManager,大部分功能都是圍繞該類展開,后面會(huì)通過實(shí)戰(zhàn),一步一步了解以上提到的各個(gè)模塊在項(xiàng)目運(yùn)行期間如何實(shí)現(xiàn)最終的用戶身份認(rèn)證以及對(duì)應(yīng)的訪問權(quán)限控制,以及細(xì)化到其具體的實(shí)現(xiàn)流程與模塊間的時(shí)序調(diào)用關(guān)系。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    19

    文章

    2966

    瀏覽量

    104702
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17475
  • 加密
    +關(guān)注

    關(guān)注

    0

    文章

    304

    瀏覽量

    23914
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    37

    文章

    3265

    瀏覽量

    57677
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    ALTIUM功能介紹

    ALTIUM功能介紹
    發(fā)表于 06-26 08:43

    什么是MQTT?MQTT功能介紹

    RT-ThreadMQTT客戶端功能特點(diǎn)MQTT簡(jiǎn)述MQTT功能介紹MQTT客戶端MQTT協(xié)議中的方法
    發(fā)表于 03-30 07:06

    TIM3功能介紹

    一般定時(shí)器(TIM3)(參考文獻(xiàn):STM32F030x4/6/8/C參考手冊(cè))TIM3介紹TIM3主功能功能介紹定時(shí)器基本單元功能圖計(jì)數(shù)器模
    發(fā)表于 08-04 07:37

    MCU環(huán)境與功能介紹

    寄存器編程,代碼簡(jiǎn)潔、執(zhí)行效率高、注釋到位、移植方便。項(xiàng)目完整源代碼下載地址(下載即可編譯運(yùn)行測(cè)試)二、功能介紹這是基于STM32F10...
    發(fā)表于 08-12 07:31

    介紹高級(jí)時(shí)鐘的PWM功能的應(yīng)用

    文章目錄前言前言從本文開始,介紹F429的高級(jí)時(shí)鐘特性。本文主要介紹高級(jí)時(shí)鐘的PWM功能的應(yīng)用。關(guān)于PWM,本文重點(diǎn)介紹實(shí)現(xiàn)帶有斷路功能的雙
    發(fā)表于 08-19 08:29

    Core的Ble藍(lán)牙功能介紹

    文章目錄前言一、Core的Ble藍(lán)牙功能介紹二、完整代碼前言ShineBlink Core開發(fā)板(簡(jiǎn)稱Core)采用的Soc芯片是Nordic半導(dǎo)體公司的Nrf52840芯片,內(nèi)置2.4G無線功能
    發(fā)表于 02-17 06:21

    DVP功能及應(yīng)用介紹

    數(shù)字?jǐn)z像頭并行接口(DVP)用于捕獲 CMOS 影像攝像機(jī)所輸出的并行數(shù)據(jù)。本文主要就 DVP 功能簡(jiǎn)介以及應(yīng)用介紹。
    發(fā)表于 10-25 06:15

    GPS功能介紹

    GPS功能介紹 功能介紹
    發(fā)表于 01-29 10:35 ?4954次閱讀

    shiro簡(jiǎn)單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證

    shiro簡(jiǎn)單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證
    發(fā)表于 09-09 08:18 ?9次下載
    <b class='flag-5'>shiro</b>簡(jiǎn)單教程,環(huán)境搭建,權(quán)限控制,登陸驗(yàn)證

    Apache Shiro框架的詳細(xì)資料說明

    對(duì)新的用戶機(jī)制并不熟悉,導(dǎo)致出現(xiàn)問題時(shí)耗費(fèi)了大量的時(shí)間來進(jìn)行修復(fù)。因此,我認(rèn)為我有必要編寫此文來介紹一下新的 Shiro 用戶機(jī)制。
    發(fā)表于 03-08 08:00 ?4次下載
    Apache <b class='flag-5'>Shiro</b>框架的詳細(xì)資料說明

    shiro綜合利用工具介紹

    shiro綜合利用工具:ShiroExp ? 工具介紹 shiro一把梭工具,該輪子主要有三大功能如下: 1、默認(rèn)密鑰爆破 利用SimplePrincipalCollection進(jìn)行檢
    的頭像 發(fā)表于 10-24 11:14 ?5389次閱讀

    再見了shiro

    在分布式項(xiàng)目里,比如電商項(xiàng)目,其實(shí)不太需要明確的權(quán)限劃分,說白了,我認(rèn)為沒必要做太麻煩的權(quán)限管理,一切從簡(jiǎn)。何況shiro對(duì)于springCloud等各種分布式框架來說,簡(jiǎn)直就是“災(zāi)難”。
    的頭像 發(fā)表于 01-15 11:32 ?704次閱讀

    Weblogic上的shiro漏洞利用工具介紹

    日常項(xiàng)目中,可能會(huì)碰見部署在weblogic上的shiro,所以先寫了這個(gè)生成攻擊payload的小Demo,方便后面使用。但目前只支持無回顯命令執(zhí)行,后續(xù)回顯、內(nèi)存馬功能后面出差后再寫。
    的頭像 發(fā)表于 07-27 09:10 ?1268次閱讀
    Weblogic上的<b class='flag-5'>shiro</b>漏洞利用工具<b class='flag-5'>介紹</b>

    shiro如何實(shí)現(xiàn)Web應(yīng)用認(rèn)證

    前面簡(jiǎn)單介紹shiro這個(gè)框架的一些基本知識(shí),包括其架構(gòu)模型,主要的功能,關(guān)鍵名稱的含義,以及核心模塊和對(duì)應(yīng)的接口定義。 開始的話 今天我們從一個(gè)簡(jiǎn)單示例,先了解使用shiro實(shí)現(xiàn)W
    的頭像 發(fā)表于 10-08 14:53 ?507次閱讀
    <b class='flag-5'>shiro</b>如何實(shí)現(xiàn)Web應(yīng)用認(rèn)證

    一個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本

    一個(gè)簡(jiǎn)單的Shiro RCE檢測(cè)和利用腳本。
    的頭像 發(fā)表于 01-09 09:46 ?638次閱讀
    RM新时代网站-首页