<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The important thing in life is to have a great aim , and the determination

    常用鏈接

    統計

    IT技術鏈接

    保險相關

    友情鏈接

    基金知識

    生活相關

    最新評論

    Spring+Hibernate+Acegi 的初次體驗

    系統,三種角色:教師,學生,管理員,我想讓他們的登陸都在一個界面下自動識別,而無需進行身份選擇,登陸后,他們將分別到各自的admin.jsp,stu.jsp,teacher.jsp
    在數據庫中的表結構如下(很多屬性略):
    id--- user---password--type---about

    type是用來存儲用戶的類別,分別有a,t,s分別對應三種角色
    about對應的是acegi里所需要的enable,用戶是否可用

    在model里,我們采用了繼承關系:

    父類user:

    代碼
    1. package?subject.model; ??
    2. ??
    3. public?abstract?class?User?extends?BaseObject ??
    4. { ??
    5. ?private?Integer?id; ??
    6. ?private?String?user; ??
    7. ?private?String?password; ??
    8. ?private?String?name; ??
    9. ?private?String?telphone; ??
    10. ??
    11. ??//set?and?get?method? ??
    12. ?//這個是用來反映用戶角色的關鍵函數,在子類實現,從而實現多態 ??
    13. ?public?abstract?String?getType();? ??
    14. } ??

    子類的實現:
    ======================

    代碼
    1. package?subject.model; ??
    2. ??
    3. import?subject.Constants; ??
    4. ??
    5. public?class?Teacher?extends?User ??
    6. { ??
    7. ?private?String?level;?????????//教師的職稱 ??
    8. ??
    9. //set?and?get?method ??
    10. ??
    11. ?public?String?getType() ??
    12. ?{ ??
    13. ??return?Constants.TEACHER; ??
    14. ?} ??
    15. } ??

    ================
    代碼
    1. package?subject.model; ??
    2. ??
    3. import?subject.Constants; ??
    4. ??
    5. public?class?Student?extends?User ??
    6. { ??
    7. ?private?static?final?long?serialVersionUID?=?1L; ??
    8. ??
    9. ?private?SchoolClass?schoolClass;?????????//學生的班級 ??
    10. ?private?String?sn;?????????????//學生的學號 ??
    11. ??
    12. //set?and?get?method ??
    13. ? ??
    14. ?public?String?getType() ??
    15. ?{ ??
    16. ??return?Constants.STUDENT; ??
    17. ?} ??
    18. } ??

    =================
    代碼
    1. package?subject.model; ??
    2. ??
    3. import?subject.Constants; ??
    4. ??
    5. public?class?Admin?extends?User ??
    6. { ??
    7. ?private?String?grade;???????????//管理員的級別 ??
    8. //set?and?get?method ??
    9. ??
    10. ?public?String?getType() ??
    11. ?{ ??
    12. ??return?Constants.ADMIN; ??
    13. ?} ??
    14. } ??

    對于三者所共有的屬性在數據庫里,都存在一個字段,而依據不同的角色擁有不同的含義,學生的班級則存放在了about里,只要學生有班級,他就able,否則就enable了!而管理員和教師則默認為1!

    這種是屬于一個繼承樹存放在一個表的情況,Hibernate的配置如下:

    代碼
    1. <hibernate-mapping>??
    2. ??
    3. ?<class?name="subject.model.User"?discriminator-value="not?null">??
    4. ??
    5. ??<id?name="id">??
    6. ???<generator?class="increment"?/>??
    7. ??</id>??
    8. ?? ??
    9. ??<discriminator?column="type"?type="character"?/>??
    10. ?? ??
    11. ??<property?name="user"?/>??
    12. ??<property?name="password"?/>??
    13. ??<property?name="name"?/>??
    14. ??<property?name="telphone"?/>??
    15. ??
    16. ??<subclass?name="subject.model.Admin"?discriminator-value="a">??
    17. ???<property?name="grade"?column="sn"?/>??
    18. ??</subclass>??
    19. ?? ??
    20. ??<subclass?name="subject.model.Teacher"?discriminator-value="t">??
    21. ???<property?name="level"?column="sn"?/>??
    22. ??</subclass>??
    23. ?? ??
    24. ??<subclass?name="subject.model.Student"?discriminator-value="s">??
    25. ??? ??
    26. ???<property?name="sn"?/>??
    27. ??? ??
    28. ???<many-to-one?name="schoolClass"?class="subject.model.SchoolClass"? ??
    29. ????column="about"?update="false"?insert="false"?/>??
    30. ???? ??
    31. ??</subclass>??
    32. ??
    33. ?</class>??
    34. ??
    35. </hibernate-mapping>??

    =============================================
    上面的這些都是模型的基礎,下面再講怎么樣配合Spring和Acegi實現系統的安全與登陸
    在Spring中Hibernate的配置只介紹不說明:

    代碼
    1. <!--?定義DBCP數據源?-->??
    2. ?<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">??
    3. ??<property?name="driverClassName"?value="com.mysql.jdbc.Driver"?/>??
    4. ??<property?name="url"?value="jdbc:mysql://localhost/subject?useUnicode=true&characterEncoding=gbk"?/>??
    5. ??<property?name="username"?value="root"?/>??
    6. ??<property?name="password"?value=""?/>??
    7. ??<property?name="maxActive"?value="100"?/>??
    8. ??<property?name="maxIdle"?value="30"?/>??
    9. ??<property?name="maxWait"?value="1000"?/>??
    10. ??<property?name="defaultAutoCommit"?value="true"?/>??
    11. ??<property?name="removeAbandoned"?value="true"?/>??
    12. ??<property?name="removeAbandonedTimeout"?value="60"?/>??
    13. ?</bean>??
    14. ??
    15. ?<!--?Hibernate?-->??
    16. ?<bean?id="sessionFactory"?class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">??
    17. ??<property?name="dataSource"?ref="dataSource"?/>??
    18. ??<property?name="mappingResources">??
    19. ???<list>??
    20. ????<value>subject/model/User.hbm.xml</value>??
    21. ???</list>??
    22. ??</property>??
    23. ??<property?name="hibernateProperties">??
    24. ???<props>??
    25. ????<prop?key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>??
    26. ???</props>??
    27. ??</property>??
    28. ?</bean>??
    29. ??
    30. ?<bean?id="transactionManager"?class="org.springframework.orm.hibernate3.HibernateTransactionManager">??
    31. ??<property?name="sessionFactory"?ref="sessionFactory"?/>??
    32. ?</bean>??
    33. ??
    34. <!--?Dao對象?-->??
    35. <bean?id="userDao"?class="subject.dao.hibernate.UserDaoImpl">??
    36. ??<property?name="sessionFactory"?ref="sessionFactory"?/>??
    37. ?</bean>??
    38. ??
    39. <!--?業務邏輯?-->??
    40. ?<bean?id="txProxyTemplate"?abstract="true"?class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">??
    41. ??<property?name="transactionManager"?ref="transactionManager"?/>??
    42. ??<property?name="transactionAttributes">??
    43. ???<props>??
    44. ????<prop?key="save*">PROPAGATION_REQUIRED</prop>??
    45. ????<prop?key="remove*">PROPAGATION_REQUIRED</prop>??
    46. ????<prop?key="get*">PROPAGATION_REQUIRED,readOnly</prop>??
    47. ???</props>??
    48. ??</property>??
    49. ?</bean>??
    50. ??
    51. <bean?id="userManager"?parent="txProxyTemplate">??
    52. ??<property?name="target">??
    53. ???<bean?class="subject.service.impl.UserManagerImpl">??
    54. ????<property?name="userDao"?ref="userDao"?/>??
    55. ???</bean>??
    56. ??</property>??
    57. ?</bean>??
    58. ??
    59. <!--?Struts?-->??
    60. ?<bean?name="/user"?class="subject.web.action.UserAction"?singleton="false">??
    61. ??<property?name="userManager">??
    62. ???<ref?bean="userManager"?/>??
    63. ??</property>??
    64. ?</bean>??

    ==================
    上面具體的不用了解,無非就是調用和數據庫的操作,
    下面就要對Acegi進行聲明了:
    我不用Ctrl+c和Ctrl+V的方式對Acegi進行介紹,沒有意義,隨便google就一大堆
    我們想主要在這樣的系統中需要的安全策略都有哪些?
    1.用戶的登陸
    2.防止多個用戶登陸一個帳號
    3.用戶的注銷
    4.防止非法用戶的訪問

    我這個程序所涉及到的只有這些,下面就進行說明:

    在web.xml的聲明:

    代碼
    1. <!--?Acegi安全控制?Filter?配置?-->??
    2. ????<filter>??
    3. ????????<filter-name>securityFilter</filter-name>??
    4. ????????<filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>??
    5. ????????<init-param>??
    6. ????????????<param-name>targetClass</param-name>??
    7. ????????????<param-value>org.acegisecurity.util.FilterChainProxy</param-value>??
    8. ????????</init-param>??
    9. ????</filter>??
    10. ???? ??
    11. ????<filter-mapping>??
    12. ????????<filter-name>securityFilter</filter-name>??
    13. ????????<url-pattern>/*</url-pattern>??
    14. ????</filter-mapping>??

    Acegi通過實現了Filter接口的FilterToBeanProxy提供一種特殊的使用Servlet Filter的方式,它委托Spring中的Bean -- FilterChainProxy來完成過濾功能,這樣就簡化了web.xml的配置,并且利用Spring IOC的優勢。FilterChainProxy包含了處理認證過程的filter列表,每個filter都有各自的功能。

    代碼
    1. <!--?========================?FILTER?CHAIN?=======================?-->??
    2. ?<bean?id="filterChainProxy"?class="org.acegisecurity.util.FilterChainProxy">??
    3. ??<property?name="filterInvocationDefinitionSource">??
    4. ???<value>??
    5. ????CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON? ??
    6. ????PATTERN_TYPE_APACHE_ANT ??
    7. ???? ??
    8. ????/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter, ??
    9. ?????????securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor ??
    10. ???</value>??
    11. ??</property>??
    12. ?</bean>??

    大體上先介紹一下:
    httpSessionContextIntegrationFilter:每次request前 HttpSessionContextIntegrationFilter從Session中獲取Authentication對象,在request完后, 又把Authentication對象保存到Session中供下次request使用,此filter必須其他Acegi filter前使用,使之能跨越多個請求。
    logoutFilter:用戶的注銷
    authenticationProcessingFilter:處理登陸請求
    exceptionTranslationFilter:異常轉換過濾器
    filterInvocationInterceptor:在訪問前進行權限檢查

    這些就猶如在web.xml聲明一系列的過濾器,不過當把他們都聲明在spring中就可以享受Spring給我們帶來的方便了。

    下面就是對這些過濾器的具體聲明:
    只對有用的地方進行聲明,別的地方幾乎都是默許的

    代碼
    1. <!--?========================?FILTER?=======================?-->??
    2. ?<bean?id="httpSessionContextIntegrationFilter"? ??
    3. ??class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"?/>??
    4. ??
    5. ?<bean?id="logoutFilter"?class="org.acegisecurity.ui.logout.LogoutFilter">??
    6. ??<constructor-arg?value="/index.htm"?/>?????????????離開后所轉向的位置 ??
    7. ??<constructor-arg>??
    8. ????????????<list>??
    9. ????????????????<bean?class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>??
    10. ????????????</list>??
    11. ????????</constructor-arg>??
    12. ??<property?name="filterProcessesUrl"?value="/logout.htm"?/>????????定義用戶注銷的地址, ??
    13. ?</bean>??
    14. ??

    下面的這個過濾器,我們根據自己的需求有了自己的實現:
    代碼
    1. ?<bean?id="authenticationProcessingFilter"?class="subject.web.filter.UserAuthenticationProcessingFilter">??
    2. ??<property?name="authenticationManager"?ref="authenticationManager"/>??下面會介紹的用來起到認證管理的作用 ??
    3. ??<property?name="authenticationFailureUrl"?value="/login.htm?error=wrong"/>??登陸失敗的地址 ??
    4. ??<property?name="defaultTargetUrl"?value="/login.htm"/>???????登陸成功的地址 ??
    5. ??<property?name="filterProcessesUrl"?value="/j_security_check"/>??????登陸請求的地址 ??
    6. ??<property?name="userManager"?ref="userManager"/>????????自己添加的屬性,這樣就可以訪問到我們的業務邏輯 ??
    7. ??<property?name="exceptionMappings">???出現異常所對應的地址 ??
    8. ????????????<value>??
    9. ????????????????org.acegisecurity.AuthenticationException=/login.htm?error=fail?????登陸失敗????????????????org.acegisecurity.concurrent.ConcurrentLoginException=/login.htm?error=too????????已登陸了 ??
    10. ????????????</value>??
    11. ????????</property>??
    12. ?</bean>??
    13. ? ??
    14. ?<bean?id="securityContextHolderAwareRequestFilter"?class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>??
    15. ??
    16. ?<bean?id="exceptionTranslationFilter"?class="org.acegisecurity.ui.ExceptionTranslationFilter">??
    17. ??<property?name="authenticationEntryPoint">??
    18. ???<bean?class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">??
    19. ????<property?name="loginFormUrl"?value="/login.htm?error=please"/>//如果用戶沒登陸就想訪問,先到這里登陸吧 ??
    20. ????<property?name="forceHttps"?value="false"/>??
    21. ???</bean>??
    22. ??</property>??
    23. ?</bean>??
    24. ? ??
    25. ?<bean?id="filterInvocationInterceptor"?class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">??
    26. ??<property?name="authenticationManager"?ref="authenticationManager"/>???????認證服務 ??
    27. ??<property?name="accessDecisionManager">??
    28. ???<bean?class="org.acegisecurity.vote.AffirmativeBased">??
    29. ????<property?name="allowIfAllAbstainDecisions"?value="false"/>??
    30. ????<property?name="decisionVoters">??
    31. ?????<list>??
    32. ??????<bean?class="org.acegisecurity.vote.RoleVoter">??
    33. ????????????????????<property?name="rolePrefix"?value=""/>?????????//這里定義數據庫中存放的角色和我們在這里聲明的角色間是否需要加個前綴?我沒加 ??
    34. ????????????????</bean>??
    35. ?????</list>??
    36. ????</property>??
    37. ???</bean>??
    38. ??</property>??
    39. ??<property?name="objectDefinitionSource">??
    40. ????????????<value>??
    41. ????????????????PATTERN_TYPE_APACHE_ANT ??
    42. ???????????????? ??
    43. ????????????????/admin.htm*=a?????????這里就是數據庫中對應的tyep?a ??
    44. ????????????????/student*=s???????????由于沒有前綴和數據庫里一樣 ??
    45. ????????????????/teacher*=t ??
    46. ????????????</value>??
    47. ????????</property>??
    48. ?</bean>??
    49. ? ??
    50. ?<bean?id="loggerListener"??
    51. ??????????class="org.acegisecurity.event.authentication.LoggerListener"/>???????記錄事件 ??
    52. ??
    53. 下面就要說明我們的認證服務了,其起到的關鍵作用就是用來保證用戶登陸身份的驗證: ??
    54. ??
    55. 它將驗證的功能委托給多個Provider,并通過遍歷Providers,?以保證獲取不同來源的身份認證,若某個Provider能成功確認當前用戶的身份,authenticate()方法會返回一個完整的包含用戶授權信息的Authentication對象,否則會拋出一個AuthenticationException。 ??
    56. ??
    57. 先聲明一個管理器吧,在上面的過濾器中都已經用到過了 ??
    58. <!--?========================?AUTHENTICATION?=======================?-->??
    59. ?<bean?id="authenticationManager"?class="org.acegisecurity.providers.ProviderManager">??
    60. ??<property?name="providers">??
    61. ???<list>??
    62. ????<ref?local="daoAuthenticationProvider"?/>???我僅僅用到?從數據庫中讀取用戶信息驗證身份 ??
    63. ???</list>??
    64. ??</property>??
    65. ??<property?name="sessionController">??
    66. ???<bean?id="concurrentSessionController"? ??
    67. ????class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">??
    68. ????<property?name="maximumSessions">??
    69. ?????<value>1</value>每個用戶同時登陸一位 ??
    70. ????</property>??
    71. ????<property?name="sessionRegistry">??
    72. ?????<bean?id="sessionRegistry"?class="org.acegisecurity.concurrent.SessionRegistryImpl"?/>??
    73. ????</property>??
    74. ????<property?name="exceptionIfMaximumExceeded"?value="true"?/>??
    75. ???</bean>??
    76. ??</property>??
    77. ?</bean>??
    78. ?來實現唯一的一個Provider,從數據庫驗證身份 ??
    79. ?<bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">??
    80. ??<property?name="userDetailsService">??
    81. ???<bean?id="jdbcDaoImpl"??
    82. ????????????class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">??
    83. ??????????<property?name="dataSource"?ref="dataSource"/>??
    84. ??????????<property?name="usersByUsernameQuery">??
    85. ??????????????<value>??
    86. ??????????????????select?user,password,about?from?user?where?user?=??????????查找用戶的查詢語句,只需要把你數據庫中的用戶和密碼以及enable相對應上就行 ??
    87. ??????????????</value>??
    88. ??????????</property>??
    89. ??????????<property?name="authoritiesByUsernameQuery">??
    90. ??????????????<value>??
    91. ??????????????????select?user,type?from?user?where?user?=?????????????這里就是把用戶和權限對應上,在appfuse中用的兩個表,我都放一個表里了,所以就用這一個就行問題的關鍵是要讓它能找到兩個字段,構成一個對象 ??
    92. ??????????????</value>??
    93. ??????????</property>??
    94. ??????</bean>??
    95. ??</property>??
    96. ??<property?name="userCache">?緩存都這么寫: ??
    97. ???<bean?class="org.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">??
    98. ????<property?name="cache">??
    99. ?????<bean?class="org.springframework.cache.ehcache.EhCacheFactoryBean">??
    100. ??????<property?name="cacheManager">??
    101. ???????<bean?class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>??
    102. ??????</property>??
    103. ??????<property?name="cacheName"?value="userCache"/>??
    104. ?????</bean>??
    105. ????</property>??
    106. ???</bean>??
    107. ??</property>??
    108. ?</bean>??

    ==============
    對于上面登陸請求的處理器我借鑒了springSide,實現的方法如下:
    代碼
    1. package?subject.web.filter; ??
    2. ??
    3. import?javax.servlet.http.HttpServletRequest; ??
    4. import?javax.servlet.http.HttpServletResponse; ??
    5. import?javax.servlet.http.HttpSession; ??
    6. ??
    7. import?org.acegisecurity.Authentication; ??
    8. import?org.acegisecurity.context.SecurityContext; ??
    9. import?org.acegisecurity.context.SecurityContextHolder; ??
    10. import?org.acegisecurity.ui.webapp.AuthenticationProcessingFilter; ??
    11. import?org.acegisecurity.userdetails.UserDetails; ??
    12. ??
    13. import?subject.Constants; ??
    14. import?subject.model.User; ??
    15. import?subject.service.UserManager; ??
    16. ??
    17. public?class?UserAuthenticationProcessingFilter?extends??
    18. ??AuthenticationProcessingFilter ??
    19. { ??
    20. ?private?UserManager?userManager; ??
    21. ??
    22. ?public?void?setUserManager(?UserManager?userManager?) ??
    23. ?{ ??
    24. ??this.userManager?=?userManager; ??
    25. ?} ??
    26. ??
    27. ?protected?boolean?requiresAuthentication(?HttpServletRequest?request?, ??
    28. ???HttpServletResponse?response?) ??
    29. ?{ ??
    30. ??boolean?requiresAuth?=?super.requiresAuthentication(?request,?response?); ??
    31. ??HttpSession?httpSession?=?null; ??
    32. ??try??
    33. ??{ ??
    34. ???httpSession?=?request.getSession(?false?); ??
    35. ??} ??
    36. ??catch?(?IllegalStateException?ignored?) ??
    37. ??{ ??
    38. ??} ??
    39. ??if?(?httpSession?!=?null?) ??
    40. ??{ ??
    41. ???if?(?httpSession.getAttribute(?Constants.USER?)?==?null?) ??
    42. ???{ ??
    43. ????if?(?!requiresAuth?) ??
    44. ????{ ??
    45. ?????SecurityContext?sc?=?SecurityContextHolder.getContext(); ??
    46. ?????Authentication?auth?=?sc.getAuthentication(); ??
    47. ?????if?(?auth?!=?null??
    48. ???????&&?auth.getPrincipal()?instanceof?UserDetails?) ??
    49. ?????{ ??
    50. ??????UserDetails?ud?=?(UserDetails)?auth.getPrincipal();//上面聲明的sql無非就是要包裝成這個對象 ??
    51. ??????User?user?=?userManager.getUser(?ud.getUsername()?);從業務邏輯里找到用戶,放到session里 ??
    52. ??????httpSession.setAttribute(?Constants.USER,?user?); ??
    53. ?????} ??
    54. ????} ??
    55. ???} ??
    56. ??} ??
    57. ??return?requiresAuth; ??
    58. ?} ??
    59. } ??

    在看看我的login.htm在登陸成功時是怎么工作的吧?

    代碼
    1. public?class?UserAction?extends?BaseAction ??
    2. { ??
    3. ?private?UserManager?mgr; ??
    4. ??
    5. ?public?void?setUserManager(?UserManager?mgr?) ??
    6. ?{ ??
    7. ??this.mgr?=?mgr; ??
    8. ?} ??
    9. ??
    10. ?public?ActionForward?login(?ActionMapping?mapping?,?ActionForm?form?, ??
    11. ???HttpServletRequest?request?,?HttpServletResponse?response?) ??
    12. ???throws?Exception ??
    13. ?{ ??
    14. ??User?user?=?(User)?getSessionObject(?request,?Constants.USER?); ??
    15. ??ActionMessages?msg?=?new?ActionMessages(); ??
    16. ??if?(?user?!=?null?) ??
    17. ??{ ??
    18. ???return?new?ActionForward(??user.getType()?+?".htm",?true?);成功就去type.htm ??
    19. ??} ??
    20. ??else??
    21. ??{ ??
    22. ???String?error?=?getParameter(?request,?Constants.ERROR?); ??
    23. ???if?(?error?!=?null?)對于不同的錯誤,都加以提示 ??
    24. ???{ ??
    25. ????if?(?error.equalsIgnoreCase(?"wrong"?)?) ??
    26. ?????msg.add(?"msg",?new?ActionMessage(?"fail.login.wrong"?)?); ??
    27. ????else?if?(?error.equalsIgnoreCase(?"too"?)?) ??
    28. ?????msg.add(?"msg",?new?ActionMessage(?"fail.login.too"?)?); ??
    29. ????else?if?(?error.equalsIgnoreCase(?"fail"?)?) ??
    30. ?????msg.add(?"msg",?new?ActionMessage(?"fail.login.fail"?)?); ??
    31. ????else??
    32. ?????msg.add(?"msg",?new?ActionMessage(?"fail.login.please"?)?); ??
    33. ???} ??
    34. ???else??
    35. ????msg.add(?"msg",?new?ActionMessage(?"fail.login.please"?)?); ??
    36. ??} ??
    37. ??saveErrors(?request,?msg?); ??
    38. ??return?mapping.findForward(?"fail"?); ??
    39. ?} ??
    40. ??
    41. } ??

    當然,Acegi需要介紹的東西太多了,我只把我這次認為有必要解釋的東西寫在了上面讓大家來參考,作為能google到的東西,比如對于認證的方式還有很多,我就沒有詳細的介紹,在學習Acegi過程中,把它自帶的例子弄清楚很關鍵,希望大家一起學習一起共勉!

    posted on 2007-03-13 17:19 鴻雁 閱讀(313) 評論(0)  編輯  收藏

    主站蜘蛛池模板: 精品少妇人妻AV免费久久洗澡| 亚洲中字慕日产2020| 国产无限免费观看黄网站| 亚洲国产第一站精品蜜芽| 永久看日本大片免费35分钟| 亚洲中文字幕无码久久| 亚洲国产成人五月综合网| 午夜精品免费在线观看 | 亚洲成a∧人片在线观看无码| 免费真实播放国产乱子伦| 97无码人妻福利免费公开在线视频| 亚洲女人初试黑人巨高清| 免费a级毛片大学生免费观看 | 中文字幕精品亚洲无线码一区| 99精品视频在线视频免费观看 | 色视频色露露永久免费观看| www.黄色免费网站| 国产乱妇高清无乱码免费| 看成年女人免费午夜视频| 久久久久亚洲AV成人片| 国产午夜影视大全免费观看 | 亚洲三级高清免费| 久久久久亚洲精品无码网址| 69式国产真人免费视频 | 亚洲区日韩区无码区| 成人黄色免费网址| 最近2019中文字幕免费大全5| 免费无码专区毛片高潮喷水| 亚洲卡一卡2卡三卡4麻豆| 亚洲情XO亚洲色XO无码| 日韩免费三级电影| 亚洲免费观看网站| 国产一区二区三区免费观在线| 亚洲大码熟女在线观看| 亚洲欧美成人一区二区三区| 亚洲国产老鸭窝一区二区三区| 又大又硬又爽免费视频| 四虎永久免费观看| 亚洲美女在线国产| 亚洲色爱图小说专区| 亚洲爆乳无码一区二区三区|