image.png
Shiro是Apache的開源安全框架凄鼻,提供了登錄認證随橘,授權喂分,加密,會話管理机蔗,緩存管理等功能蒲祈。
核心概念
Shiro包含了如下三個核心概念:
- Subject:主體,將用戶的概念理解為當前操作的主體萝嘁,可能是一個通過瀏覽器請求的用戶梆掸,也可能是其他的程序。Subject 代表了當前用戶的安全操作牙言,SecurityManager 則管理所有用戶的安全操作酸钦。
- SecurityManager:安全管理器,管理著所有的Subject咱枉,是Shiro的核心卑硫,與其他組件交互,例如會話管理蚕断,緩存管理
- Ream:意思為領域或者國度欢伏。起到一個橋梁的作用,主要通過realm來獲取用戶相關的安全數據亿乳,例如獲取用戶在數據庫中的密碼信息硝拧,角色信息,操作權限信息等葛假。Shiro內置了2個Realm障陶,分別是IniRealm和JdbcRealm,但是不常用聊训,一般情況下都需要我們自己來自定義實現抱究。
一般我們需要繼承 org.apache.shiro.realm.AuthorizingRealm,然后實現其中父類的2個抽象方法。
// 自定義Realm
public class CustomRealm extends AuthorizingRealm {
// 授權魔眨,驗證用戶的角色和操作權限
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
//....
}
// 認證媳维,驗證登錄的用戶名和密碼是否正確
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
//....
}
}
整體流程
用戶通過Subject來進行認證和授權,而Subject又委托給SecurityManager遏暴,而SecurityManager又需要通過我們自定義的Realm來獲取密碼侄刽,權限等數據來進行校驗和比對
image.png
過濾器
Shiro還提供了過濾器,可以配置我們的過濾規(guī)則朋凉,過濾規(guī)則對順序是有要求的州丹,短路優(yōu)先原則,也就是前面的適配成功之后,就不會再適配后面的規(guī)則了墓毒。
/user/**=anon
/user/list=authc 永遠不會執(zhí)行
過濾規(guī)則說明:
其中anon
吓揪、authc
等為Shiro為我們實現的過濾器,具體如下表所示:
Filter Name | Class | Description |
---|---|---|
anon | org.apache.shiro.web.filter.authc.AnonymousFilter | 匿名攔截器所计,即不需要登錄即可訪問柠辞;一般用于靜態(tài)資源過濾;示例/static/**=anon
|
authc | org.apache.shiro.web.filter.authc.FormAuthenticationFilter | 基于表單的攔截器主胧;如/**=authc 叭首,如果沒有登錄會跳到相應的登錄頁面登錄 |
authcBasic | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter | Basic HTTP身份驗證攔截器 |
logout | org.apache.shiro.web.filter.authc.LogoutFilter | 退出攔截器,主要屬性:redirectUrl:退出成功后重定向的地址(/)踪栋,示例/logout=logout
|
noSessionCreation | org.apache.shiro.web.filter.session.NoSessionCreationFilter | 不創(chuàng)建會話攔截器焙格,調用subject.getSession(false) 不會有什么問題,但是如果subject.getSession(true) 將拋出DisabledSessionException 異常 |
perms | org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter | 權限授權攔截器夷都,驗證用戶是否擁有所有權限眷唉;屬性和roles一樣;示例/user/**=perms["user:create"]
|
port | org.apache.shiro.web.filter.authz.PortFilter | 端口攔截器囤官,主要屬性port(80) :可以通過的端口冬阳;示例/test= port[80] ,如果用戶訪問該頁面是非80治拿,將自動將請求端口改為80并重定向到該80端口摩泪,其他路徑/參數等都一樣 |
rest | org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter | rest風格攔截器,自動根據請求方法構建權限字符串劫谅;示例/users=rest[user] ,會自動拼出user:read,user:create,user:update,user:delete權限字符串進行權限匹配(所有都得匹配嚷掠,isPermittedAll) |
roles | org.apache.shiro.web.filter.authz.RolesAuthorizationFilter | 角色授權攔截器捏检,驗證用戶是否擁有所有角色;示例/admin/**=roles[admin]
|
ssl | org.apache.shiro.web.filter.authz.SslFilter | SSL攔截器不皆,只有請求協(xié)議是https才能通過贯城;否則自動跳轉會https端口443;其他和port攔截器一樣霹娄; |
user | org.apache.shiro.web.filter.authc.UserFilter | 用戶攔截器能犯,用戶已經身份驗證/記住我登錄的都可;示例/**=user
|
我們也可以自定義實現過濾器犬耻,如果是授權相關踩晶,則繼承org.apache.shiro.web.filter.authz.AuthorizationFilter,如果是認證則繼承AuthenticatingFilter