Shiro內置了不少默認的攔截器,好比身份驗證、受權等相關的。默認攔截器能夠參考org.apache.shiro.web.filter.mgt.DefaultFilter中的枚舉攔截器: html
默認攔截器名web |
攔截器類 ajax |
說明(括號裏的表示默認值)spring |
身份驗證相關的apache |
|
|
authc安全 |
org.apache.shiro.web.filter.authcsession .FormAuthenticationFilterapp |
基於表單的攔截器;如「/**=authc」,若是沒有登陸會跳到相應的登陸頁面登陸;主要屬性:usernameParam:表單提交的用戶名參數名( username); passwordParam:表單提交的密碼參數名(password); rememberMeParam:表單提交的密碼參數名(rememberMe); loginUrl:登陸頁面地址(/login.jsp);successUrl:登陸成功後的默認重定向地址; failureKeyAttribute:登陸失敗後錯誤信息存儲key(shiroLoginFailure);jsp |
authcBasicide |
org.apache.shiro.web.filter.authc .BasicHttpAuthenticationFilter |
Basic HTTP身份驗證攔截器,主要屬性: applicationName:彈出登陸框顯示的信息(application); |
logout |
org.apache.shiro.web.filter.authc .LogoutFilter |
退出攔截器,主要屬性:redirectUrl:退出成功後重定向的地址(/);示例「/logout=logout」 |
user |
org.apache.shiro.web.filter.authc .UserFilter |
用戶攔截器,用戶已經身份驗證/記住我登陸的均可;示例「/**=user」 |
anon |
org.apache.shiro.web.filter.authc .AnonymousFilter |
匿名攔截器,即不須要登陸便可訪問;通常用於靜態資源過濾;示例「/static/**=anon」 |
受權相關的 |
|
|
roles |
org.apache.shiro.web.filter.authz .RolesAuthorizationFilter |
角色受權攔截器,驗證用戶是否擁有全部角色;主要屬性: loginUrl:登陸頁面地址(/login.jsp);unauthorizedUrl:未受權後重定向的地址;示例「/admin/**=roles[admin]」 |
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風格攔截器,自動根據請求方法構建權限字符串(GET=read, POST=create,PUT=update,DELETE=delete,HEAD=read,TRACE=read,OPTIONS=read, MKCOL=create)構建權限字符串;示例「/users=rest[user]」,會自動拼出「user:read,user:create,user:update,user:delete」權限字符串進行權限匹配(全部都得匹配,isPermittedAll); |
ssl |
org.apache.shiro.web.filter.authz .SslFilter |
SSL攔截器,只有請求協議是https才能經過;不然自動跳轉會https端口(443);其餘和port攔截器同樣; |
其餘 |
|
|
noSessionCreation |
org.apache.shiro.web.filter.session .NoSessionCreationFilter |
不建立會話攔截器,調用 subject.getSession(false)不會有什麼問題,可是若是 subject.getSession(true)將拋出 DisabledSessionException異常; |
另外還提供了一個org.apache.shiro.web.filter.authz.HostFilter,即主機攔截器,好比其提供了屬性:authorizedIps:已受權的ip地址,deniedIps:表示拒絕的ip地址;不過目前尚未徹底實現,不可用。
這些默認的攔截器會自動註冊,能夠直接在ini配置文件中經過「攔截器名.屬性」設置其屬性:
另外若是某個攔截器不想使用了能夠直接經過以下配置直接禁用:
xml 表中格過濾器的汗液
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <!-- Shiro的核心安全接口,這個屬性是必須的 --> <property name="securityManager" ref="securityManager"/> <!-- 要求登陸時的連接(可根據項目的URL進行替換),非必須的屬性,默認會自動尋找Web工程根目錄apos.htmlhtml"頁面 --> <property name="loginUrl" value="/sys/manager/login"/> <!-- 登陸成功後要跳轉的鏈接 --> <property name="successUrl" value="/sys/manager/index"/> <!-- 用戶訪問未對其受權的資源時,所顯示的鏈接 --> <!-- 若想更明顯的測試此屬性能夠修改它的值,如unauthor.jsp--> <property name="unauthorizedUrl" value="/sys/manager/login"/> <property name="filters"> <map> <entry key="authc"> <bean class="com.xx.web.shiro.UserFormAuthenticationFilter" /> </entry> </map> </property> <!-- Shiro鏈接約束配置,即過濾鏈的定義 --> <!-- 下面value值的第一個'/'表明的路徑是相對於HttpServletRequest.getContextPath()的值來的 --> <!-- anon:它對應的過濾器裏面是空的,什麼都沒作,這裏.do和.jsp後面的*表示參數,比方說login.jsp?main這種 --> <!-- authc:該過濾器下的頁面必須驗證後才能訪問,它是Shiro內置的一個攔截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter --> <property name="filterChainDefinitions"> <value> /statics/**=anon /js/**=anon /page/**=anon /sys/manager/login=anon /favicon.ico=anon /**=authc </value> </property> </bean>
1.登陸session失效
自定義一個過濾器
public class LoginAuthenticationFilter extends FormAuthenticationFilter { @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { if(this.isLoginRequest(request, response)) { if(this.isLoginSubmission(request, response)) { return this.executeLogin(request, response); } else { return true; } } else { if(isAjax(request)){ Result result = Result.notLogin(); response.getWriter().print(JSONObject.toJSON(result)); }else{ this.saveRequestAndRedirectToLogin(request, response); } return false; } } public static boolean isAjax(ServletRequest request){ String header = ((HttpServletRequest) request).getHeader("X-Requested-With"); if("XMLHttpRequest".equalsIgnoreCase(header)){ //System.out.println( "當前請求爲Ajax請求"); return Boolean.TRUE; } //System.out.println( "當前請求非Ajax請求"); return Boolean.FALSE; } }
2.過濾器的信息注入到shiro的filter bean中
@Bean public ShiroFilterFactoryBean shiroFilter(ShiroProperties shiroProperties) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager(shiroProperties)); //註冊過濾器 Map<String, Filter> filters = new LinkedHashMap<String, Filter>(); //退出登陸跳轉 LogoutFilter logoutFilter = new LogoutFilter(); logoutFilter.setRedirectUrl(shiroProperties.getLogoutUrl()); filters.put("logout", logoutFilter); //登陸超時過濾 LoginAuthenticationFilter loginAuthenticationFilter = new LoginAuthenticationFilter(); filters.put("authc", loginAuthenticationFilter); shiroFilterFactoryBean.setFilters(filters); Map<String, String> filterChainDefinitionManager = shiroProperties.getFilterChainDefinitions(); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionManager); shiroFilterFactoryBean.setLoginUrl(shiroProperties.getLoginUrl()); shiroFilterFactoryBean.setSuccessUrl(shiroProperties.getSuccessUrl()); shiroFilterFactoryBean.setUnauthorizedUrl(shiroProperties.getUnauthorizedUrl()); return shiroFilterFactoryBean; }
重寫js的ajax方法,自動讓全部的ajax提交都能綁定上跳轉