shiro面試題

李荣先辈Java發表於2024-08-22

Shiro面試題

001什麼是許可權?

①許可權管理:一般指根據系統設定的安全策略或者安全規則,使用者可以訪問而且只能訪問自己被授權的資源,不多不少。許可權管理幾乎出現在任何系統裡面,只要有使用者和密碼的系統。
②許可權管理分類:
訪問許可權:管理員有增刪改查許可權,普通使用者只有查詢許可權。
資料許可權:管理員可以看到所有員工資訊,但是員工只能看到自己的資訊。

002什麼是認證?

身份認證,就是判斷一個使用者是否為合法使用者的處理過程。最常用的簡單身份認證方式是系統透過核對使用者輸入的使用者名稱和密碼,看其是否與系統中儲存的該使用者的使用者名稱和密碼一致,來判斷使用者身份是否正確。例如:密碼登入,手機簡訊驗證、三方授權等。

003Shiro框架用過嗎?

Apache Shiro是一個強大且易用的Java安全框架,能夠非常清晰的處理認證、授權、管理會話以及密碼加密。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式。

004Shiro的優點?

1.簡單的身份驗證,支援多種資料來源
2.對角色的簡單授權,支援細粒度的授權(方法)
3.支援一級快取,以提升應用程式的效能
4.內建基於POJO的企業會話管理,適用於web及非web環境
5.非常簡單的API加密
6.不跟任何框架繫結,可以獨立執行

005Shiro的核心元件?

Subject:主體,代表了當前“使用者”,這個使用者不一定是一個具體的人,與當前應用互動的任何東西都是Subject,如爬蟲、機器人等;即一個抽象概念;所有Subject都繫結到SecurityManager,與Subject的所有互動都會委託給SecurityManager;可以把Subject認為是一個門面;SecurityManager才是實際的執行者。
SecurityManager:安全管理器,即所有與安全有關的操作都會與SecurityManager互動,且它管理著所有Subject;可以看出它是shiro的核心, SecurityManager相當於spring mvc中的dispatcherServlet前端控制器。
Realm:域,shiro從Realm獲取安全資料(如使用者、角色、許可權),就是說SecurityManager要驗證使用者身份,那麼它需要從Realm獲取相應的使用者進行比較以確定使用者身份是否合法;也需要從Realm得到使用者相應的角色/許可權進行驗證使用者是否能進行操作;可以把Realm看成DataSource,即安全資料來源。

006Shiro認證執行流程?

1)透過ini配置檔案建立securityManager
2)呼叫subject.login方法主體提交認證,提交的token
3)securityManager進行認證,securityManager最終由ModularRealmAuthenticator進行認證。
4)ModularRealmAuthenticator呼叫IniRealm(給realm傳入token) 去ini配置檔案中查詢使用者資訊
5)IniRealm根據輸入的token(UsernamePasswordToken)從 shiro.ini查詢使用者資訊,根據賬號查詢使用者資訊(賬號和密碼)
如果查詢到使用者資訊,就給ModularRealmAuthenticator返回使用者資訊(賬號和密碼)
如果查詢不到,就給ModularRealmAuthenticator返回null
6)ModularRealmAuthenticator接收IniRealm返回Authentication認證資訊;
如果返回的認證資訊是null,ModularRealmAuthenticator丟擲異常(org.apache.shiro.authc.UnknownAccountException)
如果返回的認證資訊不是null(說明inirealm找到了使用者),對IniRealm返回使用者密碼 (在ini檔案中存在)和 token中的密碼 進行對比,如果不一致丟擲異常(org.apache.shiro.authc.IncorrectCredentialsException)

007Shiro授權執行流程?

1)對subject進行授權,呼叫方法isPermitted("permission串")
2)SecurityManager執行授權,透過ModularRealmAuthorizer執行授權
3)ModularRealmAuthorizer執行realm(自定義的Realm)從資料庫查詢許可權資料
呼叫realm的授權方法:doGetAuthorizationInfo
4)realm從資料庫查詢許可權資料,返回ModularRealmAuthorizer
5)ModularRealmAuthorizer呼叫PermissionResolver進行許可權串比對
6)如果比對後,isPermitted中"permission串"在realm查詢到許可權資料中,說明使用者訪問permission串有許可權,否則 沒有許可權,丟擲異常。

008Shiro註解有哪些?

1.@RequiresAuthentication : 表示當前Subject已經透過login進行了身份驗證;即 Subject.isAuthenticated() 返回 true
2.@RequiresUser : 表示當前Subject 已經身份驗證或者透過記住我登入的
3.@RequiresGuest : 表示當前Subject沒有身份驗證或透過記住我登陸過,即是遊客身份
4.@RequiresRoles(value = { “admin”, “user” }, logical = Logical.AND) : 表示當前 Subject 需要角色 admin和user
5.@RequiresPermissions(value = { “user:a”, “user:b” }, logical = Logical.OR) : 表示當前 Subject 需要許可權 user:a 或 user:b

相關文章