在shiro中配置攔截器可以攔截客戶端發送來的請求,並可以控制是對該請求進行認證還是放行。
二、shiro攔截器的特點
簡寫(加粗為常用) | 名稱 | 優先級(1為最高) | 說明 | 對應Java類 |
---|---|---|---|---|
anon | 匿名攔截器 | 1 | 不需要登錄就能訪問,一般用於靜態資源,或者移動端接口 | org.apache.shiro.web.filter.authc.AnonymousFilter |
authc | 登錄攔截器 | 2 | 需要登錄認證才能訪問的資源 | org.apache.shiro.web.filter.authc.FormAuthenticationFilter |
authcBasic | Http攔截器 | 3 | Http身份驗證攔截器,非常用類型,不太了解 | org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter |
logout | 登出攔截器 | 4 | 用戶登出攔截器,主要屬性:redirectURL退出登錄后重定向的地址 | org.apache.shiro.web.filter.authc.LogoutFilter |
noSessionCreation | 不創建會話攔截器 | 5 | 調用 subject.getSession(false) 不會有什么問題,但是如果 subject.getSession(true) 將拋出 DisabledSessionException 異常 | org.apache.shiro.web.filter.authc.NoSessionCreationFilter |
prems | 權限攔截器 | 6 | 驗證用戶是否擁有資源權限 | org.apache.shiro.web.filter.authc.PermissionsAuthorizationFilter |
port | 端口攔截器 | 7 | 其主要屬性: port(80) 如果用戶訪問該頁面是非 80,將自動將請求端口改為 80 並重定向到該 80 端口 | org.apache.shiro.web.filter.authc.PortFilter |
rest | rest風格攔截器 | 8 | rest 風格攔截器,自動根據請求方法構建權限字符串構建權限字符串;非常用類型攔截器 | org.apache.shiro.web.filter.authc.HttpMethodPermissionFilter |
roles | 角色攔截器 | 9 | 驗證用戶是否擁有資源角色 | org.apache.shiro.web.filter.authc.RolesAuthorizationFilter |
ssl | SSL攔截器 | 10 | 只有請求協議是https才能通過,否則你會自動跳轉到https端口(443) | org.apache.shiro.web.filter.authc.SslFilter |
user | 用戶攔截器 | 11 | 用戶攔截器,用戶已經身份驗證 / 記住我登錄的都可; | org.apache.shiro.web.filter.authc.UserFilter |
三、使用:
1、自定義攔截器
public class CustomAccessControlerFilter extends AccessControlFilter { @Override protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception { return false; } // 對需要被shiro攔截的請求進行攔截 @Override protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { /* 里面可以寫一些校驗token的邏輯,返回true表示認證通過,返回false表示認證失敗*/ return true; } }
2、將自定義攔截器設置到shiro中
/** * shiro過濾器,配置攔截哪些請求 */ @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); LinkedHashMap<String, Filter> filtersMap = new LinkedHashMap<>(); //用來校驗token filtersMap.put("token", new CustomAccessControlerFilter()); shiroFilterFactoryBean.setFilters(filtersMap); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); // 配置不會被攔截的鏈接 順序判斷 filterChainDefinitionMap.put("/api/user/login", "anon"); filterChainDefinitionMap.put("/upload/image/**","anon"); filterChainDefinitionMap.put("/index/**","anon"); filterChainDefinitionMap.put("/login","anon"); filterChainDefinitionMap.put("/register","anon"); filterChainDefinitionMap.put("/images/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/layui/**", "anon"); filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/treetable-lay/**", "anon"); filterChainDefinitionMap.put("/api/user/token", "anon"); //放開swagger-ui地址 filterChainDefinitionMap.put("/swagger/**", "anon"); filterChainDefinitionMap.put("/v2/api-docs", "anon"); filterChainDefinitionMap.put("/swagger-ui.html", "anon"); filterChainDefinitionMap.put("/swagger-resources/**", "anon"); filterChainDefinitionMap.put("/webjars/**", "anon"); filterChainDefinitionMap.put("/druid/**", "anon"); filterChainDefinitionMap.put("/favicon.ico", "anon"); filterChainDefinitionMap.put("/captcha.jpg", "anon"); filterChainDefinitionMap.put("/","anon"); filterChainDefinitionMap.put("/csrf","anon"); filterChainDefinitionMap.put("/**","token,authc"); shiroFilterFactoryBean.setLoginUrl("/api/user/login"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; }