1. shiro的核心過濾器定義在枚舉類DefaultFilter 中,一共有11個 ,配置哪個路徑對應哪個攔截器進行處理
// // Source code recreated from a .class file by IntelliJ IDEA // (powered by Fernflower decompiler) // package org.apache.shiro.web.filter.mgt; import java.util.LinkedHashMap; import java.util.Map; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import org.apache.shiro.util.ClassUtils; import org.apache.shiro.web.filter.authc.AnonymousFilter; import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.apache.shiro.web.filter.authc.LogoutFilter; import org.apache.shiro.web.filter.authc.UserFilter; import org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter; import org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter; import org.apache.shiro.web.filter.authz.PortFilter; import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; import org.apache.shiro.web.filter.authz.SslFilter; import org.apache.shiro.web.filter.session.NoSessionCreationFilter; public enum DefaultFilter { anon(AnonymousFilter.class), authc(FormAuthenticationFilter.class), authcBasic(BasicHttpAuthenticationFilter.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); private final Class<? extends Filter> filterClass; private DefaultFilter(Class<? extends Filter> filterClass) { this.filterClass = filterClass; } public Filter newInstance() { return (Filter)ClassUtils.newInstance(this.filterClass); } public Class<? extends Filter> getFilterClass() { return this.filterClass; } public static Map<String, Filter> createInstanceMap(FilterConfig config) { Map<String, Filter> filters = new LinkedHashMap(values().length); DefaultFilter[] var2 = values(); int var3 = var2.length; for(int var4 = 0; var4 < var3; ++var4) { DefaultFilter defaultFilter = var2[var4]; Filter filter = defaultFilter.newInstance(); if (config != null) { try { filter.init(config); } catch (ServletException var9) { String msg = "Unable to correctly init default filter instance of type " + filter.getClass().getName(); throw new IllegalStateException(msg, var9); } } filters.put(defaultFilter.name(), filter); } return filters; } }
具體作用為:
- authc:org.apache.shiro.web.filter.authc.FormAuthenticationFilter
- 需要認證登錄才能訪問
- user:org.apache.shiro.web.filter.authc.UserFilter
- 用戶攔截器,表示必須存在用戶。
- anon:org.apache.shiro.web.filter.authc.AnonymousFilter
- 匿名攔截器,不需要登錄即可訪問的資源,匿名用戶或游客,一般用於過濾靜態資源。
- roles:org.apache.shiro.web.filter.authz.RolesAuthorizationFilter
- 角色授權攔截器,驗證用戶是或否擁有角色。
- 參數可寫多個,表示某些角色才能通過,多個參數時寫 roles["admin,user"],當有多個參數時,用戶必須同時具備參數中的每個角色才能通過
- perms:org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter
- 權限授權攔截器,驗證用戶是否擁有權限
- 參數可寫多個,表示需要某些權限才能通過,多個參數時寫 perms["user, admin"],當有多個參數時必須每個參數都通過才算可以
- authcBasic:org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter
- httpBasic 身份驗證攔截器。
- logout:org.apache.shiro.web.filter.authc.LogoutFilter
- 退出攔截器,執行后會直接跳轉到
shiroFilterFactoryBean.setLoginUrl()
設置的 url
- 退出攔截器,執行后會直接跳轉到
- port:org.apache.shiro.web.filter.authz.PortFilter
- 端口攔截器, 可通過的端口。
- ssl:org.apache.shiro.web.filter.authz.SslFilter
- ssl攔截器,只有請求協議是https才能通過。
2. Shiro的Filter配置路徑
- /admin/video /user /pub
- 路徑通配符支持 ?、、*,注意通配符匹配不 包括目錄分隔符“/”
- 心 可以匹配所有,不加*可以進行前綴匹配,但多個冒號就需要多個 * 來匹配
URL權限采取第一次匹配優先的方式 ? : 匹配一個字符,如 /user? , 匹配 /user3,但不匹配/user/; * : 匹配零個或多個字符串,如 /add* ,匹配 /addtest,但不匹配 /user/1 ** : 匹配路徑中的零個或多個路徑,如 /user/** 將匹 配 /user/xxx 或 /user/xxx/yyy 例子 /user/**=filter1 /user/add=filter2 請求 /user/add 命中的是filter1攔截器
- 性能問題:通配符比字符串匹配會復雜點,所以性能也會稍弱,推薦是使用字符串匹配方式
3. shiro數據加解密
shiro數據安全主要是由Shiro 里的 CredentialsMatcher來處理
- 什么是散列算法
- 一般叫hash,簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數,適合存儲密碼,比如MD5
- 什么是salt(鹽) 667788——》aabbcc
- 如果直接通過散列函數得到加密數據,容易被對應解密網站暴力破解,一般會在應用程序里面加特殊的自動進行處理,比如用戶id,例子:加密數據 = MD5(明文密碼+用戶id), 破解難度會更大,也可以使用多重散列,比如多次md5
- Shiro里面 CredentialsMatcher,用來驗證密碼是否正確,
-
源碼:AuthenticatingRealm -> assertCredentialsMatch()
一般會自定義驗證規則 @Bean public HashedCredentialsMatcher hashedCredentialsMatcher(){ HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); //散列算法,使用MD5算法; hashedCredentialsMatcher.setHashAlgorithmName("md5"); //散列的次數,比如散列兩次,相當於 md5(md5("xxx")); hashedCredentialsMatcher.setHashIterations(2); return hashedCredentialsMatcher; }
-