記得做的第一個(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)系。
-
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
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論