日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

使用Spring Security3的四种方法概述

發布時間:2024/4/17 javascript 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Spring Security3的四种方法概述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用Spring Security3的四種方法概述

????那么在Spring Security3的使用中,有4種方法:

????一種是全部利用配置文件,將用戶、權限、資源(url)硬編碼在xml文件中,已經實現過,并經過驗證;

????二種是用戶和權限用數據庫存儲,而資源(url)和權限的對應采用硬編碼配置,目前這種方式已經實現,并經過驗證。

????三種是細分角色和權限,并將用戶、角色、權限和資源均采用數據庫存儲,并且自定義過濾器,代替原有的FilterSecurityInterceptor過濾器,
??? 并分別實現AccessDecisionManager、InvocationSecurityMetadataSourceService和UserDetailsService,并在配置文件中進行相應配置。
??? 目前這種方式已經實現,并經過驗證。

????四是修改spring security的源代碼,主要是修改InvocationSecurityMetadataSourceService和UserDetailsService兩個類。
??? 前者是將配置文件或數據庫中存儲的資源(url)提取出來加工成為url和權限列表的Map供Security使用,后者提取用戶名和權限組成一個完整的 (UserDetails)User對象,該對象可以提供用戶的詳細信息供AuthentationManager進行認證與授權使用。
??? 該方法理論上可行,但是比較暴力,也沒有時間實現,未驗證,以后再研究。

????說明一下,我目前調通的環境為: java1.6 + struts2.1.6 + spring3.0.1 + hibernate3.3.1 + spring security3.0.2 + oracle9i + weblogic10.3,
????順便提一下,目前(2011-4-2)serutity的最新版本為3.1,比較穩定的版本為3.0.5和2.0.6。

????當然在進行spring security3的下面4種方法介紹之前,先假定SSH2的環境已經配置完畢,進入正常開發的過程,并且已經導入
????spring security3.0.2的5個jar包,分別為:
????spring-security-acl-3.0.2.RELEASE.jar
????spring-security-config-3.0.2.RELEASE.jar
????spring-security-core-3.0.2.RELEASE.jar
????spring-security-taglibs-3.0.2.RELEASE.jar
????spring-security-web-3.0.2.RELEASE.jar
????當然還有其他相關的jar包,在此不再贅述。


第一種方法

????第一種方法比較簡單,可參考Spring Security自帶的例子spring-security-samples-tutorial-3.0.2.RELEASE。
這里給出下載網址:http://www.springsource.com/download/community?sid=1087087,不過在下載之前必須填寫相應的用戶信息,才允許下載。各種版本號的均可以下載。

????在spring-security-samples-tutorial-3.0.2.RELEASE的例子里,硬編碼的配置請參見applicationContext-security.xml文件中的內容。
????里面配置了用戶名、經過MD5加密后的密碼密文、相關的權限,以及與權相對應的訪問資源(URL)。還有對于Session超時時的處理。
????特別是因為版本號為3.0.2,因此還增加了對表達式的配置演示,具體內容請參見該例子。

????當然你最好運行起該例子來,感受一下,你可以直接將下載下來的解壓縮后的文件夾中找到spring-security-samples- tutorial-3.0.2.RELEASE.war文件,然后拷貝到Tomcat的安裝目錄下的\webapps文件夾下,然后運行Tomcat的服 務器,服務器在啟動過程中,會自動解開該war文件,在IE內輸入http://localhost:8080/webapps/spring-security-samples-tutorial-3.0.2.RELEASE 就可以運行該系統了。在此不再贅述。

第二種方法

????第二種方法的代碼如下:

????使用到的兩個表,用戶表和權限表的SQL語句。將用戶和權限以數據庫進行存儲。

