JAVA—咖啡館

          ——?dú)g迎訪問(wèn)rogerfan的博客,常來(lái)《JAVA——咖啡館》坐坐,喝杯濃香的咖啡,彼此探討一下JAVA技術(shù),交流工作經(jīng)驗(yàn),分享JAVA帶來(lái)的快樂(lè)!本網(wǎng)站部分轉(zhuǎn)載文章,如果有版權(quán)問(wèn)題請(qǐng)與我聯(lián)系。

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            447 Posts :: 145 Stories :: 368 Comments :: 0 Trackbacks

          1.HttpSessionContextIntegrationFilter

           

          位于過(guò)濾器頂端,第一個(gè)起作用的過(guò)濾器。

           

          用途一,在執(zhí)行其他過(guò)濾器之前,率先判斷用戶(hù)的session中是否已經(jīng)存在一個(gè)SecurityContext了。如果存在,就把SecurityContext拿出來(lái),放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就創(chuàng)建一個(gè)SecurityContext出來(lái),還是放到SecurityContextHolder中,供Spring Security的其他部分使用。

           

          用途二,在所有過(guò)濾器執(zhí)行完畢后,清空SecurityContextHolder,因?yàn)镾ecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,會(huì)受到服務(wù)器的線程池機(jī)制的影響。

          -------------------------------------------------------------------------------------------- 

          2.LogoutFilter

           

          只處理注銷(xiāo)請(qǐng)求,默認(rèn)為/j_spring_security_logout。

           

          用途是在用戶(hù)發(fā)送注銷(xiāo)請(qǐng)求時(shí),銷(xiāo)毀用戶(hù)session,清空SecurityContextHolder,然后重定向到注銷(xiāo)成功頁(yè)面。可以與rememberMe之類(lèi)的機(jī)制結(jié)合,在注銷(xiāo)的同時(shí)清空用戶(hù)cookie。

          --------------------------------------------------------------------------------------------

          3.AuthenticationProcessingFilter

           

          處理form登陸的過(guò)濾器,與form登陸有關(guān)的所有操作都是在此進(jìn)行的。

          默認(rèn)情況下只處理/j_spring_security_check請(qǐng)求,這個(gè)請(qǐng)求應(yīng)該是用戶(hù)使用form登陸后的提交地址,form所需的其他參數(shù)可以參考:

           

           

          此過(guò)濾器執(zhí)行的基本操作時(shí),通過(guò)用戶(hù)名和密碼判斷用戶(hù)是否有效,如果登錄成功就跳轉(zhuǎn)到成功頁(yè)面(可能是登陸之前訪問(wèn)的受保護(hù)頁(yè)面,也可能是默認(rèn)的成功頁(yè)面),如果登錄失敗,就跳轉(zhuǎn)到失敗頁(yè)面。

           

          <form action="${pageContext.request.contextPath}/j_spring_security_check" style="width:260px;text-align:center;">
            <fieldset>
              <legend>登陸</legend>
              用戶(hù): <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
              密碼: <input type="password" name="j_password" style="width:150px;" /><br />
              <input type="checkbox" name="_spring_security_remember_me" />兩周之內(nèi)不必登陸<br />
              <input type="submit" value="登陸"/>
              <input type="reset" value="重置"/>
            </fieldset>
          </form>

           

           

           

           

           

          /j_spring_security_check,提交登陸信息的URL地址。

          自定義form時(shí),要把form的action設(shè)置為/j_spring_security_check。注意這里要使用絕對(duì)路徑,避免登陸頁(yè)面存放的頁(yè)面可能帶來(lái)的問(wèn)題。

           

          j_username,輸入登陸名的參數(shù)名稱(chēng)。

           

          j_password,輸入密碼的參數(shù)名稱(chēng)

           

          _spring_security_remember_me,選擇是否允許自動(dòng)登錄的參數(shù)名稱(chēng)。

          可以直接把這個(gè)參數(shù)設(shè)置為一個(gè)checkbox,無(wú)需設(shè)置value,Spring Security會(huì)自行判斷它是否被選中。

          --------------------------------------------------------------------------------------------

          4.DefaultLoginPageGeneratingFilter

           

          此過(guò)濾器用來(lái)生成一個(gè)默認(rèn)的登錄頁(yè)面,默認(rèn)的訪問(wèn)地址為/spring_security_login,這個(gè)默認(rèn)的登錄頁(yè)面雖然支持用戶(hù)輸入用戶(hù)名,密碼,也支持rememberMe功能,但是因?yàn)樘y看了,只能是在演示時(shí)做個(gè)樣子,不可能直接用在實(shí)際項(xiàng)目中。

           

          自定義登陸頁(yè)面

          <http auto-config='true'>
              <intercept-url pattern="/login.jsp" access="IS_AUTHENTICATED_ANONYMOUSLY" />

              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
              <intercept-url pattern="/**" access="ROLE_USER" />
              <form-login login-page="/login.jsp"

                          authentication-failure-url="/login.jsp?error=true"
                          default-target-url="/" />
          </http>

          --------------------------------------------------------------------------------------------

          5.BasicProcessingFilter

           

          此過(guò)濾器用于進(jìn)行basic驗(yàn)證,功能與AuthenticationProcessingFilter類(lèi)似,只是驗(yàn)證的方式不同。

          添加basic認(rèn)證,去掉auto-config="true",并加上<http-basic />

          <http auto-config="true">
              <http-basic />
              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
              <intercept-url pattern="/" access="ROLE_USER" />
          </http>
          ---------------------------------------------------------------------------------------------

          6.SecurityContextHolderAwareRequestFilter

           

          此過(guò)濾器用來(lái)包裝客戶(hù)的請(qǐng)求。目的是在原始請(qǐng)求的基礎(chǔ)上,為后續(xù)程序提供一些額外的數(shù)據(jù)。比如getRemoteUser()時(shí)直接返回當(dāng)前登陸的用戶(hù)名之類(lèi)的。

          ---------------------------------------------------------------------------------------------

          7.RememberMeProcessingFilter

           

          此過(guò)濾器實(shí)現(xiàn)RememberMe功能,當(dāng)用戶(hù)cookie中存在rememberMe的標(biāo)記,此過(guò)濾器會(huì)根據(jù)標(biāo)記自動(dòng)實(shí)現(xiàn)用戶(hù)登陸,并創(chuàng)建SecurityContext,授予對(duì)應(yīng)的權(quán)限。

          在配置文件中使用auto-config="true"就會(huì)自動(dòng)啟用rememberMe

          實(shí)際上,Spring Security中的rememberMe是依賴(lài)cookie實(shí)現(xiàn)的,當(dāng)用戶(hù)在登錄時(shí)選擇使用rememberMe,系統(tǒng)就會(huì)在登錄成功后將為用戶(hù)生成一個(gè)唯一標(biāo)識(shí),并將這個(gè)標(biāo)識(shí)保存進(jìn)cookie中,我們可以通過(guò)瀏覽器查看用戶(hù)電腦中的cookie。

          ---------------------------------------------------------------------------------------------

          8.AnonymousProcessingFilter

          為了保證操作統(tǒng)一性,當(dāng)用戶(hù)沒(méi)有登陸時(shí),默認(rèn)為用戶(hù)分配匿名用戶(hù)的權(quán)限。

          在配置文件中使用auto-config="true"就會(huì)啟用匿名登錄功能。在啟用匿名登錄之后,如果我們希望允許未登錄就可以訪問(wèn)一些資源,可以在進(jìn)行如下配置。

          <http auto-config='true'>
              <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
              <intercept-url pattern="/**" access="ROLE_USER" />
          </http>

          設(shè)置成 ROLE_ANONYMOUS 也可以。

           

          <http auto-config='true'>
              <intercept-url pattern="/" filters="none" />
              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
              <intercept-url pattern="/**" access="ROLE_USER" />
          </http>

          filters="none"表示當(dāng)我們?cè)L問(wèn)“/”時(shí),是不會(huì)使用任何一個(gè)過(guò)濾器去處理這個(gè)請(qǐng)求的,它可以實(shí)現(xiàn)無(wú)需登錄即可訪問(wèn)資源的效果,但是因?yàn)闆](méi)有使用過(guò)濾器對(duì)請(qǐng)求進(jìn)行處理,所以也無(wú)法利用安全過(guò)濾器為我們帶來(lái)的好處,最簡(jiǎn)單的,這時(shí)SecurityContext內(nèi)再?zèng)]有保存任何一個(gè)權(quán)限主體了,我們也無(wú)法從中取得主體名稱(chēng)以及對(duì)應(yīng)的權(quán)限信息。

          ---------------------------------------------------------------------------------------------

          9.ExceptionTranslationFilter

           

          此過(guò)濾器的作用是處理中FilterSecurityInterceptor拋出的異常,然后將請(qǐng)求重定向到對(duì)應(yīng)頁(yè)面,或返回對(duì)應(yīng)的響應(yīng)錯(cuò)誤代碼。

          ---------------------------------------------------------------------------------------------

          10.SessionFixationProtectionFilter

           

          防御會(huì)話偽造攻擊。

          解決session fix的問(wèn)題其實(shí)很簡(jiǎn)單,只要在用戶(hù)登錄成功之后,銷(xiāo)毀用戶(hù)的當(dāng)前session,并重新生成一個(gè)session就可以了。

          <http auto-config='true' session-fixation-protection="none">
              <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
              <intercept-url pattern="/**" access="ROLE_USER" />
          </http>

           

          session-fixation-protection的值共有三個(gè)可供選擇,none,migrateSession和newSession。默認(rèn)使用的是migrationSession
          ---------------------------------------------------------------------------------------------

          11.FilterSecurityInterceptor

           

          用戶(hù)的權(quán)限控制都包含在這個(gè)過(guò)濾器中。

          功能一:如果用戶(hù)尚未登陸,則拋出AuthenticationCredentialsNotFoundException“尚未認(rèn)證異常”。

          功能二:如果用戶(hù)已登錄,但是沒(méi)有訪問(wèn)當(dāng)前資源的權(quán)限,則拋出AccessDeniedException“拒絕訪問(wèn)異常”。

          功能三:如果用戶(hù)已登錄,也具有訪問(wèn)當(dāng)前資源的權(quán)限,則放行。

          posted on 2010-07-23 16:36 rogerfan 閱讀(702) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 【開(kāi)源技術(shù)】
          主站蜘蛛池模板: 上高县| 比如县| 高尔夫| 钟山县| 敖汉旗| 哈密市| 泰和县| 融水| 汝城县| 高台县| 庆云县| 永城市| 沾益县| 阜城县| 莱州市| 临颍县| 长汀县| 闽清县| 元氏县| 鲁甸县| 鹿邑县| 博兴县| 昌江| 栾川县| 潞城市| 自治县| 廉江市| 红桥区| 清远市| 玉门市| 宝山区| 苗栗市| 凭祥市| 高雄市| 双辽市| 金寨县| 长兴县| 西峡县| 高唐县| 平和县| 海伦市|