shiro-過濾器

http://shiro.apache.org/authorization.html#Authorization-PermissionGranularity

 

shiro默認的過濾器

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配置文件中經過「攔截器名.屬性」設置其屬性:

Java代碼  
  1. perms.unauthorizedUrl=/unauthorized  

另外若是某個攔截器不想使用了能夠直接經過以下配置直接禁用:

Java代碼  
  1. perms.enabled=false  


 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提交都能綁定上跳轉

http://www.cnblogs.com/hwaggLee/p/8244631.html

相關文章
相關標籤/搜索