[sql] view plaincopy
  • create?table?USERS(??
  • ??USERNAME???VARCHAR2(50)?not?null,??
  • ??PASSWORD???VARCHAR2(50)?not?null,??
  • ??ENABLED????NUMBER(1)?not?null,??
  • ??USERNAMECN?VARCHAR2(50),??
  • ??primary?key(?username?)??
  • )??
  • ??
  • create?table?AUTHORITIES(??
  • ??USERNAME??VARCHAR2(50)?not?null,??
  • ??AUTHORITY?VARCHAR2(50)?not?null??
  • )??

  • -- 外鍵使用戶和權限相聯。

    [sql] view plaincopy
  • Create/Recreate?primary,?unique?and?foreign?key?constraints???
  • alter?table?AUTHORITIES??
  • add?constraint?FK_AUTHORITIES_USERS?foreign?key?(USERNAME)??
  • references?USERS?(USERNAME);??


  • 可插入幾條數據做為試驗,首先插入用戶:

    [sql] view plaincopy
  • insert?into?users?(USERNAME,?PASSWORD,?ENABLED,?USERNAMECN,?ROWID)??
  • values?('lxb',?'c7d3f4c857bc8c145d6e5d40c1bf23d9',?1,?'登錄用戶',?'AAAHmhAALAAAAAOAAA');??
  • ??
  • insert?into?users?(USERNAME,?PASSWORD,?ENABLED,?USERNAMECN,?ROWID)??
  • values?('admin',?'ceb4f32325eda6142bd65215f4c0f371',?1,?'系統管理員',?'AAAHmhAALAAAAAPAAA');??
  • ??
  • insert?into?users?(USERNAME,?PASSWORD,?ENABLED,?USERNAMECN,?ROWID)??
  • values?('user',?'47a733d60998c719cf3526ae7d106d13',?1,?'普通用戶',?'AAAHmhAALAAAAAPAAB');??

  • 再插入角色:

    [sql] view plaincopy
  • insert?into?authorities?(USERNAME,?AUTHORITY,?ROWID)??
  • values?('admin',?'ROLE_PLATFORMADMIN',?'AAAHmjAALAAAAAgAAA');??
  • ??
  • insert?into?authorities?(USERNAME,?AUTHORITY,?ROWID)??
  • values?('admin',?'ROLE_SYSADMIN',?'AAAHmjAALAAAAAgAAB');??
  • ??
  • insert?into?authorities?(USERNAME,?AUTHORITY,?ROWID)??
  • values?('lxb',?'ROLE_LOGIN',?'AAAHmjAALAAAAAeAAA');??
  • ??
  • insert?into?authorities?(USERNAME,?AUTHORITY,?ROWID)??
  • values?('lxb',?'ROLE_LOGINTOWELCOME',?'AAAHmjAALAAAAAeAAB');??
  • ??
  • insert?into?authorities?(USERNAME,?AUTHORITY,?ROWID)??
  • values?('user',?'ROLE_USER',?'AAAHmjAALAAAAAgAAC');??
  • ?

    第二種方法之密碼加密

    ????可能要有人要問,用戶表里面的密碼是如何取得的呢?這個密碼是通過MD5進行加密過的,并且以用戶名做為了鹽值,最后就成為32位數字這個 樣子,這個你可以參見下面applicationContext-Security.xml中的password-encoder和salt- source的配置就會明白。
    ????那么在spring security3中是如何加密的呢?當我們設置了pawwrod-encoder和salt-source之后,Spring Security3會根據配置,采用相匹配的加密算法(比如設置了MD5加密算法)再加上salt-source進行加密,形成32位數字的密文。
    ????比如用戶名為yew,密碼為yew1234,鹽值為用戶名yew。那么最后加密的明文為“yew1234{yew}”,密文就為“8fe2657d1599dba8e78a7a0bda8651bb”。

    ????我們在試驗過程中,通常喜歡先將幾個常用的用戶及密碼插入數據庫進行試驗,這種情況下如何得到該用戶的密碼密文呢?
    ????不妨試試我這個辦法,假設,用戶名為user,密碼明文為user369,而且在配置文件里面設置了以MD5作為加密算法,并以用戶名做為鹽值。
    ????那么你可以首先將各個信息組合成待加密的密碼明文, 應是 密碼明文 + { + 鹽值 + }, 那么很明顯,上述user的密碼明文應當是:

    ????user369{user}

    ????拿上述的字串拷貝到 http://www.51240.com/md5jiami/ 網頁上的輸入框里,點擊加密按鈕,下面即可生成32位數字的密碼密文。

    ????哈哈,屢試不爽啊。這個方法要謹慎使用,一般人我不告訴他。


    第二種方法之相關配置

    ????將權限及資源(URL或Action)的關系配置在xml文件中,并且配置與Spring Security3相關的其他配置:

    ????1、applicationContext-Security.xml代碼

    [html] view plaincopy
  • <b:beans?xmlns="http://www.springframework.org/schema/security"??
  • ?xmlns:b="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.0.xsd">??
  • ??
  • ?<http?auto-config="true"?access-denied-page="/accessDenied.jsp">??
  • ??<!--?不要過濾圖片等靜態資源,其中**代表可以跨越目錄,*不可以跨越目錄。?-->??
  • ??<intercept-url?pattern="/**/*.jpg"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.png"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.gif"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.css"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.js"?filters="none"?/>??
  • ??<!--?登錄頁面和忘記密碼頁面不過濾?-->??
  • ??<intercept-url?pattern="/login.jsp"?filters="none"?/>??
  • ??<intercept-url?pattern="/jsp/forgotpassword.jsp"???filters="none"?/>???
  • ??
  • ???<!--?下面是對Action配置。表示具有訪問/unitsManager資源的用戶必須具有ROLE_PLATFORMADMIN的權限。??
  • ??????????????????????當用戶登錄時,SS3將用戶的所有權限從數據庫中提取出來,形成列表。?當用戶訪問該資源時,SS3將??
  • ??????????????????????登錄用戶的權限列表提出來跟下面配置的權限進行比對,若有,則允許訪問,若沒有,則給出AccessDeniedException。-->??
  • ??<intercept-url?pattern="/unitsManager"???access="ROLE_PLATFORMADMIN"?/>??
  • ??<intercept-url?pattern="/usersManager"??access="ROLE_PLATFORMADMIN"?/>??
  • ??
  • ??<intercept-url?pattern="/horizontalQuery"??access="ROLE_PLATFORMADMIN"?/>??
  • ?????
  • ??<intercept-url?pattern="/verticalQuery"????access="ROLE_PLATFORMADMIN"?/>??
  • ????
  • ??<form-login?login-page="/login.jsp"??authentication-failure-url="/login.jsp?error=true"???default-target-url="/index.jsp"?/>??
  • ??
  • ??<!--?"記住我"功能,采用持久化策略(將用戶的登錄信息存放在數據庫表中)?-->??
  • ??<remember-me?data-source-ref="dataSource"?/>??
  • ????
  • ??<!--?檢測失效的sessionId,超時時定位到另外一個URL?-->??
  • ??<session-management?invalid-session-url="/sessionTimeout.jsp"?/>??
  • ????
  • ?</http>??
  • ??
  • ?<!--?注意能夠為authentication-manager?設置alias別名??-->??
  • ?<authentication-manager?alias="authenticationManager">??
  • ??????<authentication-provider?user-service-ref="userDetailsManager">??
  • ???????????<password-encoder?ref="passwordEncoder">??
  • ????????????????<!--?用戶名做為鹽值?-->??
  • ????????????????<salt-source?user-property="username"?/>??
  • ???????????</password-encoder>??
  • ??????</authentication-provider>??
  • ?</authentication-manager>??
  • ??
  • </b:beans>??

  • 2、applicationContext.service.xml:

    [html] view plaincopy
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  • ?xmlns:util="http://www.springframework.org/schema/util"??
  • ?xmlns:jee="http://www.springframework.org/schema/jee"???
  • ?xmlns:aop="http://www.springframework.org/schema/aop"??
  • ?xmlns:tx="http://www.springframework.org/schema/tx"???
  • ?xmlns:context="http://www.springframework.org/schema/context"??
  • ?xsi:schemaLocation="http://www.springframework.org/schema/beans??
  • ?http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
  • ???http://www.springframework.org/schema/aop???
  • ???http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  • ???http://www.springframework.org/schema/tx??
  • ???http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
  • ???http://www.springframework.org/schema/jee??
  • ???http://www.springframework.org/schema/jee/spring-jee-3.0.xsd??
  • ???http://www.springframework.org/schema/context??
  • ???http://www.springframework.org/schema/context/spring-context-3.0.xsd??
  • ???http://www.springframework.org/schema/util???
  • ???http://www.springframework.org/schema/util/spring-util-3.0.xsd">??
  • ???
  • ?<!--?定義上下文返回的消息的國際化。?-->??
  • ?<bean?id="messageSource"??
  • ??class="org.springframework.context.support.ReloadableResourceBundleMessageSource">??
  • ??<property?name="basename"??
  • ???value="classpath:org/springframework/security/messages_zh_CN"/>??
  • ?</bean>??
  • ??
  • ?<!--???事件監聽:實現了?ApplicationListener監聽接口,包括AuthenticationCredentialsNotFoundEvent?事件,??
  • ??AuthorizationFailureEvent事件,AuthorizedEvent事件,?PublicInvocationEvent事件?-->??
  • ?<bean??class="org.springframework.security.authentication.event.LoggerListener"?/>??
  • ??
  • ?<!--?用戶的密碼加密或解密?-->??
  • ?<bean?id="passwordEncoder"??
  • ??class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"?/>??
  • ??
  • ??
  • ?<!--?用戶詳細信息管理?:?數據源、用戶緩存、啟用用戶組功能。??-->??
  • ?<bean?id="userDetailsManager"??
  • ??class="org.springframework.security.provisioning.JdbcUserDetailsManager">??
  • ??<property?name="dataSource"?ref="dataSource"?/>??
  • ??<property?name="userCache"?ref="userCache"?/>??
  • ?</bean>???
  • ???
  • ?<bean?id="userCache"??
  • ??class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">??
  • ??<property?name="cache"?ref="userEhCache"?/>??
  • ?</bean>???
  • ???
  • ???
  • ?<bean?id="userEhCache"?class="org.springframework.cache.ehcache.EhCacheFactoryBean">??
  • ??<property?name="cacheName"?value="userCache"?/>??
  • ??<property?name="cacheManager"?ref="cacheManager"?/>??
  • ?</bean>??
  • ???
  • ?<!--?緩存用戶管理?-->??
  • ?<bean?id="cacheManager"??
  • ??class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"?/>??
  • ????
  • ??
  • ?<!--?spring?security自帶的與權限有關的數據讀寫Jdbc模板?-->??
  • ?<bean?id="jdbcTemplate"?class="org.springframework.jdbc.core.JdbcTemplate">??
  • ??<property?name="dataSource"?ref="dataSource"?/>??
  • ?</bean>??
  • ??
  • </beans>??

  • 3、web.xml:

    [html] view plaincopy
  • <web-app?version="2.5"?xmlns="http://java.sun.com/xml/ns/javaee"??
  • ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  • ?xsi:schemaLocation="http://java.sun.com/xml/ns/javaee???
  • ??http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">??
  • ??
  • ??
  • ?<!--?設置log4j存放Log文件位置(通過spring統一進行管理)?-->??
  • ?<context-param>??
  • ??<param-name>webAppRootKey</param-name>??
  • ??<param-value>log.root</param-value>??
  • ?</context-param>??
  • ??
  • ?<!--?加載log4j的配置文件?-->??
  • ?<context-param>??
  • ??<param-name>log4jConfigLocation</param-name>??
  • ??<param-value>classpath:/log4j.properties</param-value>??
  • ?</context-param>??
  • ??
  • ?<!--Spring默認刷新Log4j配置文件的間隔,單位為millisecond-->??
  • ?<context-param>??
  • ??<param-name>log4jRefreshInterval</param-name>??
  • ??<param-value>60000</param-value>??
  • ?</context-param>??
  • ??
  • ?<!--Spring用于log4j初始化的監聽器-->??
  • ?<listener>??
  • ??<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>??
  • ?</listener>??
  • ??
  • ?<!--??
  • ??加載Spring?XML配置文件,Spring安全配置及各類資源文件,暫不加??
  • ??/WEB-INF/applicationContext-security.xml,??
  • ?-->??
  • ?<context-param>??
  • ??<param-name>contextConfigLocation</param-name>??
  • ??<param-value>??
  • ???????????/WEB-INF/applicationContext*.xml,??
  • ???????????classpath*:applicationContext.xml??
  • ????????</param-value>??
  • ?</context-param>??
  • ??
  • ?<!--spring監聽器的配置,用于在啟動Web容器時,自動裝配ApplicationContext的配置信息-->??
  • ?<listener>??
  • ??<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>??
  • ?</listener>??
  • ??
  • ?<!--?使用Spring中的過濾器解決在請求和應答中的中文亂碼問題?-->??
  • ?<filter>??
  • ??<filter-name>characterEncodingFilter</filter-name>??
  • ??<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>??
  • ??<init-param>??
  • ???<param-name>encoding</param-name>??
  • ???<param-value>gbk</param-value>??
  • ??</init-param>??
  • ??<init-param>??
  • ???<!--強制轉換編碼(request和response均適用)?-->??
  • ???<param-name>ForceEncoding</param-name>??
  • ???<param-value>true</param-value>??
  • ??</init-param>??
  • ?</filter>??
  • ??
  • ?<filter-mapping>??
  • ??<filter-name>characterEncodingFilter</filter-name>??
  • ??<url-pattern>/*</url-pattern>??
  • ?</filter-mapping>??
  • ??
  • ???
  • ?<!--?Spring?Secutiry3.0.2的過濾器鏈配置??-->??
  • ?<filter>??
  • ??<filter-name>springSecurityFilterChain</filter-name>??
  • ??<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>??
  • ?</filter>??
  • ??
  • ?<filter-mapping>??
  • ??<filter-name>springSecurityFilterChain</filter-name>??
  • ??<url-pattern>/*</url-pattern>??
  • ?</filter-mapping>??
  • ??
  • ???
  • ????<!--?配置Struts2的FilterDispathcer的Filter?-->??
  • ????<filter>??
  • ????????<filter-name>struts2</filter-name>??
  • ????????<filter-class>??
  • ?????????org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter??
  • ????????</filter-class>??????????
  • ????</filter>??
  • ??
  • ?<!--?struts2用以處理用戶Web請求的路徑模式-->??
  • ????<filter-mapping>??
  • ????????<filter-name>struts2</filter-name>??
  • ????????<url-pattern>/*</url-pattern>??
  • ????</filter-mapping>??
  • ??????
  • ?????
  • ???
  • ?<!--?避免亂碼問題?-->??
  • ?<filter>??
  • ????????<filter-name>struts-cleanup</filter-name>??
  • ????????<filter-class>??
  • ????????????org.apache.struts2.dispatcher.ActionContextCleanUp??
  • ????????</filter-class>??
  • ????</filter>??
  • ??????
  • ????<filter-mapping>??
  • ????????<filter-name>struts-cleanup</filter-name>??
  • ????????<url-pattern>/*</url-pattern>??
  • ????</filter-mapping>??
  • ??????
  • ????<!--?Spring刷新Interceptor防止內存泄漏??-->??
  • ????<listener>??
  • ?????<listener-class>??
  • ?????org.springframework.web.util.IntrospectorCleanupListener??
  • ?????</listener-class>??
  • ????</listener>??
  • ???
  • ??
  • ?<!--?設置session?超時時間為20分鐘??-->??
  • ?<session-config>??
  • ??<session-timeout>20</session-timeout>??
  • ?</session-config>??
  • ??
  • ?<!--系統歡迎頁面-->??
  • ?<welcome-file-list>??
  • ??<welcome-file>login.jsp</welcome-file>??
  • ?</welcome-file-list>??
  • ??
  • </web-app>??
  • ?令人欣喜的是,整個Security配置過程中,除了建立數據庫和編寫配置文件之外,不需要編寫任何的代碼。怎么樣? 有點意思吧!

    第二種方法中遇見的問題

    ????當然,首次使用Spring serutiry,在整合的過程中,我還是遇見了不少問題,當然有些問題比如找不到類呀,包呀,和框架的整合呀等問題不作為談論的重點。主要還是探討Spring Security的配置和注意事項的問題。

    ????我在其中碰到的對我印象最深的問題是,當完全配置好之后,重啟Web服務器,卻發現Spring Security不能攔截任何的URL了,這使我感到驚詫,因為在去年時,我已經將該框架搭建完成,在當時正是使用的該種方法,并且在試驗是否能夠攔截 jsp文件時進行了確認是沒有問題的。

    ????接下來我又整理了一下applicationContext-security.xml的文件才發現, 除了不需要進行檢測的圖片及登錄頁面之外,沒有對任何的資源和權限之間的對應關系進行配置,參見下面的代碼:

    [html] view plaincopy
  • <http?auto-config="true"?access-denied-page="/accessDenied.jsp">??
  • ??<!--?不要過濾圖片等靜態資源,其中**代表可以跨越目錄,*不可以跨越目錄。?-->??
  • ??<intercept-url?pattern="/**/*.jpg"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.png"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.gif"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.css"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.js"?filters="none"?/>??
  • ??<!--?登錄頁面和忘記密碼頁面不過濾?-->??
  • ??<intercept-url?pattern="/login.jsp"?filters="none"?/>??
  • ??<intercept-url?pattern="/jsp/forgotpassword.jsp"?filters="none"?/>???
  • ??
  • ?????????????<!--?下面是對Struts2的Action請求時的配置。注意在前面加/,否則不會被SS3進行攔截驗證。??
  • ??????????????????表示具有訪問/unitsManager資源的用戶必須具有ROLE_PLATFORMADMIN的權限。??
  • ??????????????????當用戶登錄時,SS3將用戶的所有權限從數據庫中提取出來,形成列表。?當用戶訪問該資源時,??
  • ??????????????????SS3將登錄用戶的權限列表提出來跟下面配置的權限進行比對,若有,則允許訪問,若沒有,??
  • ??????????????????則給出AccessDeniedException。???
  • ??<intercept-url?pattern="/unitsManager"??access="ROLE_PLATFORMADMIN"?/>??
  • ??<intercept-url?pattern="/usersManager"??access="ROLE_PLATFORMADMIN"?/>??
  • ??<intercept-url?pattern="/horizontalQuery"?access="ROLE_PLATFORMADMIN"?/>???
  • ??<intercept-url?pattern="/verticalQuery"??access="ROLE_PLATFORMADMIN"?/>???-->??
  • ????
  • ??<form-login?login-page="/login.jsp"???
  • ???authentication-failure-url="/login.jsp?error=true"??
  • ???default-target-url="/index.jsp"?/>??
  • ??
  • ??<!--?"記住我"功能,采用持久化策略(將用戶的登錄信息存放在數據庫表中)?-->??
  • ??<remember-me?data-source-ref="dataSource"?/>??
  • ????
  • ??<!--?檢測失效的sessionId,超時時定位到另外一個URL?-->??
  • ??<session-management?invalid-session-url="/sessionTimeout.jsp"?/>??
  • ????
  • ?</http>??
  • ?

    ?這樣一來,spring security3就會認為根本不需要對任何的URL或Action進行檢測(注意上面代碼中被注釋掉的4條配置)。 哈哈,當時這個問題深深動搖了我對Spring security的信心,花費了這么多天的精力,卻是這樣的結果,當時就在考慮是否有更好的替代品。有點崩潰啊。 還好,深深地求知欲和征服欲讓我堅持下來了。
    ????哈哈,這算不算Spring Security的一個Bug呢?沒有任何的權限與資源的配置,就認為登錄后的用戶具有訪問任何資源的權限,說起來有點可怕哈。

    ????當然,當我將上述代碼中被注釋的4條配置放開后,Spring security奇跡般的恢復了活力。

    ????接下來實現了jsp型URL的攔截之后,我又遇見了不能攔截action的情況,不過經過多次的配置和重啟服務試驗,終于發現,在配置 Action與權限時,一定要在Action的路徑前面加“/”斜杠,否則,Spring Security就會對該請求的URL熟視無睹,無視它的存在,即使你在Action的前后加上*號進行匹配也不會起任何作用,哈哈,不禁慨嘆 Spring Security的牛脾氣。


    第二種方法BTW

    ????順便提一下子,Spring Security3需要配置的過濾器是雙重的,首先在web.xml中配置一個過濾器代理,參見上述web.xml中的springSecurityFilterChain配置。
    ????我們通常設置過濾的url模式為/*,就是說任何的url訪問都要進行過濾,工作量有點大哈。當然我們可以為之設置不同的過濾url模式,比 如.action、.do、.jsp等。這樣的話,遇到.action或.jsp或.do結尾的url訪問,Spring Security就會突然站出來打截,若是其他的訪問,Spring Security就會揮一揮手,瀟灑地讓你路過。
    所以說,這個過濾器主要對大的方面進行攔截,一些細小的活兒,還是要交給第二重過濾器。 就是說,這第一重過濾器是個總代理,他威武地管理著一個過濾器鏈。

    ????那么這第二重過濾器的配置,就是那些所謂的過濾器鏈,分別包括“記住我”、“登錄”、“注銷”、“url訪問”等的過濾器,這個過濾器依順 序排開,形成一個過濾鏈條。具體攔截我們明細Url的是一個叫做FilterInterCeptor的伙計,我認為這個家伙是在整個過濾器鏈條中是最重要 的一個,因為我們登錄系統之后,要訪問的任何資源都必須經得他的同意。 那么這第二重鏈條就設置在applicationContext-security.xml文件中的<http>元素下面。
    ????什么,你看不到? 忘記告訴你了,從spring security2開始,就使用了命名空間,若你在<http>中設置了auto="true",Spring Security就會在服務啟動時自動加載
    所有的過濾器鏈,省事了吧!

    ?

    第三種方法

    ????當然,spring security3畢竟是西方國家的東西,以英文為主,使用習慣和文化的差異共存,況且為了適應大多數Web應用的權限管理,作者將Spring Security3打造的精簡而靈活。精簡指Spring Security3對用戶和權限的表設計的非常簡單,并且沒有采用數據庫來管理資源(URL)。這樣的話,對于我們國人用戶來說,是個很大的遺憾,這個遺 憾甚至能夠影響到我們對安全框架的選型。你想啊,在國內大多數項目中,均設置了比較復雜的權限控制,一般就會涉及到用戶、角色、權限、資源4張表,若要加 上4張表之間的對應關系表3張,得有7張表才行。

    ????得7張表才行,但是Spring Security3才給我們提供了2張最簡潔的表,這足以不能完成國人用戶的項目應用。那么在對Spring Security3一無所知的情況下,
    我們很容易就會放棄對該安全框架的選型。

    ????還好,Spring Security3提供了靈活的擴展方法。具體應該擴展哪些類呢? 或者到底Spring Security3工作的流程如何,你不妨參看下面一篇文章,就會獲得
    一些啟示,網址為:http://www.blogjava.net/youxia/archive/2008/12/07/244883.html , 哈哈,謝謝分享。

    ????還有一個地址很有價值, http://wenku.baidu.com/view/4ec7e324ccbff121dd368364.html ,我就參考著上面的介紹擴展了4個類。

    ????不過我得提一下,原文的作者為了考驗你的耐性和自信心,故意在代碼里面賣了幾點小小的關子,因此若是完全按照作者的原文代碼裝配起來的權限 系統,是不會那么順利地工作的,天下似乎真是沒有不花費力氣的午餐!在裝配完成后,我也是經過九九八十一難的折磨,在用戶、角色、權限、資源的
    “天下黃河九曲十八彎”里面盤旋迂回,終于到達了成功的彼岸。至此才對Spring Security有了更深層次的理解,更加佩服作者的良苦用心。 哈哈。

    ?????并擴展了User類以增加其相關的各類其他信息(如Email,職務,所在單位id等)。


    相關的代碼如下(包含5個關鍵類):

    [java] view plaincopy
  • /*?
  • ?*?@(#)?MyFilterSecurityInterceptor.java??2011-3-23?上午07:53:03?
  • ?*?
  • ?*?Copyright?2011?by?Sparta??
  • ?*/??
  • ??
  • package?avatar.base.security;??
  • ??
  • import?java.io.IOException;??
  • ??
  • import?javax.servlet.Filter;??
  • import?javax.servlet.FilterChain;??
  • import?javax.servlet.FilterConfig;??
  • import?javax.servlet.ServletException;??
  • import?javax.servlet.ServletRequest;??
  • import?javax.servlet.ServletResponse;??
  • ??
  • import?org.springframework.security.access.SecurityMetadataSource;??
  • import?org.springframework.security.access.intercept.AbstractSecurityInterceptor;??
  • import?org.springframework.security.access.intercept.InterceptorStatusToken;??
  • import?org.springframework.security.web.FilterInvocation;??
  • import?org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;??
  • ??
  • /**?*//**?
  • ?*?該過濾器的主要作用就是通過spring著名的IoC生成securityMetadataSource。?
  • ?*?securityMetadataSource相當于本包中自定義的MyInvocationSecurityMetadataSourceService。?
  • ?*?該MyInvocationSecurityMetadataSourceService的作用提從數據庫提取權限和資源,裝配到HashMap中,?
  • ?*?供Spring?Security使用,用于權限校驗。?
  • ?*?@author?sparta?11/3/29?
  • ?*?
  • ?*/??
  • ??
  • public?class?MyFilterSecurityInterceptor???
  • ?extends?AbstractSecurityInterceptor??
  • ?implements?Filter{??
  • ???
  • ??
  • ?private?FilterInvocationSecurityMetadataSource?securityMetadataSource;??
  • ???
  • ?public?void?doFilter(?ServletRequest?request,?ServletResponse?response,?FilterChain?chain)??
  • ?throws?IOException,?ServletException{??
  • ????
  • ??FilterInvocation?fi?=?new?FilterInvocation(?request,?response,?chain?);??
  • ??invoke(fi);??
  • ????
  • ?}??
  • ???
  • ?public?FilterInvocationSecurityMetadataSource?getSecurityMetadataSource(){??
  • ??return?this.securityMetadataSource;??
  • ?}??
  • ???
  • ?public?Class<??extends?Object>?getSecureObjectClass(){??
  • ??return?FilterInvocation.class;??
  • ?}??
  • ??
  • ???
  • ?public?void?invoke(?FilterInvocation?fi?)?throws?IOException,?ServletException{??
  • ????
  • ??InterceptorStatusToken??token?=?super.beforeInvocation(fi);??
  • ????
  • ??try{??
  • ???fi.getChain().doFilter(fi.getRequest(),?fi.getResponse());??
  • ??}finally{??
  • ???super.afterInvocation(token,?null);??
  • ??}??
  • ????
  • ?}??
  • ????
  • ???
  • ?@Override??
  • ?public?SecurityMetadataSource?obtainSecurityMetadataSource(){??
  • ??return?this.securityMetadataSource;??
  • ?}??
  • ???
  • ???
  • ?public?void?setSecurityMetadataSource(FilterInvocationSecurityMetadataSource?securityMetadataSource){??
  • ??this.securityMetadataSource?=?securityMetadataSource;??
  • ?}??
  • ???
  • ???
  • ?public?void?destroy(){??
  • ????
  • ?}??
  • ???
  • ?public?void?init(?FilterConfig?filterconfig?)?throws?ServletException{??
  • ????
  • ?}??
  • ???
  • ???
  • }??
  • ??
  • ???
  • ??
  • /**//*?
  • ?*?@(#)?MyInvocationSecurityMetadataSourceService.java??2011-3-23?下午02:58:29?
  • ?*?
  • ?*?Copyright?2011?by?Sparta??
  • ?*/??
  • ??
  • package?avatar.base.security;??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.Collection;??
  • import?java.util.HashMap;??
  • import?java.util.Iterator;??
  • import?java.util.List;??
  • import?java.util.Map;??
  • ??
  • import?org.hibernate.Session;??
  • import?org.hibernate.SessionFactory;??
  • import?org.springframework.beans.factory.annotation.Autowired;??
  • import?org.springframework.context.ApplicationContext;??
  • import?org.springframework.context.support.ClassPathXmlApplicationContext;??
  • import?org.springframework.security.access.ConfigAttribute;??
  • import?org.springframework.security.access.SecurityConfig;??
  • import?org.springframework.security.core.GrantedAuthority;??
  • import?org.springframework.security.core.context.SecurityContextHolder;??
  • import?org.springframework.security.core.userdetails.UserDetails;??
  • import?org.springframework.security.web.FilterInvocation;??
  • import?org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;??
  • import?org.springframework.security.web.util.AntUrlPathMatcher;??
  • import?org.springframework.security.web.util.UrlMatcher;??
  • import?org.springframework.stereotype.Service;??
  • ??
  • import?avatar.base.security.dao.PubAuthoritiesResourcesHome;??
  • ??
  • /**?*//**?
  • ?*?最核心的地方,就是提供某個資源對應的權限定義,即getAttributes方法返回的結果。?此類在初始化時,應該取到所有資源及其對應角色的定義。?
  • ?*??
  • ?*/??
  • @Service??
  • public?class?MyInvocationSecurityMetadataSourceService?implements??
  • ??FilterInvocationSecurityMetadataSource?{??
  • ??
  • ?@Autowired??
  • ?private?PubAuthoritiesResourcesHome?pubAuthoritiesResourcesHome;??
  • ??
  • ?private?UrlMatcher?urlMatcher?=?new?AntUrlPathMatcher();??
  • ??
  • ?private?static?Map<String,?Collection<ConfigAttribute>>?resourceMap?=?null;??
  • ??
  • ?public?MyInvocationSecurityMetadataSourceService()?{??
  • ??loadResourceDefine();??
  • ?}??
  • ??
  • ?private?void?loadResourceDefine()?{??
  • ??ApplicationContext?context?=?new?ClassPathXmlApplicationContext(??
  • ????"classpath:applicationContext.xml");??
  • ??
  • ??SessionFactory?sessionFactory?=?(SessionFactory)?context??
  • ????.getBean("sessionFactory");??
  • ??
  • ??Session?session?=?sessionFactory.openSession();??
  • ??
  • ??String?username?=?"";??
  • ??String?sql?=?"";??
  • ??
  • ??//?在Web服務器啟動時,提取系統中的所有權限。??
  • ??sql?=?"select?authority_name?from?pub_authorities";??
  • ??
  • ??List<String>?query?=?session.createSQLQuery(sql).list();??
  • ??
  • ??/**//*?
  • ???*?應當是資源為key,?權限為value。?資源通常為url,?權限就是那些以ROLE_為前綴的角色。?一個資源可以由多個權限來訪問。?
  • ???*?sparta?
  • ???*/??
  • ??resourceMap?=?new?HashMap<String,?Collection<ConfigAttribute>>();??
  • ??
  • ??for?(String?auth?:?query)?{??
  • ???ConfigAttribute?ca?=?new?SecurityConfig(auth);??
  • ??
  • ???List<String>?query1?=?session??
  • ?????.createSQLQuery(??
  • ???????"select?b.resource_string?"??
  • ?????????+?"from?Pub_Authorities_Resources?a,?Pub_Resources?b,?"??
  • ?????????+?"Pub_authorities?c?where?a.resource_id?=?b.resource_id?"??
  • ?????????+?"and?a.authority_id=c.authority_id?and?c.Authority_name='"??
  • ?????????+?auth?+?"'").list();??
  • ??
  • ???for?(String?res?:?query1)?{??
  • ????String?url?=?res;??
  • ??????
  • ????/**//*?
  • ?????*?判斷資源文件和權限的對應關系,如果已經存在相關的資源url,則要通過該url為key提取出權限集合,將權限增加到權限集合中。?
  • ?????*?sparta?
  • ?????*/??
  • ????if?(resourceMap.containsKey(url))?{??
  • ??
  • ?????Collection<ConfigAttribute>?value?=?resourceMap.get(url);??
  • ?????value.add(ca);??
  • ?????resourceMap.put(url,?value);??
  • ????}?else?{??
  • ?????Collection<ConfigAttribute>?atts?=?new?ArrayList<ConfigAttribute>();??
  • ?????atts.add(ca);??
  • ?????resourceMap.put(url,?atts);??
  • ????}??
  • ??
  • ???}??
  • ??
  • ??}??
  • ??
  • ?}??
  • ??
  • ?@Override??
  • ?public?Collection<ConfigAttribute>?getAllConfigAttributes()?{??
  • ??
  • ??return?null;??
  • ?}??
  • ??
  • ?//?根據URL,找到相關的權限配置。??
  • ?@Override??
  • ?public?Collection<ConfigAttribute>?getAttributes(Object?object)??
  • ???throws?IllegalArgumentException?{??
  • ??
  • ??//?object?是一個URL,被用戶請求的url。??
  • ??String?url?=?((FilterInvocation)?object).getRequestUrl();??
  • ????
  • ????????int?firstQuestionMarkIndex?=?url.indexOf("?");??
  • ??
  • ????????if?(firstQuestionMarkIndex?!=?-1)?{??
  • ????????????url?=?url.substring(0,?firstQuestionMarkIndex);??
  • ????????}??
  • ??
  • ??Iterator<String>?ite?=?resourceMap.keySet().iterator();??
  • ??
  • ??while?(ite.hasNext())?{??
  • ???String?resURL?=?ite.next();??
  • ?????
  • ???if?(urlMatcher.pathMatchesUrl(url,?resURL))?{??
  • ??
  • ????return?resourceMap.get(resURL);??
  • ???}??
  • ??}??
  • ??
  • ??return?null;??
  • ?}??
  • ??
  • ?@Override??
  • ?public?boolean?supports(Class<?>?arg0)?{??
  • ??
  • ??return?true;??
  • ?}??
  • ??
  • }??
  • ??
  • ??
  • /**//*?
  • ?*?@(#)?MyUserDetailsService.java??2011-3-23?上午09:04:31?
  • ?*?
  • ?*?Copyright?2011?by?Sparta??
  • ?*/??
  • ??
  • package?avatar.base.security;??
  • ??
  • ??
  • import?java.util.ArrayList;??
  • import?java.util.Collection;??
  • ??
  • ??
  • import?javax.sql.DataSource;??
  • ??
  • ??
  • import?org.springframework.beans.factory.annotation.Autowired;??
  • import?org.springframework.dao.DataAccessException;??
  • import?org.springframework.security.core.GrantedAuthority;??
  • import?org.springframework.security.core.userdetails.User;??
  • import?org.springframework.security.core.userdetails.UserCache;??
  • import?org.springframework.security.core.userdetails.UserDetails;??
  • import?org.springframework.security.core.userdetails.UserDetailsService;??
  • import?org.springframework.security.core.userdetails.UsernameNotFoundException;??
  • import?org.springframework.stereotype.Service;??
  • ??
  • import?avatar.base.security.dao.PubAuthoritiesResourcesHome;??
  • import?avatar.base.security.dao.PubUsersHome;??
  • ??
  • ??
  • /**?*//**?
  • ?*該類的主要作用是為Spring?Security提供一個經過用戶認證后的UserDetails。?
  • ?*該UserDetails包括用戶名、密碼、是否可用、是否過期等信息。?
  • ?*sparta?11/3/29?
  • ?*/??
  • @Service??
  • public?class?MyUserDetailsService?implements?UserDetailsService?{??
  • ??
  • ?@Autowired??
  • ?private?PubUsersHome?pubUsersHome;??
  • ???
  • ?@Autowired??
  • ?private?PubAuthoritiesResourcesHome?pubAuthoritiesResourcesHome;??
  • ???
  • ?@Autowired??
  • ?private?DataSource?dataSource;??
  • ???
  • ?@Autowired??
  • ?private?UserCache?userCache;??
  • ??
  • ?@Override??
  • ?public?UserDetails?loadUserByUsername(String?username)??
  • ???throws?UsernameNotFoundException,?DataAccessException?{??
  • ????
  • ??Collection<GrantedAuthority>?auths?=?new?ArrayList<GrantedAuthority>();??
  • ????
  • ????
  • ??//得到用戶的權限??
  • ??auths?=?pubUsersHome.loadUserAuthoritiesByName(?username?);??
  • ????
  • ??String?password?=?null;??
  • ????
  • ??//取得用戶的密碼??
  • ??password?=?pubUsersHome.getPasswordByUsername(?username?);????
  • ?????
  • ??return?new?User(?username,?password,?true,?"",?true,?true,?true,?auths);??
  • ?}??
  • ????
  • ?//set?PubUsersHome??
  • ?public?void?setPubUsersHome(?PubUsersHome?pubUsersHome?){??
  • ??this.pubUsersHome?=?pubUsersHome;??
  • ????
  • ?}??
  • ???
  • ?public?PubUsersHome?getPubUsersHome(){??
  • ??return?pubUsersHome;??
  • ?}??
  • ???
  • ???
  • ?//set?PubAuthoritiesResourcesHome??
  • ?public?void?setPubAuthoritiesResourcesHome(?PubAuthoritiesResourcesHome?pubAuthoritiesResourcesHome?){??
  • ??this.pubAuthoritiesResourcesHome?=?pubAuthoritiesResourcesHome;??
  • ????
  • ?}??
  • ???
  • ?public?PubAuthoritiesResourcesHome?getPubAuthoritiesResourcesHome(){??
  • ??return?pubAuthoritiesResourcesHome;??
  • ????
  • ?}??
  • ???
  • ?//set?DataSource??
  • ?public?void?setDataSource(?DataSource?dataSource?){??
  • ??this.dataSource?=?dataSource;??
  • ?}??
  • ???
  • ?public?DataSource?getDataSource(){??
  • ??return?dataSource;??
  • ?}??
  • ???
  • ?//設置用戶緩存功能。??
  • ????public?void?setUserCache(UserCache?userCache)?{??
  • ????????this.userCache?=?userCache;??
  • ????}??
  • ??????
  • ????public?UserCache?getUserCache(){??
  • ?????return?this.userCache;??
  • ????}??
  • ???
  • }??
  • ??
  • /**//*?
  • ?*?@(#)?MyAccessDecisionManager.java??2011-3-23?下午04:41:12?
  • ?*?
  • ?*?Copyright?2011?by?Sparta??
  • ?*/??
  • ??
  • package?avatar.base.security;??
  • ??
  • import?java.util.Collection;??
  • import?java.util.Iterator;??
  • ??
  • import?org.springframework.security.access.AccessDecisionManager;??
  • import?org.springframework.security.access.AccessDeniedException;??
  • import?org.springframework.security.access.ConfigAttribute;??
  • import?org.springframework.security.access.SecurityConfig;??
  • import?org.springframework.security.authentication.InsufficientAuthenticationException;??
  • import?org.springframework.security.core.Authentication;??
  • import?org.springframework.security.core.GrantedAuthority;??
  • ??
  • /**?*//**?
  • ?*AccessdecisionManager在Spring?security中是很重要的。?
  • ?*?
  • ?*在驗證部分簡略提過了,所有的Authentication實現需要保存在一個GrantedAuthority對象數組中。??
  • ?*這就是賦予給主體的權限。?GrantedAuthority對象通過AuthenticationManager?
  • ?*保存到?Authentication對象里,然后從AccessDecisionManager讀出來,進行授權判斷。??
  • ?*?
  • ?*Spring?Security提供了一些攔截器,來控制對安全對象的訪問權限,例如方法調用或web請求。??
  • ?*一個是否允許執行調用的預調用決定,是由AccessDecisionManager實現的。??
  • ?*這個?AccessDecisionManager?被AbstractSecurityInterceptor調用,?
  • ?*它用來作最終訪問控制的決定。?這個AccessDecisionManager接口包含三個方法:??
  • ?*?
  • ?void?decide(Authentication?authentication,?Object?secureObject,?
  • ????List<ConfigAttributeDefinition>?config)?throws?AccessDeniedException;?
  • ?boolean?supports(ConfigAttribute?attribute);?
  • ?boolean?supports(Class?clazz);?
  • ??
  • ??從第一個方法可以看出來,AccessDecisionManager使用方法參數傳遞所有信息,這好像在認證評估時進行決定。??
  • ??特別是,在真實的安全方法期望調用的時候,傳遞安全Object啟用那些參數。??
  • ??比如,讓我們假設安全對象是一個MethodInvocation。??
  • ??很容易為任何Customer參數查詢MethodInvocation,?
  • ??然后在AccessDecisionManager里實現一些有序的安全邏輯,來確認主體是否允許在那個客戶上操作。??
  • ??如果訪問被拒絕,實現將拋出一個AccessDeniedException異常。?
  • ?
  • ??這個?supports(ConfigAttribute)?方法在啟動的時候被?
  • ??AbstractSecurityInterceptor調用,來決定AccessDecisionManager?
  • ??是否可以執行傳遞ConfigAttribute。??
  • ??supports(Class)方法被安全攔截器實現調用,?
  • ??包含安全攔截器將顯示的AccessDecisionManager支持安全對象的類型。?
  • ?*/??
  • public?class?MyAccessDecisionManager?implements?AccessDecisionManager?{??
  • ???
  • ?public?void?decide(?Authentication?authentication,?Object?object,???
  • ???Collection<ConfigAttribute>?configAttributes)???
  • ??throws?AccessDeniedException,?InsufficientAuthenticationException{??
  • ????
  • ??if(?configAttributes?==?null?)?{??
  • ???return?;??
  • ??}??
  • ????
  • ??Iterator<ConfigAttribute>?ite?=?configAttributes.iterator();??
  • ????
  • ??while(?ite.hasNext()){??
  • ?????
  • ???ConfigAttribute?ca?=?ite.next();??
  • ???String?needRole?=?((SecurityConfig)ca).getAttribute();??
  • ?????
  • ???//ga?為用戶所被賦予的權限。?needRole?為訪問相應的資源應該具有的權限。??
  • ???for(?GrantedAuthority?ga:?authentication.getAuthorities()){??
  • ??????
  • ????if(needRole.trim().equals(ga.getAuthority().trim())){??
  • ??
  • ?????return;??
  • ????}??
  • ??????
  • ???}??
  • ?????
  • ??}??
  • ????
  • ??throw?new?AccessDeniedException("");??
  • ????
  • ?}??
  • ???
  • ?public?boolean?supports(?ConfigAttribute?attribute?){??
  • ????
  • ??return?true;??
  • ??
  • ?}??
  • ???
  • ?public?boolean?supports(Class<?>?clazz){??
  • ??return?true;??
  • ??
  • ?}??
  • ???
  • ??
  • }??

  • 數據庫的SQL及預置數據:

    [sql] view plaincopy
  • prompt?PL/SQL?Developer?import?file??
  • prompt?Created?on?2011年6月1日?by?Administrator??
  • set?feedback?off??
  • set?define?off??
  • prompt?Creating?SYS_AUTHORITIES??
  • create?table?SYS_AUTHORITIES??
  • (??
  • ??AUTHORITY_ID???VARCHAR2(32)?not?null,??
  • ??AUTHORITY_NAME?VARCHAR2(40),??
  • ??AUTHORITY_DESC?VARCHAR2(100),??
  • ??ENABLED????????NUMBER(1),??
  • ??ISSYS??????????NUMBER(1),??
  • ??MODULE?????????VARCHAR2(4)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_AUTHORITIES??
  • ??is?'權限表';??
  • comment?on?column?SYS_AUTHORITIES.MODULE??
  • ??is?'所屬的子系統,比如平臺里面包括10個系統,分別為成本、作業、集輸等。';??
  • alter?table?SYS_AUTHORITIES??
  • ??add?constraint?PK_PUB_AUTHORITIES?primary?key?(AUTHORITY_ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • ??
  • prompt?Creating?SYS_RESOURCES??
  • create?table?SYS_RESOURCES??
  • (??
  • ??RESOURCE_ID?????VARCHAR2(32)?not?null,??
  • ??RESOURCE_NAME???VARCHAR2(100),??
  • ??RESOURCE_DESC???VARCHAR2(100),??
  • ??RESOURCE_TYPE???VARCHAR2(40),??
  • ??RESOURCE_STRING?VARCHAR2(200),??
  • ??PRIORITY????????NUMBER(1),??
  • ??ENABLED?????????NUMBER(1),??
  • ??ISSYS???????????NUMBER(1),??
  • ??MODULE??????????VARCHAR2(4)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_RESOURCES??
  • ??is?'資源表';??
  • comment?on?column?SYS_RESOURCES.PRIORITY??
  • ??is?'(暫不用,保留)';??
  • comment?on?column?SYS_RESOURCES.MODULE??
  • ??is?'所屬的子系統,比如平臺里面包括10個系統,分別為成本、作業、集輸等。?(暫不用,保留)';??
  • alter?table?SYS_RESOURCES??
  • ??add?constraint?PK_PUB_RESOURCES?primary?key?(RESOURCE_ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • ??
  • prompt?Creating?SYS_AUTHORITIES_RESOURCES??
  • create?table?SYS_AUTHORITIES_RESOURCES??
  • (??
  • ??ID???????????NUMBER(13)?not?null,??
  • ??AUTHORITY_ID?VARCHAR2(32),??
  • ??RESOURCE_ID??VARCHAR2(32),??
  • ??ENABLED??????NUMBER(1)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_AUTHORITIES_RESOURCES??
  • ??is?'權限資源表';??
  • alter?table?SYS_AUTHORITIES_RESOURCES??
  • ??add?constraint?PK_PUB_AUTHORITIES_RE?primary?key?(ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • alter?table?SYS_AUTHORITIES_RESOURCES??
  • ??add?constraint?FK_PUB_AUTHORITIES_RE_AU?foreign?key?(AUTHORITY_ID)??
  • ??references?SYS_AUTHORITIES?(AUTHORITY_ID);??
  • alter?table?SYS_AUTHORITIES_RESOURCES??
  • ??add?constraint?FK_PUB_AUTHORITIES_RE_RE?foreign?key?(RESOURCE_ID)??
  • ??references?SYS_RESOURCES?(RESOURCE_ID);??
  • ??
  • prompt?Creating?SYS_ROLES??
  • create?table?SYS_ROLES??
  • (??
  • ??ROLE_ID???VARCHAR2(32)?not?null,??
  • ??ROLE_NAME?VARCHAR2(40),??
  • ??ROLE_DESC?VARCHAR2(100),??
  • ??ENABLED???NUMBER(1),??
  • ??ISSYS?????NUMBER(1),??
  • ??MODULE????VARCHAR2(4)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_ROLES??
  • ??is?'角色表';??
  • comment?on?column?SYS_ROLES.MODULE??
  • ??is?'所屬的子系統,比如平臺里面包括10個系統,分別為成本、作業、集輸等。';??
  • alter?table?SYS_ROLES??
  • ??add?constraint?PK_PUB_ROLES?primary?key?(ROLE_ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • ??
  • prompt?Creating?SYS_ROLES_AUTHORITIES??
  • create?table?SYS_ROLES_AUTHORITIES??
  • (??
  • ??ID???????????NUMBER(13)?not?null,??
  • ??ROLE_ID??????VARCHAR2(32),??
  • ??AUTHORITY_ID?VARCHAR2(32),??
  • ??ENABLED??????NUMBER(1)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_ROLES_AUTHORITIES??
  • ??is?'角色權限表';??
  • alter?table?SYS_ROLES_AUTHORITIES??
  • ??add?constraint?PK_PUB_ROLES_AUTHORITY?primary?key?(ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • alter?table?SYS_ROLES_AUTHORITIES??
  • ??add?constraint?FK_PUB_ROLES_AUTHORITIES_AU?foreign?key?(AUTHORITY_ID)??
  • ??references?SYS_AUTHORITIES?(AUTHORITY_ID);??
  • alter?table?SYS_ROLES_AUTHORITIES??
  • ??add?constraint?FK_PUB_ROLES_AUTHORITIES_ROLES?foreign?key?(ROLE_ID)??
  • ??references?SYS_ROLES?(ROLE_ID);??
  • ??
  • prompt?Creating?SYS_USERS??
  • create?table?SYS_USERS??
  • (??
  • ??USER_ID???????VARCHAR2(32)?not?null,??
  • ??USER_ACCOUNT??VARCHAR2(30),??
  • ??USER_NAME?????VARCHAR2(40),??
  • ??USER_PASSWORD?VARCHAR2(100),??
  • ??USER_DESC?????VARCHAR2(100),??
  • ??ENABLED???????NUMBER(1),??
  • ??ISSYS?????????NUMBER(1),??
  • ??USER_DEPT?????VARCHAR2(20),??
  • ??USER_DUTY?????VARCHAR2(10),??
  • ??SUB_SYSTEM????VARCHAR2(30)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_USERS??
  • ??is?'用戶表';??
  • comment?on?column?SYS_USERS.USER_PASSWORD??
  • ??is?'該密碼是經加鹽值加密的,格式為password{username}。?比如用戶的密碼為user,用戶名為user,那么通過MD5進行加密的串為:?user{user}';??
  • comment?on?column?SYS_USERS.ISSYS??
  • ??is?'是否是超級用戶';??
  • comment?on?column?SYS_USERS.USER_DEPT??
  • ??is?'所在單位';??
  • comment?on?column?SYS_USERS.USER_DUTY??
  • ??is?'經理或主任';??
  • comment?on?column?SYS_USERS.SUB_SYSTEM??
  • ??is?'該用戶所負責的各子系統,可多個,中間用逗號分隔。(目前暫未用,作為保留字段)';??
  • alter?table?SYS_USERS??
  • ??add?constraint?PK_PUB_USERS?primary?key?(USER_ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • ??
  • prompt?Creating?SYS_USERS_ROLES??
  • create?table?SYS_USERS_ROLES??
  • (??
  • ??ID??????NUMBER(13)?not?null,??
  • ??USER_ID?VARCHAR2(32),??
  • ??ROLE_ID?VARCHAR2(32),??
  • ??ENABLED?NUMBER(1)??
  • )??
  • tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?1??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • comment?on?table?SYS_USERS_ROLES??
  • ??is?'用戶角色表';??
  • alter?table?SYS_USERS_ROLES??
  • ??add?constraint?PK_PUB_USERS_ROLES?primary?key?(ID)??
  • ??using?index???
  • ??tablespace?SCJD??
  • ??pctfree?10??
  • ??initrans?2??
  • ??maxtrans?255??
  • ??storage??
  • ??(??
  • ????initial?64K??
  • ????minextents?1??
  • ????maxextents?unlimited??
  • ??);??
  • alter?table?SYS_USERS_ROLES??
  • ??add?constraint?FK_USERS_ROLES_ROLES?foreign?key?(ROLE_ID)??
  • ??references?SYS_ROLES?(ROLE_ID);??
  • alter?table?SYS_USERS_ROLES??
  • ??add?constraint?FK_USERS_ROLES_USERS?foreign?key?(USER_ID)??
  • ??references?SYS_USERS?(USER_ID);??
  • ??
  • prompt?Disabling?triggers?for?SYS_AUTHORITIES??
  • alter?table?SYS_AUTHORITIES?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_RESOURCES??
  • alter?table?SYS_RESOURCES?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_AUTHORITIES_RESOURCES??
  • alter?table?SYS_AUTHORITIES_RESOURCES?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_ROLES??
  • alter?table?SYS_ROLES?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_ROLES_AUTHORITIES??
  • alter?table?SYS_ROLES_AUTHORITIES?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_USERS??
  • alter?table?SYS_USERS?disable?all?triggers;??
  • prompt?Disabling?triggers?for?SYS_USERS_ROLES??
  • alter?table?SYS_USERS_ROLES?disable?all?triggers;??
  • prompt?Disabling?foreign?key?constraints?for?SYS_AUTHORITIES_RESOURCES??
  • alter?table?SYS_AUTHORITIES_RESOURCES?disable?constraint?FK_PUB_AUTHORITIES_RE_AU;??
  • alter?table?SYS_AUTHORITIES_RESOURCES?disable?constraint?FK_PUB_AUTHORITIES_RE_RE;??
  • prompt?Disabling?foreign?key?constraints?for?SYS_ROLES_AUTHORITIES??
  • alter?table?SYS_ROLES_AUTHORITIES?disable?constraint?FK_PUB_ROLES_AUTHORITIES_AU;??
  • alter?table?SYS_ROLES_AUTHORITIES?disable?constraint?FK_PUB_ROLES_AUTHORITIES_ROLES;??
  • prompt?Disabling?foreign?key?constraints?for?SYS_USERS_ROLES??
  • alter?table?SYS_USERS_ROLES?disable?constraint?FK_USERS_ROLES_ROLES;??
  • alter?table?SYS_USERS_ROLES?disable?constraint?FK_USERS_ROLES_USERS;??
  • prompt?Deleting?SYS_USERS_ROLES??
  • delete?from?SYS_USERS_ROLES;??
  • commit;??
  • prompt?Deleting?SYS_USERS??
  • delete?from?SYS_USERS;??
  • commit;??
  • prompt?Deleting?SYS_ROLES_AUTHORITIES??
  • delete?from?SYS_ROLES_AUTHORITIES;??
  • commit;??
  • prompt?Deleting?SYS_ROLES??
  • delete?from?SYS_ROLES;??
  • commit;??
  • prompt?Deleting?SYS_AUTHORITIES_RESOURCES??
  • delete?from?SYS_AUTHORITIES_RESOURCES;??
  • commit;??
  • prompt?Deleting?SYS_RESOURCES??
  • delete?from?SYS_RESOURCES;??
  • commit;??
  • prompt?Deleting?SYS_AUTHORITIES??
  • delete?from?SYS_AUTHORITIES;??
  • commit;??
  • prompt?Loading?SYS_AUTHORITIES??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('1303910437484',?'AUTH_xxx',?'xxx',?null,?null,?'01');??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('AUTH_LOGIN4',?'AUTH_LOGIN',?'登錄',?1,?0,?'01');??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('AUTH_AFTERLOGINWELCOME5',?'AUTH_AFTERLOGINWELCOME',?'登錄后歡迎界面',?1,?0,?'01');??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('AUTH_XTSZ_DEPT1',?'AUTH_XTSZ_DEPT',?'單位設置',?1,?0,?'01');??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('AUTH_XTSZ_USER2',?'AUTH_XTSZ_USER',?'用戶設置、橫向查詢',?1,?0,?'01');??
  • insert?into?SYS_AUTHORITIES?(AUTHORITY_ID,?AUTHORITY_NAME,?AUTHORITY_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('AUTH_NODE_MGR3',?'AUTH_NODE_MGR',?'節點管理、縱向查詢',?1,?0,?'01');??
  • commit;??
  • prompt?6?records?loaded??
  • prompt?Loading?SYS_RESOURCES??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('1303909883031',?'ff',?'ff',?'action',?'b.jsp',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('1303909847687',?'ff1',?'ff1',?'action',?'b.jsp',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('node_mgr3',?'node_mgr',?'節點管理',?'url',?'/*/*/Tree.jsp',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('login4',?'login',?'登錄',?'url',?'/login.jsp',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('index5',?'index',?'登錄后歡迎頁面',?'url',?'/index.jsp',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('resources_mgr',?'resources_mgr',?'資源管理',?'action',?'/managerResource',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('horizontal_qry6',?'horizontal_qry',?'橫向查詢',?'action',?'/horizontalQuery',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('vertical_qry7',?'vertical_qry',?'縱向查詢',?'action',?'/verticalQuery',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('dep_mgr1',?'dep_mgr',?'單位管理',?'action',?'/UnitsManager',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('user_mgr2',?'user_mgr',?'用戶管理',?'action',?'/managerUser',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('authority_mgr',?'authority_mgr',?'權限管理',?'action',?'/managerAuthority',?null,?1,?0,?null);??
  • insert?into?SYS_RESOURCES?(RESOURCE_ID,?RESOURCE_NAME,?RESOURCE_DESC,?RESOURCE_TYPE,?RESOURCE_STRING,?PRIORITY,?ENABLED,?ISSYS,?MODULE)??
  • values?('role_mgr',?'role_mgr',?'角色管理',?'action',?'/managerRole',?null,?null,?null,?null);??
  • commit;??
  • prompt?12?records?loaded??
  • prompt?Loading?SYS_AUTHORITIES_RESOURCES??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(1,?'AUTH_AFTERLOGINWELCOME5',?'index5',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(2,?'AUTH_LOGIN4',?'login4',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(3,?'AUTH_NODE_MGR3',?'node_mgr3',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(4,?'AUTH_XTSZ_DEPT1',?'dep_mgr1',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(5,?'AUTH_XTSZ_USER2',?'user_mgr2',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(7,?'AUTH_XTSZ_USER2',?'horizontal_qry6',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(8,?'AUTH_XTSZ_DEPT1',?'vertical_qry7',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(12,?'AUTH_XTSZ_USER2',?'role_mgr',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(10,?'AUTH_XTSZ_USER2',?'resources_mgr',?1);??
  • insert?into?SYS_AUTHORITIES_RESOURCES?(ID,?AUTHORITY_ID,?RESOURCE_ID,?ENABLED)??
  • values?(11,?'AUTH_XTSZ_USER2',?'authority_mgr',?1);??
  • commit;??
  • prompt?10?records?loaded??
  • prompt?Loading?SYS_ROLES??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('1303463518765',?'ROLE_dd1',?'dd1',?1,?0,?'01');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('1303463949640',?'ROLE_rr1',?'rr1',?1,?0,?'02');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_PLATFORMADMIN1',?'ROLE_PLATFORMADMIN',?'可管理整個平臺的用戶、單位設置。',?1,?1,?'01');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_USER2',?'ROLE_USER',?'普通用戶',?1,?0,?'01');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_LOGINTOWELCOME4',?'ROLE_LOGINTOWELCOME',?'僅登錄到歡迎界面!',?1,?0,?'01');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_SYSADMIN3',?'ROLE_SYSADMIN',?'可管理本系統的用戶、單位設置。',?1,?0,?'01');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_WORK',?'ROLE_WORK',?'作業子系統的角色(試驗)',?1,?0,?'02');??
  • insert?into?SYS_ROLES?(ROLE_ID,?ROLE_NAME,?ROLE_DESC,?ENABLED,?ISSYS,?MODULE)??
  • values?('ROLE_LOGIN',?'ROLE_LOGIN',?'系統登錄',?1,?0,?'01');??
  • commit;??
  • prompt?8?records?loaded??
  • prompt?Loading?SYS_ROLES_AUTHORITIES??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1,?'ROLE_LOGINTOWELCOME4',?'AUTH_AFTERLOGINWELCOME5',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(2,?'ROLE_PLATFORMADMIN1',?'AUTH_AFTERLOGINWELCOME5',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(3,?'ROLE_PLATFORMADMIN1',?'AUTH_LOGIN4',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(4,?'ROLE_PLATFORMADMIN1',?'AUTH_NODE_MGR3',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(5,?'ROLE_PLATFORMADMIN1',?'AUTH_XTSZ_DEPT1',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(6,?'ROLE_PLATFORMADMIN1',?'AUTH_XTSZ_USER2',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(7,?'ROLE_SYSADMIN3',?'AUTH_XTSZ_DEPT1',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(8,?'ROLE_SYSADMIN3',?'AUTH_XTSZ_USER2',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(9,?'ROLE_USER2',?'AUTH_LOGIN4',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(10,?'ROLE_LOGINTOWELCOME4',?'AUTH_LOGIN4',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(11,?'ROLE_USER2',?'AUTH_AFTERLOGINWELCOME5',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463962718,?'1303463949640',?'AUTH_LOGIN4',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463972234,?'ROLE_WORK',?'AUTH_LOGIN4',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463972235,?'ROLE_WORK',?'AUTH_AFTERLOGINWELCOME5',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463972250,?'ROLE_WORK',?'AUTH_XTSZ_DEPT1',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463972251,?'ROLE_WORK',?'AUTH_XTSZ_USER2',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303463972265,?'ROLE_WORK',?'AUTH_NODE_MGR3',?1);??
  • insert?into?SYS_ROLES_AUTHORITIES?(ID,?ROLE_ID,?AUTHORITY_ID,?ENABLED)??
  • values?(1303287600015,?'ROLE_LOGIN',?'AUTH_LOGIN4',?1);??
  • commit;??
  • prompt?18?records?loaded??
  • prompt?Loading?SYS_USERS??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304494573750',?'lxb',?'lxb',?'c7d3f4c857bc8c145d6e5d40c1bf23d9',?null,?1,?0,?'10011001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304490737406',?'lxb',?'lxb',?'c7d3f4c857bc8c145d6e5d40c1bf23d9',?null,?1,?0,?'10011001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304574079546',?'ddd',?'ddd',?'0a4f6a961276619f7f91356bcba5a746',?null,?0,?0,?null,?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304573363921',?'lxb',?'盧小兵',?'09eb37d219cfa835db40e5ab587f7082',?'普通僅登錄到歡迎界面!',?0,?0,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304573484515',?'lll',?'lll',?'47acedc22cef8c3762c21a435e262d67',?null,?1,?0,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('admin1',?'admin',?'系統管理員',?'ceb4f32325eda6142bd65215f4c0f371',?'超級系統管理員',?1,?1,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('user2',?'user',?'普通用戶',?'47a733d60998c719cf3526ae7d106d13',?'普通用戶',?1,?0,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('sysUser3',?'sysUser',?'系統設置維護',?'8f0295328c34f8eedc2362e9f4a10b7e',?'系統設置用戶',?1,?0,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('lxb4',?'lxb',?'盧小兵',?'c7d3f4c857bc8c145d6e5d40c1bf23d9',?'普通僅登錄到歡迎界面!',?1,?0,?'1001',?null,?'01');??
  • insert?into?SYS_USERS?(USER_ID,?USER_ACCOUNT,?USER_NAME,?USER_PASSWORD,?USER_DESC,?ENABLED,?ISSYS,?USER_DEPT,?USER_DUTY,?SUB_SYSTEM)??
  • values?('1304566319625',?'lxb5',?'lx5',?'1abe40ed6d0da1c834586e8ecef61fe7',?null,?0,?0,?'10011001',?null,?'01');??
  • commit;??
  • prompt?10?records?loaded??
  • prompt?Loading?SYS_USERS_ROLES??
  • insert?into?SYS_USERS_ROLES?(ID,?USER_ID,?ROLE_ID,?ENABLED)??
  • values?(1,?'admin1',?'ROLE_PLATFORMADMIN1',?1);??
  • insert?into?SYS_USERS_ROLES?(ID,?USER_ID,?ROLE_ID,?ENABLED)??
  • values?(2,?'sysUser3',?'ROLE_SYSADMIN3',?1);??
  • insert?into?SYS_USERS_ROLES?(ID,?USER_ID,?ROLE_ID,?ENABLED)??
  • values?(3,?'user2',?'ROLE_USER2',?1);??
  • insert?into?SYS_USERS_ROLES?(ID,?USER_ID,?ROLE_ID,?ENABLED)??
  • values?(4,?'lxb4',?'ROLE_LOGINTOWELCOME4',?1);??
  • insert?into?SYS_USERS_ROLES?(ID,?USER_ID,?ROLE_ID,?ENABLED)??
  • values?(5,?'1304573484515',?'1303463518765',?null);??
  • commit;??
  • prompt?5?records?loaded??
  • prompt?Enabling?foreign?key?constraints?for?SYS_AUTHORITIES_RESOURCES??
  • alter?table?SYS_AUTHORITIES_RESOURCES?enable?constraint?FK_PUB_AUTHORITIES_RE_AU;??
  • alter?table?SYS_AUTHORITIES_RESOURCES?enable?constraint?FK_PUB_AUTHORITIES_RE_RE;??
  • prompt?Enabling?foreign?key?constraints?for?SYS_ROLES_AUTHORITIES??
  • alter?table?SYS_ROLES_AUTHORITIES?enable?constraint?FK_PUB_ROLES_AUTHORITIES_AU;??
  • alter?table?SYS_ROLES_AUTHORITIES?enable?constraint?FK_PUB_ROLES_AUTHORITIES_ROLES;??
  • prompt?Enabling?foreign?key?constraints?for?SYS_USERS_ROLES??
  • alter?table?SYS_USERS_ROLES?enable?constraint?FK_USERS_ROLES_ROLES;??
  • alter?table?SYS_USERS_ROLES?enable?constraint?FK_USERS_ROLES_USERS;??
  • prompt?Enabling?triggers?for?SYS_AUTHORITIES??
  • alter?table?SYS_AUTHORITIES?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_RESOURCES??
  • alter?table?SYS_RESOURCES?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_AUTHORITIES_RESOURCES??
  • alter?table?SYS_AUTHORITIES_RESOURCES?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_ROLES??
  • alter?table?SYS_ROLES?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_ROLES_AUTHORITIES??
  • alter?table?SYS_ROLES_AUTHORITIES?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_USERS??
  • alter?table?SYS_USERS?enable?all?triggers;??
  • prompt?Enabling?triggers?for?SYS_USERS_ROLES??
  • alter?table?SYS_USERS_ROLES?enable?all?triggers;??
  • set?feedback?on??
  • set?define?on??
  • prompt?Done.??
  • ?

    相關配置文件:

    web.xml與第一種方法同。

    applicationContext-security.xml:

    [html] view plaincopy
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • ??
  • <b:beans?xmlns="http://www.springframework.org/schema/security"??
  • ?xmlns:b="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.0.xsd">??
  • ??
  • ??
  • ?<http?auto-config="true"?access-denied-page="/accessDenied.jsp">??
  • ??<!--?不要過濾圖片等靜態資源?-->??
  • ??<intercept-url?pattern="/**/*.jpg"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.png"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.gif"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.css"?filters="none"?/>??
  • ??<intercept-url?pattern="/**/*.js"?filters="none"?/>??
  • ??<!--?登錄頁面和忘記密碼頁面不過濾??-->??
  • ??<intercept-url?pattern="/login.jsp"?filters="none"?/>??
  • ??<intercept-url?pattern="/jsp/forgotpassword.jsp"??
  • ???filters="none"?/>????
  • ????
  • ??<form-login?login-page="/login.jsp"??
  • ???authentication-failure-url="/login.jsp?error=true"??
  • ???default-target-url="/index.jsp"?/>??
  • ??
  • ??<!--?"記住我"功能,采用持久化策略(將用戶的登錄信息存放在數據庫表中)?-->??
  • ??<remember-me?data-source-ref="dataSource"?/>??
  • ????
  • ??<!--?檢測失效的sessionId,超時時定位到另外一個URL?-->??
  • ??<session-management?invalid-session-url="/sessionTimeout.jsp"?/>??
  • ????
  • ????
  • ??<!--?增加一個自定義的filter,放在FILTER_SECURITY_INTERCEPTOR之前,??
  • ??實現用戶、角色、權限、資源的數據庫管理。??-->??
  • ??<custom-filter?ref="myFilter"?before="FILTER_SECURITY_INTERCEPTOR"/>???
  • ????
  • ????
  • ?</http>??
  • ???
  • ???
  • ?<!--?一個自定義的filter,必須包含authenticationManager,??
  • ??accessDecisionManager,securityMetadataSource三個屬性。??-->??
  • ?<b:bean?id="myFilter"???
  • ??class="avatar.base.security.MyFilterSecurityInterceptor">??
  • ??<b:property?name="authenticationManager"???
  • ???ref="authenticationManager"/>??
  • ??<b:property?name="accessDecisionManager"???
  • ???ref="myAccessDecisionManager"/>??
  • ??<b:property?name="securityMetadataSource"???
  • ???ref="mySecurityMetadataSource"/>??
  • ?</b:bean>??
  • ???
  • ???
  • ??
  • ?<!--?注意能夠為authentication-manager?設置alias別名??-->??
  • ?<authentication-manager?alias="authenticationManager">??
  • ??<authentication-provider?user-service-ref="userDetailsManager">??
  • ???<password-encoder?ref="passwordEncoder">??
  • ????<salt-source?user-property="username"?/>??
  • ???</password-encoder>??
  • ??</authentication-provider>??
  • ?</authentication-manager>??
  • ??
  • ??
  • ?<!--?訪問決策器,決定某個用戶具有的角色,是否有足夠的權限去訪問某個資源。?-->??
  • ?<b:bean?id="myAccessDecisionManager"??
  • ??class="avatar.base.security.MyAccessDecisionManager">??
  • ?</b:bean>????
  • ??
  • ??
  • ?<!--?資源源數據定義,將所有的資源和權限對應關系建立起來,即定義某一資源可以被哪些角色去訪問。?-->??
  • ?<b:bean?id="mySecurityMetadataSource"??
  • ??class="avatar.base.security.MyInvocationSecurityMetadataSourceService">??
  • ?</b:bean>???
  • ??
  • </b:beans>??
  • ??
  • applicationContext-service.xml:??
  • ??
  • ???
  • ??
  • <?xml?version="1.0"?encoding="UTF-8"?>??
  • ??
  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"???
  • ?xmlns:util="http://www.springframework.org/schema/util"??
  • ?xmlns:jee="http://www.springframework.org/schema/jee"???
  • ?xmlns:aop="http://www.springframework.org/schema/aop"??
  • ?xmlns:tx="http://www.springframework.org/schema/tx"???
  • ?xmlns:context="http://www.springframework.org/schema/context"??
  • ?xsi:schemaLocation="http://www.springframework.org/schema/beans??
  • ?http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
  • ???http://www.springframework.org/schema/aop???
  • ???http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  • ???http://www.springframework.org/schema/tx??
  • ???http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
  • ???http://www.springframework.org/schema/jee??
  • ???http://www.springframework.org/schema/jee/spring-jee-3.0.xsd??
  • ???http://www.springframework.org/schema/context??
  • ???http://www.springframework.org/schema/context/spring-context-3.0.xsd??
  • ???http://www.springframework.org/schema/util???
  • ???http://www.springframework.org/schema/util/spring-util-3.0.xsd">??
  • ??
  • ???
  • ?<!--?定義上下文返回的消息的國際化。?-->??
  • ?<bean?id="messageSource"??
  • ??class="org.springframework.context.support.ReloadableResourceBundleMessageSource">??
  • ??<property?name="basename"??
  • ???value="classpath:org/springframework/security/messages_zh_CN"/>??
  • ?</bean>??
  • ??
  • ?<!--??
  • ??事件監聽:實現了?ApplicationListener監聽接口,??
  • ??包括AuthenticationCredentialsNotFoundEvent?事件,??
  • ??AuthorizationFailureEvent事件,AuthorizedEvent事件,?PublicInvocationEvent事??
  • ??件。?-->??
  • ?<bean??
  • ??class="org.springframework.security.authentication.event.LoggerListener"?/>??
  • ??
  • ?<!--?用戶的密碼加密或解密?-->??
  • ?<bean?id="passwordEncoder"??
  • ??class="org.springframework.security.authentication.encoding.Md5PasswordEncoder"?/>??
  • ??
  • ?????
  • ?<!--?用戶詳細信息管理:數據源、用戶緩存(通過數據庫管理用戶、角色、權限、資源)。?-->??
  • ?<bean?id="userDetailsManager"?class="avatar.base.security.MyUserDetailsService">??
  • ??<property?name="pubUsersHome"?ref="pubUsersHome"?/>??
  • ??<property?name="pubAuthoritiesResourcesHome"?ref="pubAuthoritiesResourcesHome"?/>??
  • ??<property?name="dataSource"?ref="dataSource"?/>??
  • ??<property?name="userCache"?ref="userCache"?/>??
  • ?</bean>????
  • ???
  • ?<!--?啟用用戶的緩存功能?-->??
  • ?<bean?id="userCache"??
  • ??class="org.springframework.security.core.userdetails.cache.EhCacheBasedUserCache">??
  • ??<property?name="cache"?ref="userEhCache"?/>??
  • ?</bean>??
  • ???
  • ?<bean?id="userEhCache"?class="org.springframework.cache.ehcache.EhCacheFactoryBean">??
  • ??<property?name="cacheName"?value="userCache"?/>??
  • ??<property?name="cacheManager"?ref="cacheManager"?/>??
  • ?</bean>??
  • ???
  • ?<bean?id="cacheManager"??
  • ??class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"?/>??
  • ??
  • ??
  • ?<!--?spring?security自帶的與權限有關的數據讀寫Jdbc模板?-->??
  • ?<bean?id="jdbcTemplate"?class="org.springframework.jdbc.core.JdbcTemplate">??
  • ??<property?name="dataSource"?ref="dataSource"?/>??
  • ?</bean>??
  • ??
  • </beans>??
  • ?

    第三種方法擴展后Spring Security3.0.2的驗證和授權方法

    ????為了敘述的嚴謹性,這里說的是Spring Security3.0.2,而非其他版本,這是因為我只讀過Spring Security3.0.2的代碼,并且在該版本上面擴展自定義的
    動態管理用戶、角色、權限和資源成功。 估計其他版本的驗證和授權方法是差不太多的,因為沒有接觸過,也不敢大膽猜測。

    ????在擴展后的Spring Security3.0.2中,驗證及授權的過程如下:
    ????1、當Web服務器啟動時,通過Web.xml中對于Spring Security的配置,加載過濾器鏈,那么在加載MyFilterSecurityInterceptor類時,會注入 MyInvocationSecurityMetadataSourceService、MyUserDetailsService、 MyAccessDecisionManager類。

    ????2、該MyInvocationSecurityMetadataSourceService類在執行時會提取數據庫中所有的用戶權限,形成權限列表;
    并循環該權限列表,通過每個權限再從數據庫中提取出該權限所對應的資源列表,并將資源(URL)作為key,權限列表作為value,形成Map結構的數據。

    ????3、當用戶登錄時,AuthenticationManager進行響應,通過用戶輸入的用戶名和密碼,然后再根據用戶定義的密碼算法和鹽值等進行計算并和數據庫比對,
    當正確時通過驗證。此時MyUserDetailsService進行響應,根據用戶名從數據庫中提取該用戶的權限列表,組合成UserDetails供Spring Security使用。

    ????4、當用戶點擊某個功能時,觸發MyAccessDecisionManager類,該類通過decide方法對用戶的資源訪問進行攔截。
    用戶點擊某個功能時,實際上是請求某個URL或Action, 無論.jsp也好,.action或.do也好,在請求時無一例外的表現為URL。
    還記得第2步時那個Map結構的數據嗎? 若用戶點擊了"login.action"這個URL之后,那么這個URL就跟那個Map結構的數據中的key對比,若兩者相同,
    則根據該url提取出Map結構的數據中的value來,這說明:若要請求這個URL,必須具有跟這個URL相對應的權限值。這個權限有可能是一個單獨的權限,
    也有可能是一個權限列表,也就是說,一個URL有可能被多種權限訪問。

    ????那好,我們在MyAccessDecisionManager類的decide這個方法里,將通過URL取得的權限列表進行循環,然后跟第 3步中登錄的用戶所具有的權限進行比對,若相同,則表明該用戶具有訪問該資源的權利。 不大明白吧?? 簡單地說, 在數據庫中我們定義了訪問“LOGIN”這個URL必須是具有ROLE_ADMIN權限的人來訪問,那么,登錄用戶恰恰具有該ROLE_ADMIN權限, 兩者的比對過程中,就能夠返回TRUE,可以允許該用戶進行訪問。就這么簡單!

    ????不過在第2步的時候,一定要注意,MyInvocationSecurityMetadataSoruceService類的loadResourceDefine()方法中,形成以URL為key,權限列表為value的Map時,
    要注意key和Value的對應性,避免Value的不正確對應形成重復,這樣會導致沒有權限的人也能訪問到不該訪問到的資源。
    還有getAttributes()方法,要有 url.indexOf("?")這樣的判斷,要通過判斷對URL特別是Action問號之前的部分進行匹配,防止用戶請求的帶參數的URL與你數據庫中定義的URL不匹配,造成訪問拒絕!

    ?

    第三種方法BTW

    ????當然,你在設計了7張表之后,那么對于這些之間相互關聯的關系內容及信息內容,就得由你來進行維護了,大約有用戶、角色、權限、資源的增刪 改查,并還需要設置用戶和角色、角色和權限、權限和資源之間的關系。可考慮分為三個菜單進行維護,用戶設置、角色設置、資源設置。 在用戶設置里分別管理用戶、用戶與角色的關系;在角色設置里管理角色、角色與權限的關系; 在資源設置里分別管理權限、權限與資源的關系等。


    第四種方法

    ????第四種方法就是直接修改源碼以達到第三種方法的效果。

    ????本來準備是直接從源碼修改來的, 但是始終認為修改源碼并非終極解決之道,有違OO的精神本質,再者由于時間關系,只是對代碼進行了研究,但并沒有進行實現或驗證。只待以后時間稍稍寬松時 再做為興趣進行研究,在次不過多的講解。但據我從代碼上來看,一是將從配置文件中獲取用戶及權限的功能修改為從數據庫中提取出來;二是將從配置文件中獲取 權限和資源的對應關系修改為從數據庫中提取;三是修改User增加相關信息等。

    ????始終還是圍繞著JdbcDaoImpl和DefaultFilterInvocationSecurityMetadataSource還有User這3個類進行修改。
    以實現從數據庫提取用戶、角色、權限和資源信息。

    ????有興趣的就先試試吧,等試好了告訴我一聲哈。

    Spring Security的優缺點

    ????不可否認,Spring Security依賴于Spring的Ioc、AOP等機制,橫切開系統的業務組件,將通用的權限功能注入到業務組件內部,實現了通用功能和業務功能的無 縫整合,但又保證了通用功能和業務功能的實現上的分離,省卻了一部分工作量,這是其存在的最重要意義。

    ????但又不可否認,Spring Security所具有的缺乏動態資源管理的硬傷(若是能夠提供用戶、角色、權限和資源的數據庫管理,并且提供管理界面那實在是太完美了,可惜這兩樣一樣都不能實現),又令國人用戶愛恨交加。

    ????該何去何從,就請自己做個選擇吧!

    轉載于:https://www.cnblogs.com/lykxqhh/p/5731501.html

    總結

    以上是生活随笔為你收集整理的使用Spring Security3的四种方法概述的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产韩国精品一区二区三区 | 五月天亚洲激情 | 黄色大全在线观看 | 久久精品中文字幕一区二区三区 | 国产精品色视频 | 香蕉久久久久久久 | 亚洲精品中文在线观看 | 免费能看的黄色片 | 在线观看完整版 | 国产精品久久一卡二卡 | 日本爽妇网| 96精品在线 | 日韩免费电影一区二区三区 | 亚洲精品视频在线观看免费视频 | 欧美日韩国产免费视频 | 免费观看全黄做爰大片国产 | 国产99在线免费 | 国产中文字幕av | 黄色毛片大全 | 精品99在线观看 | 一级大片在线观看 | av电影中文字幕在线观看 | 丁香婷婷色| 国产精品久久久久久久久久免费看 | 精品人人人人 | 97精品国产97久久久久久春色 | 欧美在线一二区 | av片免费播放 | 欧美日韩中文视频 | 免费看成人 | 成人av网站在线播放 | www.久久免费视频 | 毛片美女网站 | 久久久午夜剧场 | 天堂视频中文在线 | 国产精品久久久久久久久久不蜜月 | 毛片美女网站 | 亚洲电影成人 | 国产三级精品在线 | 91一区在线观看 | 日韩av一区二区在线播放 | 国产美女久久久 | 日韩一区二区在线免费观看 | 91在线免费视频 | 日韩精品免费一区 | 又黄又爽的视频在线观看网站 | 国产精品视频线看 | 午夜国产在线观看 | 国产婷婷vvvv激情久 | 深爱开心激情 | 亚洲一区久久久 | 91热这里只有精品 | 国产亚洲欧美一区 | 国产黄a三级 | 国产精品网红福利 | 五月天天色 | 丁香激情婷婷 | 黄色软件视频网站 | 激情五月五月婷婷 | a黄色片| 日韩最新中文字幕 | 91精品一区二区在线观看 | 91福利试看 | 美女黄频免费 | 91视频在线免费下载 | 日韩va欧美va亚洲va久久 | 国产对白av | 久久精品一区二区三 | 亚洲 成人 一区 | 色综合久久久 | 亚洲精品视频网 | 成人欧美一区二区三区在线观看 | 在线精品亚洲一区二区 | 久久久久99精品国产片 | 久久国产女人 | 国产精品久久一区二区三区不卡 | 国内揄拍国内精品 | 国产区在线 | 国产一级二级三级视频 | 午夜精品久久久久久久99热影院 | 日日爱影视 | 国产精品久久久久久久久久新婚 | 99r精品视频在线观看 | 99久久激情视频 | 一区二区三区四区免费视频 | 国产网红在线 | 中文日韩在线视频 | a级成人毛片 | 韩日成人av | 五月激情站 | 亚洲视频精品 | 欧美日韩国产区 | 亚洲精品国产电影 | 在线国产高清 | 国产精品久久9 | 中文字幕在线播放av | 天天做天天射 | 99视频导航| 奇米网在线观看 | 久久刺激视频 | 日本高清中文字幕有码在线 | 精品在线你懂的 | 国产精品亚洲片夜色在线 | 中文在线a√在线 | 国产成人不卡 | 18做爰免费视频网站 | 日韩三级成人 | 色香蕉在线 | 天天操狠狠操夜夜操 | 成人久久久久久久久久 | 国产成人精品久久 | 成人香蕉视频 | 91桃色在线免费观看 | 香蕉视频啪啪 | 国产久草在线 | 国产一区二区在线免费观看 | 久久综合国产伦精品免费 | 亚洲激情婷婷 | 99精品视频在线观看免费 | 国产a级片免费观看 | 五月天综合婷婷 | 亚洲精品在线视频网站 | 日韩成人av在线 | 在线观av | 六月色 | 五月婷婷在线观看视频 | 成人在线视频一区 | 免费看的av片 | 69国产盗摄一区二区三区五区 | 人人澡人 | 最新av在线网站 | 九月婷婷色| 激情五月六月婷婷 | 夜色资源站国产www在线视频 | 日韩精品视频在线免费观看 | 国产精品福利午夜在线观看 | 韩国av一区 | 国产黄色片一级三级 | 亚洲激情 在线 | 看片黄网站 | 亚洲欧洲av在线 | 国产一级视频在线免费观看 | 国产在线精品一区二区 | 韩国一区视频 | 青草视频在线免费 | 久久精品人人做人人综合老师 | 西西44人体做爰大胆视频 | 黄色小说视频在线 | 九九热1 | 天天视频色版 | 欧美另类色图 | 国产美女永久免费 | 911国产精品 | 国产精品手机在线播放 | 成人av免费电影 | 国产成人一区在线 | av天天干 | 国产精品99久久免费观看 | 黄色国产精品 | 亚洲国产片 | 99久久精 | 视频在线日韩 | 91中文字幕永久在线 | 九色porny真实丨国产18 | 五月丁色 | 精品爱爱 | 99久久精品免费看国产一区二区三区 | 日韩一区二区三区高清免费看看 | 免费福利片2019潦草影视午夜 | 亚洲国产精品视频 | 少妇bbw撒尿| 国产高清视频在线播放一区 | 久久久夜色 | 97超碰福利久久精品 | 日本性生活免费看 | 91久久精品一区二区二区 | 精品福利视频在线观看 | 超级碰碰碰碰 | 久久久黄色免费网站 | 国产成人精品一区二区在线 | 国产精品完整版 | www.五月天婷婷.com | 亚州欧美视频 | avsex| 日韩一级精品 | 欧美日韩视频一区二区 | 色婷婷在线播放 | 日韩高清无线码2023 | 一级黄色片在线免费看 | 国产精品av免费在线观看 | 亚洲综合成人专区片 | 久久久久久久久久国产精品 | 国产成人黄色 | 精品毛片久久久久久 | 天天操天天干天天摸 | 亚洲成人动漫在线观看 | 中文字幕电影一区 | 亚洲国产精品500在线观看 | 国产日韩欧美视频 | 亚洲高清国产视频 | 国产精品久久久久久久久久久久午夜片 | 免费看黄在线网站 | 91传媒免费观看 | 久久久久欠精品国产毛片国产毛生 | 精品国偷自产在线 | 高清视频一区二区三区 | av色网站 | 久久精品视频在线看 | 欧美a性 | 在线观看av免费 | 国产精品一区在线播放 | 国产一区高清在线观看 | 97免费 | 日本久久免费电影 | 日日夜日日干 | 三级av网站 | av 一区二区三区 | 国产精品爽爽久久久久久蜜臀 | 久久av在线 | 国产最新91| 91成人蝌蚪 | 久久久精品亚洲 | 国产免费a | 91麻豆精品国产91久久久久久久久 | 99这里只有久久精品视频 | 国产 亚洲 欧美 在线 | 一区二区不卡 | 国产视频每日更新 | 免费观看的av | 欧美天天综合网 | 午夜一级免费电影 | 91精品91| 97在线看 | 国内精品毛片 | 欧美精品久久久久久久久久白贞 | 久久精品国产免费看久久精品 | 国产亚洲在线视频 | 国产亚洲永久域名 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 久艹在线观看视频 | 亚洲激情婷婷 | 黄a网站 | 在线91av| 国产一区二区三区视频在线 | 射射色 | 欧美日韩伦理在线 | 香蕉网在线 | 国产在线观看免 | 久久久精品欧美 | 天天想夜夜操 | www夜夜操com | 一级黄色网址 | 最近2019好看的中文字幕免费 | 黄色小说免费观看 | 久久综合色播五月 | 少妇精69xxtheporn| 美女精品国产 | 国产69精品久久app免费版 | 五月婷香蕉久色在线看 | 欧美网址在线观看 | 在线观看免费 | 在线视频18在线视频4k | 最新日本中文字幕 | 午夜天使 | 粉嫩av一区二区三区四区五区 | 伊人色**天天综合婷婷 | 狠狠干夜夜| 中文字幕在线国产 | 国产精品成人一区二区三区吃奶 | 日韩高清毛片 | 黄色资源在线 | 国产小视频福利在线 | 国产一级视屏 | 国产手机视频在线播放 | 香蕉网在线观看 | 亚洲最大成人免费网站 | 一区国产精品 | 久久久久久久网站 | 国产日韩中文在线 | 日韩 在线| 91日韩在线 | 激情图片久久 | 国产高清不卡 | 亚洲日本va在线观看 | 伊人婷婷网 | 国产成人精品一区二区三区网站观看 | 国产成人一区在线 | 色噜噜狠狠狠狠色综合 | 狠狠黄 | 久草视频在线看 | 国产91免费在线观看 | 成人h动漫在线看 | 精品一区二区三区电影 | 日本中文字幕在线电影 | 精品国产一区二区三区四区在线观看 | 国产精品久久99综合免费观看尤物 | 综合网中文字幕 | 国产一级一级国产 | 射射色| 天天干天天草天天爽 | www.99久久.com | 九九综合九九 | 黄色网在线免费观看 | 操操操人人 | 亚洲日本成人网 | 一区二区影院 | 少妇bbbb搡bbbb桶| 久久久精品久久 | 亚洲国产精品久久久久 | 999久久久国产精品 高清av免费观看 | 视频国产在线观看18 | 亚洲一区 av | 射射射av| 中文字幕五区 | 在线电影日韩 | 久草视频在线免费 | 国产一级二级三级视频 | 成人毛片一区 | 青青草国产成人99久久 | 国产精品一区二区久久精品 | 成人国产精品一区二区 | 日韩在线视频播放 | 国产精品九九九九九 | 中文字幕在线免费观看 | 久久久久久久精 | 最近高清中文字幕 | www.天天射 | 国产精品久久久久久久久久久久 | 日韩中文字幕免费看 | 久久高清国产 | 欧美va天堂va视频va在线 | 九九涩涩av台湾日本热热 | 999久久国精品免费观看网站 | 国产成人在线观看免费 | 欧美色图视频一区 | 人人草在线视频 | av在线直接看 | 亚洲伦理中文字幕 | 免费久久久久久久 | 成人91在线观看 | av免费在线观看1 | 精品91视频| 国产精品久久久久久久久蜜臀 | 一区二区三区电影大全 | 91av在线免费播放 | 中文永久免费观看 | 日韩精品第1页 | 97成人在线观看视频 | 久久露脸国产精品 | 中文字幕在线看视频 | 波多野结衣视频一区二区 | 国产精品精品久久久久久 | 四虎成人精品 | 四虎国产永久在线精品 | 中文字幕丝袜 | 久久黄色免费视频 | 欧美在线99 | 亚洲欧美日韩精品久久久 | 日日干精品 | 精品久久久久久亚洲综合网 | 亚洲综合欧美激情 | 97超级碰碰| 天天操比 | 久草在线资源视频 | 欧美激情精品久久 | 少妇av网| 日韩av一区在线观看 | 最新av观看| 蜜臀91丨九色丨蝌蚪老版 | 不卡日韩av | 丁香久久婷婷 | 亚洲 综合 国产 精品 | 欧美日韩久久不卡 | 碰超在线观看 | 成年人免费电影 | 91污在线观看 | 国产成人精品一区二区在线 | 国产资源av | 蜜臀久久99精品久久久久久网站 | 91麻豆看国产在线紧急地址 | 久久线视频 | 免费看一级黄色 | 成人午夜网址 | 免费在线观看污网站 | 天天操综合网站 | 天堂av网址 | 成人a毛片| 久久久久久久久久久久亚洲 | 久久国产精品久久国产精品 | 国产网站色 | 久久久激情网 | 国产亚洲精品久久久久动 | 亚洲精品玖玖玖av在线看 | 最近日本韩国中文字幕 | 日韩在线视频精品 | 去干成人网| 草免费视频 | 永久精品视频 | 亚洲1区在线 | 91成人免费观看视频 | 500部大龄熟乱视频 欧美日本三级 | 久久久免费国产 | 99国产精品免费网站 | 日韩美女免费线视频 | 亚洲九九精品 | 免费a级黄色毛片 | 一区二区三区四区五区在线视频 | 深夜免费网站 | 国产高清日韩 | 午夜国产影院 | 中文字幕在线观看视频免费 | 日本中文字幕观看 | 亚洲色图色 | 91天堂在线观看 | 久久国产精品99久久人人澡 | 亚洲人在线7777777精品 | 欧美精品久久久 | 天天曰 | 9992tv成人免费看片 | 五月天婷婷在线播放 | 六月丁香婷婷在线 | 99r国产精品| 99久久精品免费看 | 国产一级片直播 | 国产成人精品一区二区 | 又黄又爽又刺激视频 | 久久久99精品免费观看app | 成年在线观看 | 超碰免费在线公开 | 亚洲更新最快 | 精品一区二区亚洲 | 久久精品人人做人人综合老师 | 欧美日韩亚洲在线 | 国产裸体视频网站 | 国产精品99久久久久久久久 | 91大神精品视频 | 成人四虎影院 | 久久精品99国产精品 | 西西444www大胆高清图片 | 蜜臀av夜夜澡人人爽人人桃色 | 亚洲免费观看视频 | 97在线观看免费 | 欧美一级在线观看视频 | 黄色av影视| 天天激情站 | 天天曰天天曰 | 精品你懂的| 国产成人精品三级 | 色吊丝在线永久观看最新版本 | 天天干天天干天天 | 韩日视频在线 | 亚洲美女久久 | 91欧美国产 | 亚洲欧洲成人 | 天堂中文在线视频 | 又黄又爽又刺激的视频 | 国产91免费观看 | 九九在线视频免费观看 | 人人草人人草 | 精品国产网址 | 99久久久国产精品美女 | 国产午夜精品理论片在线 | 精品国产乱码久久久久久1区二区 | 少妇搡bbbb搡bbb搡69 | 黄色www免费 | 国产无套一区二区三区久久 | 一区二区不卡在线观看 | 久草视频视频在线播放 | 91麻豆精品国产自产在线游戏 | 狠狠干狠狠色 | 九色琪琪久久综合网天天 | 精品欧美一区二区精品久久 | 国产96在线观看 | 国产中年夫妇高潮精品视频 | 国产香蕉在线 | 国产精品一区二区在线观看免费 | 国产精品久久久久国产精品日日 | 在线网站黄 | 亚洲国产久 | 色综合夜色一区 | www.夜夜 | 国产精品不卡av | 免费高清影视 | 中国一级片在线播放 | 久久久免费看视频 | 中国精品少妇 | 天天操天天操天天操天天操天天操 | 亚洲人成免费 | 亚洲精品66 | 日韩免费网站 | 国产成人av免费在线观看 | 免费在线观看一区 | 久久久在线免费观看 | 久久综合影视 | 黄色影院在线播放 | 日韩精品久久久久久久电影99爱 | 中文字幕日本在线 | 久久久久久久久网站 | 四虎国产精品免费 | 激情开心网站 | 天天操天天干天天玩 | 在线精品在线 | 欧美黄色软件 | 精品视频 | 免费毛片一区二区三区久久久 | 首页中文字幕 | 久草亚洲视频 | 成年人在线看视频 | 精品久久一区二区 | 欧美一级视频一区 | 99久久久国产精品免费99 | 中文字幕欲求不满 | 九九爱免费视频在线观看 | 日韩免费观看视频 | 在线观看免费成人 | 欧美日韩久久不卡 | 日韩簧片在线观看 | 午夜精品在线看 | 国产超碰在线观看 | 国产精品人成电影在线观看 | av免费网站 | 成人三级视频 | 在线观看视频日韩 | 日日夜日日干 | 久久国产精品99国产 | 91在线视频免费观看 | 国精产品满18岁在线 | 99久久久久久久久久 | 久久久久久国产精品 | 免费看片黄色 | 国产一级片免费播放 | 久久伊人热 | 9ⅰ精品久久久久久久久中文字幕 | 香蕉视频4aa| 天天做天天爱天天爽综合网 | 久久久免费观看完整版 | 91免费网站在线观看 | 成年人av在线播放 | 九九免费在线观看视频 | 欧洲激情在线 | 国产精品成人免费一区久久羞羞 | 日本精品在线 | 日韩电影一区二区三区在线观看 | 久久国产二区 | 亚洲精品456在线播放第一页 | 色综合久久久久久久 | 成人一区二区在线观看 | av国产在线观看 | 99re视频在线观看 | 人人干网 | 99精品一区二区 | 91丨九色丨国产在线 | 国产又粗又长又硬免费视频 | 久久久国产精品电影 | 在线国产高清 | 久久久久久久久亚洲精品 | 五月天激情综合 | 亚洲免费在线 | 国产小视频在线免费观看视频 | 成人av资源 | 亚洲专区视频在线观看 | www.天天色 | 天海翼一区二区三区免费 | 成人香蕉视频 | 视频在线国产 | 国产精品一区在线播放 | 91看片在线观看 | 日韩一区二区免费视频 | 日本电影黄色 | 91高清在线看 | 国产a国产| 欧美欧美 | 毛片3 | 久草视频免费在线观看 | 国产精品一区二区三区免费视频 | 亚洲精品欧美视频 | 看片一区二区三区 | 天天射,天天干 | 久久免费国产视频 | 亚洲精品视频观看 | 在线天堂亚洲 | 国产不卡在线观看视频 | 91综合久久一区二区 | 国产亚洲字幕 | 精品国产精品国产偷麻豆 | 99久久精品久久久久久清纯 | 四虎影视精品永久在线观看 | 粉嫩av一区二区三区入口 | 91理论片午午伦夜理片久久 | 国产在线高清视频 | 五月天丁香亚洲 | 香蕉手机在线 | 黄色大片视频网站 | 日韩一二三区不卡 | 日本xxxx裸体xxxx17 | 狠狠干天天色 | 国产精品h在线观看 | 九九视频在线播放 | 国产美女免费看 | 色 免费观看| av久久在线| jizzjizzjizz亚洲 | 日日干激情五月 | 久久99国产综合精品免费 | 亚洲成人xxx | 精品国产一区二区三区在线 | 久久精品视频网址 | bayu135国产精品视频 | 国产中文字幕久久 | 91久久精品一区二区三区 | 国产亚洲成av人片在线观看桃 | 精品视频不卡 | 婷婷五情天综123 | 日韩免费精品 | 免费在线观看国产精品 | 在线成人免费 | 黄色大片av| 免费的黄色av | 国产精品视频地址 | 午夜久久成人 | 91精品视频在线观看免费 | 色婷婷激婷婷情综天天 | 国产精品一区二区在线播放 | 亚洲欧美日韩精品一区二区 | 亚洲va欧洲va国产va不卡 | 日韩综合在线观看 | 最新超碰在线 | 亚洲精品字幕在线观看 | 中文在线免费视频 | 亚洲三级网 | 久久精品亚洲综合专区 | 国产成人黄色在线 | 久久久影视 | 91视频a| 国产高清在线看 | 欧美一区二区三区在线看 | 亚洲综合成人婷婷小说 | 亚洲视频免费 | 久久久免费 | 午夜视频在线观看欧美 | av免费网| 亚洲欧洲精品视频 | 国内精品久久久久久久久久清纯 | 国产高清在线免费 | 久久久精品欧美 | 五月婷丁香 | 国产精品丝袜久久久久久久不卡 | 国产精品视频久久久 | 手机看片中文字幕 | 中文字幕电影高清在线观看 | 综合天堂av久久久久久久 | 日韩激情视频在线观看 | 337p日本欧洲亚洲大胆裸体艺术 | 欧美日韩免费视频 | 色婷婷在线视频 | 久草a在线| 日韩视频在线一区 | 九九欧美| 日韩激情在线视频 | 特级毛片在线免费观看 | 国产成人三级一区二区在线观看一 | 黄色av电影| 一级性视频 | 欧美日韩后 | 久久精品久久综合 | 婷婷午夜 | 国产精品丝袜 | 最近中文字幕完整视频高清1 | 午夜精品视频一区二区三区在线看 | 99久久婷婷国产 | 久久99精品波多结衣一区 | 日本动漫做毛片一区二区 | 黄色国产高清 | 国产亚洲欧美日韩高清 | 国产一区私人高清影院 | 国内精品小视频 | 91黄色成人| 成人中心免费视频 | 男女日麻批 | 中文字幕第一 | 91爱爱电影| 免费在线激情电影 | 欧美日韩国产一区二区在线观看 | 久久免费a | 国产麻豆精品久久一二三 | 夜夜嗨av色一区二区不卡 | 日本韩国中文字幕 | 开心激情综合网 | 久久区二区 | 激情综合六月 | 久久国产精品一区二区三区 | 国产一区在线免费观看 | 亚洲aⅴ乱码精品成人区 | 婷婷伊人综合 | 九九热精品视频在线观看 | 视频在线观看91 | 九九九电影免费看 | 欧美色888| 欧美精品一区二区三区一线天视频 | 亚洲视频在线免费看 | 日韩簧片在线观看 | 日韩成片 | 特黄色大片 | 成人毛片网 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲日本三级 | 中文字幕免费观看 | 一区二区观看 | 午夜视频在线观看网站 | 能在线观看的日韩av | 亚洲精品乱码久久久久久高潮 | 五月激情丁香图片 | 国产精品美女免费看 | 99免费在线视频 | 婷婷深爱五月 | 色99网| 国产精品毛片一区 | 国产麻豆视频网站 | 99 色| 天天干天天干天天色 | 日韩资源在线播放 | 2023天天干 | 美女网站视频免费黄 | 国产精品2018 | 欧美日韩久久久 | av成人免费在线观看 | 在线观看视频精品 | 亚洲丁香日韩 | 国产成人精品一区二区三区福利 | 在线观看色视频 | 久久兔费看a级 | 97在线观看免费 | 99免费精品视频 | 狠狠做深爱婷婷综合一区 | 中文av在线播放 | 日韩影视在线观看 | 亚洲激情在线观看 | 中文字幕在线观看资源 | av怡红院| 日韩视频1 | 免费看黄网站在线 | 欧美午夜寂寞影院 | 亚洲女在线| 日韩a级黄色片 | 欧美日一级片 | 欧美另类亚洲 | 亚洲另类xxxx | 97电影院网 | 免费av一级电影 | 91在线中文 | 99热这里只有精品在线观看 | 五月开心网 | 久久精品国产亚洲a | 国产亚洲婷婷免费 | 色多多视频在线观看 | 欧美韩国日本在线观看 | 色综合天天狠天天透天天伊人 | 九九视频网 | 国产资源av| 国产成人黄色网址 | 天天躁日日躁狠狠躁av中文 | 成人久久18免费 | 久久男人影院 | 中文字幕av在线 | 久久91久久久久麻豆精品 | 97视频在线观看成人 | 国产高清免费 | 国产精品一区二区三区久久 | 久久综合狠狠综合 | 国产中文字幕视频在线观看 | 欧美孕妇视频 | 特级西西人体444是什么意思 | 国产成人一区二区三区电影 | 国产亚洲精品久久久久久大师 | 国产高清不卡一区二区三区 | 天天综合网久久 | 88av网站| 久久久久伊人 | 91精彩在线视频 | 精品一区二区三区香蕉蜜桃 | www.888av| 国产精品18久久久久vr手机版特色 | 黄色三级在线看 | 国产免费观看久久黄 | 在线久久| 国产日韩欧美精品在线观看 | 国产一区在线观看免费 | 日韩免费视频一区二区 | a久久免费视频 | 国产一区在线精品 | 国产日韩av在线 | 国产手机视频 | 色综合久久中文字幕综合网 | 欧美一级片免费播放 | 狠狠色狠狠色合久久伊人 | 久久超碰97 | 国产午夜麻豆影院在线观看 | 狠狠五月天 | 欧美伊人网 | 亚洲无人区小视频 | 中文乱幕日产无线码1区 | 男女男视频 | 国产99视频在线观看 | 91在线国产观看 | 性色在线视频 | 看毛片的网址 | 精品亚洲免费 | 日韩理论片在线 | 欧美日韩国产色综合一二三四 | 中文字幕传媒 | 超碰在线最新 | 国产三级视频 | 91精品资源 | 久久精品免费电影 | 久草视频在线免费看 | 国产高清av免费在线观看 | 九色视频自拍 | 亚洲欧洲中文日韩久久av乱码 | a v在线视频 | 91成人破解版 | 亚洲精品视频在线观看免费视频 | 91爱在线| 欧美91精品久久久久国产性生爱 | 精品久久久久国产 | 在线观看中文av | 97视频在线观看网址 | 国产精品美女久久久久久2018 | aaaaaa毛片| 国产免费又爽又刺激在线观看 | 亚洲欧美综合 | 久久精品高清 | 天天操天天玩 | 国产a免费 | www.国产在线观看 | 五月天综合婷婷 | 天天干天天玩天天操 | 亚洲精品美女久久 | 国产亚洲视频在线 | 夜夜躁狠狠躁日日躁视频黑人 | 亚洲 综合 激情 | 国产私拍在线 | 日日爽天天爽 | 色婷婷狠狠五月综合天色拍 | 日韩精品一区二区三区丰满 | 久久草在线视频国产 | av线上看 | 99久久精品国产观看 | 好看的国产精品视频 | 久久免费精品一区二区三区 | 国产精品久久二区 | av观看免费在线 | 在线观看视频免费大全 | 国产v在线观看 | 麻豆视传媒官网免费观看 | 免费av小说 | 玖玖爱在线观看 | 99久久精品国产观看 | 国产精品久久久久久高潮 | 91麻豆高清视频 | 国产亚洲精品久久久久久大师 | 亚洲高清91| 成人h视频在线播放 | 欧美日韩国产色综合一二三四 | 亚洲成人xxx | 韩日视频在线 | 国产精品密入口果冻 | 国产成人精品久久亚洲高清不卡 | 日韩精品免费在线播放 | 久久久久久不卡 | 伊人电影天堂 | 久久黄色美女 | 日韩在线电影一区二区 | 91成人国产 | 亚洲精品国产精品国自产在线 | 国产精品色在线 | 久久精视频 | 亚洲精品视频在线观看免费视频 | 在线综合色| 久久视频在线 | 国产精品一区二区在线免费观看 | 精品久久国产精品 | 久久免费视频4 | 亚洲高清视频一区二区三区 | 国产成人精品女人久久久 | 精品国产综合区久久久久久 | 最近中文国产在线视频 | 日本久久中文 | 欧美激情精品 | 正在播放五月婷婷狠狠干 | 人人超碰97| 成人91在线 | 久久99深爱久久99精品 | 成人一区在线观看 | 久久爱影视i | 四虎最新域名 | 久久香蕉国产 | 激情综合网五月婷婷 | 久久婷婷国产 | 亚洲最大色| 欧美日韩国产二区 | 麻豆免费视频观看 | 91看成人 | 91激情视频在线 | 欧美一区二区三区在线看 | 欧美另类v| 欧美在线视频a | 91夫妻自拍 | 久久久亚洲精华液 | 97视频免费在线观看 | 日韩av手机在线看 | 五月婷婷中文网 | 九九国产精品视频 | 欧美 日韩 国产 中文字幕 | 色网址99 | 国产不卡一 | 久久精品欧美一区二区三区麻豆 | 岛国片在线 | 少妇av网 | 看片的网址| 最近2019年日本中文免费字幕 | 天堂av在线中文在线 | 99超碰在线观看 | 天天操天天是 | 欧美日本国产在线观看 | 久久久精品国产一区二区 | 99热九九这里只有精品10 | 麻豆视频在线看 | 免费三级黄色片 | 日韩在线观看视频网站 | 2018亚洲男人天堂 | 国产不卡精品 | 五月婷av| 天天色视频| 激情网在线观看 | 激情五月在线观看 | 色播六月天 | 国产成人三级在线观看 | 国产一级二级在线播放 | 国产麻豆精品在线观看 | 在线观看日韩精品 | 久久综合爱 | 97人人人人| 91chinese在线| 亚洲综合最新在线 | 成年人视频在线免费播放 | 深爱婷婷久久综合 | 亚洲精品视频在线观看免费视频 | 国产精品国内免费一区二区三区 | 天操夜夜操 | 国产精品久久久久久欧美 | 91av超碰| 最新国产精品拍自在线播放 | 国精产品一二三线999 | 国产欧美综合视频 | 日韩免费播放 | 在线看片91| 久久久免费少妇 | 美女性爽视频国产免费app | 在线观看黄色大片 | 在线观看中文字幕一区二区 | 日韩欧美精品免费 | 成人中文字幕av | 欧美一进一出抽搐大尺度视频 | 99综合影院在线 | 国产直播av | 国产破处视频在线播放 | 国产精品久久久免费看 | 久久精品网 | 久久久久久久久影视 | 国内视频在线 | 欧美激情精品久久久久久免费印度 | 伊人电影在线观看 | 国产精品自在欧美一区 | 欧美日韩久久久 | 四虎www| 日韩中文字幕在线 | 国产成人91 | 国产日韩精品在线 | 91精品办公室少妇高潮对白 | 亚洲久久视频 | 99久久精品无免国产免费 | 色黄久久久久久 | 欧美亚洲国产一卡 | 国产一区二区三区四区大秀 | 久久久精品福利视频 | 欧美xxxx性xxxxx高清 | 中文字幕乱视频 | 五月婷婷在线播放 | 中文字幕成人av | 深爱激情婷婷网 | 精品国产亚洲日本 | 精品福利片 | 亚洲免费av观看 | 中文超碰字幕 | 日韩中文字幕视频在线观看 | 波多野结衣精品视频 | 日韩激情在线视频 | 福利视频导航网址 |