亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

spring secrity 登出做一些操作

2019-11-11 05:10:53
字體:
來源:轉載
供稿:網友

今天 項目需要用戶退出的時候記錄登出日志,修改用戶的登錄狀態

<?xml version="1.0" encoding="UTF-8"?><beans:beans xmlns="http://www.sPRingframework.org/schema/security"	xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                          http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd">	<global-method-security pre-post-annotations="enabled" />	<!-- HTTP安全配置 -->	<http auto-config="false" entry-point-ref="authenticationEntryPoint"  access-denied-page="/denied.html">		<intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY"/>		<intercept-url pattern="/index.html" access="IS_AUTHENTICATED_ANONYMOUSLY"/>		<intercept-url pattern="/m/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>		<intercept-url pattern="/commons/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>		<intercept-url pattern="/upload/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>        <intercept-url pattern="/cms/**" access="ROLE_USER"/>       <!--  <intercept-url pattern="/adminIndex.html" access="ROLE_USER"/> -->        <intercept-url pattern="/pages/*.html" access="ROLE_USER"/>       <!--  logout-success-url="/login.html" -->        <logout logout-url="/j_spring_security_logout" invalidate-session="true"             delete-cookies="JSESSIONID" success-handler-ref="myLogoutSuccessHandler"/>                <custom-filter ref="corsFilter" after="PRE_AUTH_FILTER"/>		<custom-filter ref="myLoginFilter" position="FORM_LOGIN_FILTER" />		<custom-filter ref="mySecurityFilter" before="FILTER_SECURITY_INTERCEPTOR" />	</http>		<beans:bean id="corsFilter" class="com.threeti.danfoss.base.filter.SecurityCorsFilter" />		<beans:bean id="sas"		class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">		<beans:property name="maximumSessions" value="1"></beans:property>		<beans:property name="exceptionIfMaximumExceeded"			value="true"></beans:property>		<beans:constructor-arg name="sessionRegistry"			ref="sessionRegistry"></beans:constructor-arg>	</beans:bean>		<beans:bean id="sessionRegistry"		class="org.springframework.security.core.session.SessionRegistryImpl"></beans:bean>	<beans:bean id="myLoginFilter"		class="com.threeti.danfoss.base.filter.MyUsernamePassWordAuthenticationFilter">		<beans:property name="authenticationManager" ref="myAuthenticationManager"/>          <beans:property name="authenticationFailureHandler" ref="failureHandler"/>          <beans:property name="authenticationSuccessHandler" ref="successHandler"/>  		<beans:property name="sessionAuthenticationStrategy"			ref="sas"></beans:property>	</beans:bean>		      <beans:bean id="successHandler" class="com.threeti.danfoss.base.handler.MyAuthenticationSuccessHandler">          <beans:property name="defaultTargetUrl" value="/pages/menu.html#current/wind/surface/level/anim=off/overlay=misery_index/orthographic=39.08,42.42,294/loc=96.475,39.357" />      </beans:bean>         <beans:bean id="failureHandler" class="com.threeti.danfoss.base.handler.MySimpleUrlAuthenticationFailureHandler">          <beans:property name="defaultFailureUrl" value="/index.html"/>      </beans:bean>         <beans:bean id="myLogoutSuccessHandler" class="com.threeti.danfoss.base.handler.MyLogoutSuccessHandler">       	<beans:property name="defaultTargetUrl" value="/login.html"/>       	<!-- 下面的 是通過在url參數進行跳轉 -->       	<!-- <property name="targetUrlParameter" value="target-url"/>      	<property name="redirectStrategy" ref="safeRedirectStrategy"/> -->    </beans:bean>     <!-- 安全的RedirectStrategy,主要是判斷跳轉地址是否在白名單中    public class SafeRedirectStrategy implements RedirectStrategy -->    <!-- <beans:bean id="safeRedirectStrategy" class="com.snsxiu.job.web.security.SafeRedirectStrategy"/> -->    	<!-- 1.URL過濾器或方法攔截器:用來攔截URL或者方法資源對其進行驗證,其抽象基類為AbstractSecurityInterceptor 		2.資源權限獲取器:用來取得訪問某個URL或者方法所需要的權限,接口為SecurityMetadataSource 3.訪問決策器:用來決定用戶是否擁有訪問權限的關鍵類,其接口為AccessDecisionManager 		調用順序為:AbstractSecurityInterceptor調用SecurityMetadataSource取得資源的所有可訪問權限, 然后再調用AccessDecisionManager來實現決策,確定用戶是否有權限訪問該資源。 -->	<!-- 自定義的filter, 必須包含authenticationManager, accessDecisionManager, securityMetadataSource三個屬性 -->	<beans:bean id="mySecurityFilter" class="com.threeti.danfoss.base.security.XaFilterSecurityInterceptor">		<beans:property name="authenticationManager" ref="myAuthenticationManager" />		<beans:property name="accessDecisionManager" ref="myAccessDecisionManager" />		<beans:property name="securityMetadataSource" ref="mySecurityMetadataSource" />	</beans:bean>	<!-- 取HTTP配置中的authenticationManager 設置alias別名 -->	<authentication-manager alias="myAuthenticationManager">		<authentication-provider user-service-ref="userDetailsManager">            <password-encoder hash="md5"/>		</authentication-provider>	</authentication-manager>		<!-- 用戶詳細信息管理:數據源、用戶緩存(通過數據庫管理用戶、角色、權限、資源) -->	<beans:bean id="userDetailsManager" class="com.threeti.danfoss.base.security.XaUserDetailsService">	</beans:bean>	<!-- 訪問決策器,決定某個用戶具有的角色,是否有足夠的權限去訪問某個資源。 -->	<beans:bean id="myAccessDecisionManager"		class="com.threeti.danfoss.base.security.XaAccessDecisionManagerService" />	<!-- 資源源數據定義,將所有的資源和權限對應關系建立起來,即定義某一資源可以被哪些角色去訪問。 -->	<beans:bean id="mySecurityMetadataSource" init-method="loadResourceDefine"		class="com.threeti.danfoss.base.security.XaSecurityMetadataSourceService">	</beans:bean>			<beans:bean id="authenticationEntryPoint"		class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">		<beans:property name="loginFormUrl" value="/login.html" />	</beans:bean></beans:beans>java 代碼

package com.threeti.danfoss.base.handler;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.security.core.Authentication;import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;import com.threeti.danfoss.base.constant.XaConstant;import com.threeti.danfoss.base.entity.XaCmsUser;import com.threeti.danfoss.base.repository.XaCmsUserRepository;import com.threeti.danfoss.base.security.XaUserDetails;public class MyLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler   implements LogoutSuccessHandler{@Autowiredprivate XaCmsUserRepository xaCmsUserRepository;@Overridepublic void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)throws IOException, ServletException {XaUserDetails user = (XaUserDetails) authentication.getPrincipal();XaCmsUser u = xaCmsUserRepository.findByUserName(user.getUsername(),XaConstant.Status.valid);u.setOnline(0);xaCmsUserRepository.save(u);super.onLogoutSuccess(request, response, authentication);}}

還有另外一種方式:下面的就是復制前面的東西。沒有進行測試,先記錄下來,有空進行測試:

這里是前輩的文章地址:http://www.111cn.net/jsp/J2ME/60099.htm

spring security的form-login提供了default-target-url作為登錄成功后的跳轉地址,唯獨沒有允許傳遞一個redirectUrl參數來作為成功后的跳轉地址。同樣的logout標簽提供了logout-success-url作為退出成功后的跳轉地址,也沒有提供允許傳遞redirectUrl參數來進行跳轉。本來打算自己實現和AdminAuthSuccessHandler和LogoutSuccessHandler來接收redirectUrl參數進行跳轉的,結果查看spring security的代碼無意間發現spring security居然提供了targetUrlParameter作為跳轉地址的參數,只是Security Namespace沒有相關的標簽或屬性。于是在讀完跳轉相關的代碼之后自己寫了以下配置。注:如果直接允許傳遞redirectUrl作為跳轉地址,會有一定的安全風險。在使用之前,確保redirectUrl可信。下面的這段配置有一定安全隱患。

 代碼如下復制代碼
<sec:http auto-config="true">    <sec:intercept-url pattern="/admin/login" access="IS_AUTHENTICATED_ANONYMOUSLY"/>    <sec:form-login login-page="/admin/login" authentication-failure-handler-ref="adminAuthFailureHandler" authentication-success-handler-ref="adminAuthSuccessHandler"/>    <sec:logout success-handler-ref="adminLogoutSuccessHandler"/>    <sec:remember-me data-source-ref="jobDataSource"/>    <sec:session-management>        <sec:concurrency-control error-if-maximum-exceeded="true" max-sessions="1"/>    </sec:session-management></sec:http> <bean id="adminAuthFailureHandler" class="com.snsxiu.job.handler.AdminAuthFailureHandler">      <property name="authenticationFailureUrl" value="/admin/login?error=true"/></bean>   <bean id="adminAuthSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">    <property name="targetUrlParameter" value="target-url"/>    <property name="defaultTargetUrl" value="/admin/index"/></bean>   <bean id="adminLogoutSuccessHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler">    <property name="targetUrlParameter" value="target-url"/>    <property name="defaultTargetUrl" value="/admin/login"/></bean>

通過查看源碼我們發現,SimpleUrlLogoutSuccessHandler繼續了AbstractAuthenticationTargetUrlRequestHandler,同樣的SavedRequestAwareAuthenticationSuccessHandler也是繼承了AbstractAuthenticationTargetUrlRequestHandler,而在AbstractAuthenticationTargetUrlRequestHandler的handle方法里,我們發現它是通過determineTargetUrl()方法來決定Redirect地址的。

 代碼如下復制代碼
public class SimpleUrlLogoutSuccessHandler extends AbstractAuthenticationTargetUrlRequestHandler        implements LogoutSuccessHandler {     public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)            throws IOException, ServletException {        super.handle(request, response, authentication);    } }

通過分析determineTargetUrl我們得出以下結論:①如果alwaysUseDefaultTargetUrl為true,則跳轉地址始終為defaultTargetUrl②如果targetUrlParameter不為null,則從request中targetUrlParameter指定的參數名獲取跳轉地址③如果useReferer為true,并且前兩步沒有獲取到跳轉地址,則從請求頭中的Referer獲取跳轉地址④如果以上幾步都為空,則使用設置的defaultTargetUrl作為跳轉地址⑤defaultTargetUrl的默認值是"/" 在最終跳轉時,spring security使用一個RedirectStrategy策略來進行跳轉,一般都是使用DefaultRedirectStrategy來進行跳轉,你也可以實現自己的RedirectStrategy并配置在adminAuthSuccessHandler的bean定義中。 在剛開始的時候我們說過“如果直接允許傳遞redirectUrl作為跳轉地址,會有一定的安全風險”。如果別人通過你的login或logout傳遞redirectUrl參數誤導用戶跳到了病毒木馬網站,那這肯定是你的安全做的不夠,為了安全我們,我們需要實現自己的SafeRedirectStrategy,如下所示,在跳轉之前對URL進行了白名單校驗。

 代碼如下復制代碼
/** * 安全的RedirectStrategy,主要是判斷跳轉地址是否在白名單中 * @author guoweiwei gww0426@163.com * */public class SafeRedirectStrategy implements RedirectStrategy {     protected final Log logger = LogFactory.getLog(getClass());     private boolean contextRelative;     /**     * Redirects the response to the supplied URL.     * <p>     * If <tt>contextRelative</tt> is set, the redirect value will be the value after the request context path. Note     * that this will result in the loss of protocol information (HTTP or HTTPS), so will cause problems if a     * redirect is being performed to change to HTTPS, for example.     */    public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {        String redirectUrl = calculateRedirectUrl(request.getContextPath(), url);                  try {            if(UrlUtils.isAbsoluteUrl(redirectUrl)){                        redirectUrl = UrlUtil.buildRedirectLink(redirectUrl, false);                    }        } catch (Exception e) {            throw new IOException("error redirect url", e);        }                  redirectUrl = response.encodeRedirectURL(redirectUrl);         if (logger.isDebugEnabled()) {            logger.debug("Redirecting to '" + redirectUrl + "'");        }         response.sendRedirect(redirectUrl);    }     private String calculateRedirectUrl(String contextPath, String url) {        if (!UrlUtils.isAbsoluteUrl(url)) {            if (contextRelative) {                return url;            } else {                return contextPath + url;            }        }         // Full URL, including http(s)://         if (!contextRelative) {            return url;        }         // Calculate the relative URL from the fully qualified URL, minus the scheme and base context.        url = url.substring(url.indexOf("://") + 3); // strip off scheme        url = url.substring(url.indexOf(contextPath) + contextPath.length());         if (url.length() > 1 && url.charAt(0) == '/') {            url = url.substring(1);        }         return url;    }     /**     * If <tt>true</tt>, causes any redirection URLs to be calculated minus the protocol     * and context path (defaults to <tt>false</tt>).     */    public void setContextRelative(boolean useRelativeContext) {        this.contextRelative = useRelativeContext;    } }

上面代碼中UrlUtil為自己實現的一個Url處理工具,buildRedirectLink會對url做白名單校驗。完了別忘了在servlet.xml的bean配置中加入safeRedirectStrategy。如下所示:

 代碼如下復制代碼
<bean id="adminAuthSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">    <property name="targetUrlParameter" value="target-url"/>    <property name="defaultTargetUrl" value="/admin/index"/>    <property name="redirectStrategy" ref="safeRedirectStrategy"/>  </bean>     <bean id="adminLogoutSuccessHandler" class="org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler">      <property name="targetUrlParameter" value="target-url"/>      <property name="defaultTargetUrl" value="/admin/login"/>      <property name="redirectStrategy" ref="safeRedirectStrategy"/>  </bean>     <bean id="safeRedirectStrategy" class="com.snsxiu.job.web.security.SafeRedirectStrategy"/>


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品稀缺呦系列在线| 黄色成人在线播放| 国内外成人免费激情在线视频网站| 成人精品在线观看| 米奇精品一区二区三区在线观看| 激情成人中文字幕| 日韩av在线免费观看| 欧美日在线观看| 日韩综合视频在线观看| 国产亚洲欧美日韩精品| 亚洲成年人在线| 中文字幕亚洲欧美日韩在线不卡| 欧美性猛交xxxxx水多| 91精品久久久久久久久久久久久| 久久最新资源网| 国产精品热视频| 欧美日韩美女视频| 亚洲国产古装精品网站| 国产精品国产三级国产aⅴ浪潮| 国产精品久久97| 中文欧美日本在线资源| 日韩女优人人人人射在线视频| 亚洲精品天天看| 亚洲天堂网站在线观看视频| 国产精品亚洲片夜色在线| 在线激情影院一区| 亚洲欧美日韩中文视频| 久久视频在线免费观看| 久久久久久噜噜噜久久久精品| 亚洲福利在线视频| 亚洲综合大片69999| 亚洲热线99精品视频| 国产一区二区三区日韩欧美| 欧美性受xxxx白人性爽| 亚洲一品av免费观看| 久久精品视频在线| 亚洲精品在线不卡| 97色在线观看免费视频| 国产综合久久久久久| 国产精品美女久久久久久免费| 亚洲精品久久久久中文字幕欢迎你| 亚洲网站视频福利| 91久久国产婷婷一区二区| 亚洲r级在线观看| 久久久久中文字幕2018| 亚洲精品美女久久| 亚洲a∨日韩av高清在线观看| 久久国产精品久久久久久久久久| 欧美性猛交xxxxx水多| 热久久这里只有精品| 97免费中文视频在线观看| 亚洲精品中文字幕av| 欧美一级电影免费在线观看| www.久久色.com| 国产一级揄自揄精品视频| 九九视频这里只有精品| 亚洲大胆人体av| 亚洲国产精品久久久| 在线免费观看羞羞视频一区二区| 久久中文字幕在线视频| 国产成人鲁鲁免费视频a| 色综合亚洲精品激情狠狠| 91精品一区二区| 欧美激情在线有限公司| 欧美性生活大片免费观看网址| 欧美日韩亚洲高清| 国产一区二区在线播放| 欧美激情视频网站| 在线视频欧美性高潮| 欧美第一黄色网| 亚洲一区二区三区在线免费观看| 91精品视频网站| 美女少妇精品视频| 欧美日韩亚洲精品一区二区三区| 国产精品丝袜久久久久久高清| 91av福利视频| 亚洲区免费影片| 日韩av观看网址| 欧洲日韩成人av| 最近更新的2019中文字幕| 92福利视频午夜1000合集在线观看| 97在线观看免费| 91久久久久久国产精品| 亚洲欧美日韩天堂| 国产欧美日韩视频| 亚洲一区二区三区视频播放| 久久精品色欧美aⅴ一区二区| 日韩av电影中文字幕| 亚洲人成亚洲人成在线观看| 久久久久久免费精品| 深夜精品寂寞黄网站在线观看| 成人444kkkk在线观看| 欧美精品免费播放| 不卡在线观看电视剧完整版| 美日韩在线视频| 国产人妖伪娘一区91| 亚洲综合在线做性| 国产一区二区三区中文| 欧美激情精品久久久久久免费印度| 亚洲欧美日韩在线高清直播| 久久久亚洲精选| 欧美成人激情图片网| 91国内产香蕉| 国产精品无码专区在线观看| 欧美黑人又粗大| 久久久久久久91| 欧美日韩一区免费| 国产成人一区二区| 亚洲国产婷婷香蕉久久久久久| 91免费版网站入口| 亚洲性日韩精品一区二区| 国产97色在线|日韩| 精品国产一区二区三区久久狼5月| 久久综合久中文字幕青草| 亚洲剧情一区二区| 91精品国产高清久久久久久| 久久精品久久久久久国产 免费| 亚洲欧洲在线免费| 91九色国产社区在线观看| 久久久久久久久久久人体| 午夜精品久久久久久久久久久久久| 国产日本欧美在线观看| 青青草原一区二区| 国产精品久久久久久av福利软件| 欧美一级大片在线观看| 欧美丝袜一区二区三区| 亚洲国产精品小视频| 中日韩美女免费视频网站在线观看| 国产精品69av| 91精品久久久久久久久青青| 国产精品一区二区在线| 亚洲a在线播放| 久久影院资源网| 萌白酱国产一区二区| 亚洲美女福利视频网站| 亚洲香蕉成视频在线观看| 成人久久一区二区| 欧美另类极品videosbestfree| 亚洲大胆人体av| 国产精品自产拍在线观| 国产丝袜一区二区三区| 亚洲最新av在线| 欧美激情一区二区三区久久久| 欧美精品免费播放| 久久精品久久久久久国产 免费| 精品国偷自产在线| 热re99久久精品国产66热| 久久久久久久色| 日韩毛片在线看| 九九热精品视频国产| 亚洲午夜国产成人av电影男同| 亚洲成av人影院在线观看| 久99九色视频在线观看| 欧美中文字幕精品| 日韩在线观看电影| 久久久久国色av免费观看性色| 欧美高清在线视频观看不卡| 按摩亚洲人久久| 夜夜狂射影院欧美极品| 38少妇精品导航| 亚洲人精选亚洲人成在线| 国产精品日韩精品| 久久精品国产一区二区三区| 在线播放精品一区二区三区|