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

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

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

    深藍的天空下,有你有我...
    共享酸、甜、苦、辣
    posts - 23,comments - 19,trackbacks - 0

    ??????最近兩星期在學習acegi,過程中感謝JavaEyeSpringSide和在網上提供acegi學習心得的網友們。
    為了加深自己的認識,準備寫下一些DEMO,希望可以給準備學習acegi的同學一些幫助。
    ??????作為安全服務離不開認證和授權這兩個主要組成部分。而這篇文章就是針對acegi的認證服務。
    ??????????????????????????????????????????????????????????????????????????????學習Acegi-認證(authentication)
    代碼環境基于:
    JDK1.5
    acegi1.0.3
    spring2.0

    IDE基于:
    Eclipse3.2+MyEclipse5.0.1

    面向人員:
    熟悉Eclipse+MyEclipse開發但剛開始了解acegi的人員。如果你是高手請指出文章不足之處。

    1.建立一個MyEclipse的WebProject,把下列jar文件拷貝到項目的WEB-INF/lib目錄:
    acegi-security-1.0.3.jar
    spring2.0.jar
    commons-codec-1.3.jar
    費話說一句(占些字數):這是因為代碼運行需要這些包的支持。


    2.修改WEB-INF下的web.xml文件,內容如下:

    <? xml?version = " 1.0 " ?encoding = " UTF-8 " ?>
    < web - app?version = " 2.4 " ?xmlns = " http://java.sun.com/xml/ns/j2ee "
    ????xmlns:xsi
    = " http://www.w3.org/2001/XMLSchema-instance "
    ????xsi:schemaLocation
    = " http://java.sun.com/xml/ns/j2ee?
    ????http: // java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    ????
    < display - name > acegi?Example?of?liuyxit </ display - name >
    ????
    ????
    <!--
    ????????定義應用的上下文參數,用于ContextLoaderListener??????
    ????
    -->
    ????
    < context - param >
    ????????
    < param - name > contextConfigLocation </ param - name >
    ????????
    < param - value >
    ????????????classpath:spring
    / applicationContext.xml
    ????????
    </ param - value >
    ????
    </ context - param >

    ????
    <!-- acegi?的filter鏈代理 -->
    ????
    < filter >
    ????????
    < filter - name > Acegi?Filter?Chain?Proxy </ filter - name >
    ????????
    < filter - class >
    ????????????org.acegisecurity.util.FilterToBeanProxy
    ????????
    </ filter - class >
    ????????
    < init - param >
    ????????????
    < param - name > targetClass </ param - name >
    ????????????
    < param - value >
    ????????????????org.acegisecurity.util.FilterChainProxy
    ????????????
    </ param - value >
    ????????
    </ init - param >
    ????
    </ filter >

    ????
    < filter - mapping >
    ????????
    < filter - name > Acegi?Filter?Chain?Proxy </ filter - name >
    ????????
    < url - pattern > /* </url-pattern>
    ????</filter-mapping>

    ????<!--
    ????????裝載應用軟件的Spring上下文
    ????????要由WebapplicationContextUtils.getWebApplicationnContext(servletContext)得到.
    ????-->
    ????<listener>
    ????????<listener-class>
    ????????????org.springframework.web.context.ContextLoaderListener
    ????????</listener-class>
    ????</listener>

    </web-app>


    其中FilterChainProxy實現了filter接口,它主要是實例化FilterChainProxy,并把所有動作交由FilterChainProxy處理。這樣簡化了web.xml的配置,并且充分利用了Spring IOC管理Bean的優勢。

    3.在src目錄右鍵新建一個resource folder,在下面再建立acegi和spring目錄
    在spring目錄中創建applicationContext.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:aop
    = " http://www.springframework.org/schema/aop "
    ???????xmlns:tx
    = " http://www.springframework.org/schema/tx "
    ???????xsi:schemaLocation
    = " http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    ???????????http: // www.springframework.org/schema/aop? http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    ???????????http: // www.springframework.org/schema/tx? http://www.springframework.org/schema/tx/spring-tx-2.0.xsd "
    ??????? default - autowire = " byName " ? default - lazy - init = " true " >
    ????
    ????
    <!-- ? ======================== ?FILTER?CHAIN? ======================= ? -->
    ????
    < bean?id = " filterChainProxy " ? class = " org.acegisecurity.util.FilterChainProxy " >
    ??????
    < property?name = " filterInvocationDefinitionSource " >
    ?????????
    < value >
    ????????????CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    ????????????PATTERN_TYPE_APACHE_ANT
    ????????????
    /** =authenticationProcessingFilter,exceptionTranslationFilter
    ?????????</value>
    ??????</property>
    ????</bean>???
    ????<!--?========================?認證filter?=======================?-->
    ???
    ????<!--?表單認證處理filter?-->
    ????<bean?id="authenticationProcessingFilter"?class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
    ????????<property?name="authenticationManager"?ref="authenticationManager"/>
    ????????<property?name="authenticationFailureUrl"?value="/acegilogin.jsp?login_error=1"/>
    ????????<property?name="defaultTargetUrl"?value="/userinfo.jsp"/>
    ????????<property?name="filterProcessesUrl"?value="/j_acegi_security_check"/>
    ????</bean>????
    ???????
    ???<!--?認證管理器?-->
    ???<bean?id="authenticationManager"?class="org.acegisecurity.providers.ProviderManager">
    ??????<property?name="providers"><!--?可有多個認證提供器,其中一個證通過就可以了?-->
    ?????????<list>
    ????????????<ref?local="daoAuthenticationProvider"/>
    ????????????<ref?local="rememberMeAuthenticationProvider"/>
    ?????????</list>
    ??????</property>
    ???</bean>???
    ????<bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
    ????????<property?name="userDetailsService"?ref="inMemoryDaoImpl"/>????????
    ????</bean>????
    ????<!-- 用戶資料-->
    ?????<bean?id="inMemoryDaoImpl"?class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">??
    ????????<property?name="userMap">??
    ????????????<value>??
    ????????????????liuyxit=123,ROLE_SUPERVISOR
    ????????????????user1=user1,ROLE_USER
    ????????????????user2=user2,disabled,ROLE_USER???
    ????????????</value>??
    ????????</property>??
    ????</bean>
    ????<!--?異常處理filter?-->
    ????<bean?id="exceptionTranslationFilter"?class="org.acegisecurity.ui.ExceptionTranslationFilter">
    ????????<property?name="authenticationEntryPoint">
    ????????????<bean?class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    ????????????????<property?name="loginFormUrl"?value="/acegilogin.jsp"/>
    ????????????????<property?name="forceHttps"?value="false"/>
    ????????????</bean>
    ????????</property>
    ????????<property?name="accessDeniedHandler">
    ????????????<bean?class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
    ????????????????<property?name="errorPage"?value="/accessDenied.jsp"/>
    ????????????</bean>
    ????????</property>
    ????</bean>????
    </beans>



    其中filterChainProxy就是由web.xml聲明的filter(FilterToBeanProxy)的targetClass。它主要是裝載filterInvocationDefinitionSource指定的filter類(例子中為authenticationProcessingFilter,exceptionTranslationFilter),并順序調用它們的doFilter方法,進行安全服務處理。
    authenticationProcessingFilter是處理一個認證表單,登陸用的表單必須提交用戶名和密碼這兩個參數給這個filter.由用戶名和密碼構造一個UsernamePasswordAuthenticationToken,將傳給AuthenticationManager的authenticate方法進行認證處理。該filter默認處理filterProcessesUrl屬性指定的URL,認證失敗會轉到authenticationFailureUrl,認證成功會轉到defaultTargetUrl頁面。

    AuthenticationManager顧名思義認證管理器,它只有一個接口方法authenticate用于返回認證結果,他的實現類由多個AuthenticationProvider進行投票,決定認證是否通過。

    daoAuthenticationProvider是檢驗用戶錄入的認證數據是否正確(說白了就是用戶名和密碼是否正確)

    inMemoryDaoImpl是給
    daoAuthenticationProvider提供系統的用戶資料。而資料的來源是從配置中裝載到內存的。

    當認證不通過時,AuthenticationManager的實現類AbstractAuthenticationManager會拋出AuthenticationException類型的異常。這時排在最后的exceptionTranslationFilter會捕獲該異常,并轉向authenticationEntryPoint。

    4.在WebRoot下創建index.jsp(其實不要也沒關系,主要是為了方便),直接轉向用戶資料顯示頁。內容如下

    <% @?page?language = " java " ?pageEncoding = " UTF-8 " %>
    <! DOCTYPE?HTML?PUBLIC? " -//W3C//DTD?HTML?4.0?Transitional//EN " >
    < html >
    < head >
    ???
    <!-- ?
    ???????
    < META?HTTP - EQUIV = " Refresh " ?CONTENT = " 0;URL=user!list.rgb " >
    ????
    --> ?
    ????
    < META?HTTP - EQUIV = " Refresh " ?CONTENT = " 0;URL=userinfo.jsp " >
    </ head >

    < body >
    < p > Loading? </ p >
    </ body >
    </ html >

    5.在WebRoot下創建userinfo.jsp,用于顯示當前登陸的用戶信息。內容如下

    <% @?page?language = " java " ?pageEncoding = " UTF-8 " %>
    <% @?page? import = " org.acegisecurity.context.SecurityContextHolder " %>
    <% @?page? import = " org.acegisecurity.userdetails.* " %>
    <%
    ????String?path?
    = ?request.getContextPath();
    ????String?basePath?
    = ?request.getScheme()? + ? " :// "
    ????????????
    + ?request.getServerName()? + ? " : " ? + ?request.getServerPort()
    ????????????
    + ?path? + ? " / " ;
    %>

    <! DOCTYPE?HTML?PUBLIC? " -//W3C//DTD?HTML?4.01?Transitional//EN " >
    < html >
    ????
    < head >
    ????????
    < base?href = " <%=basePath%> " >

    ????????
    < title > My?JSP? ' pass.jsp ' ?starting?page </ title >

    ????????
    < meta?http - equiv = " pragma " ?content = " no-cache " >
    ????????
    < meta?http - equiv = " cache-control " ?content = " no-cache " >
    ????????
    < meta?http - equiv = " expires " ?content = " 0 " >
    ????????
    < meta?http - equiv = " keywords " ?content = " keyword1,keyword2,keyword3 " >
    ????????
    < meta?http - equiv = " description " ?content = " This?is?my?page " >
    ????????
    <!--
    ????
    < link?rel = " stylesheet " ?type = " text/css " ?href = " styles.css " >
    ????
    -->

    ????
    </ head >

    ????
    < body >
    ????????當前用戶:
    ????????
    <%
    ????????????Object?obj?
    = ?SecurityContextHolder.getContext().getAuthentication();????????
    ????????????
    if ?( null ? != ?obj){
    ????????????????Object?userDetail?
    = ?SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    ????????????????String?username?
    = ? "" ;
    ????????????????
    if ?(userDetail? instanceof ?UserDetails)?{
    ????????????????????username?
    = ?((UserDetails)?userDetail).getUsername();
    ????????????????}?
    else ?{
    ????????????????????username?
    = ?userDetail.toString();
    ????????????????}
    ????????????????out.print(username);
    ????????????????out.print(
    " <br><a?href=\ " j_acegi_logout\ " >注銷</a> " );
    ????????????}
    else {
    ????????????????out.print(
    " 當前沒有有效的用戶 " );
    ????????????????out.print(
    " <br><a?href=\ " acegilogin.jsp\ " >登陸</a> " );
    ????????????}
    ????????
    %>
    ????????
    ????????
    ????
    </ body >
    </ html >

    ?

    6.在WebRoot下創建acegilogin.jsp

    <% @?page?language = " java " ?pageEncoding = " UTF-8 " %>
    <% @?page? import = " org.acegisecurity.ui.AbstractProcessingFilter " ? %>
    <% @?page? import = " org.acegisecurity.ui.webapp.AuthenticationProcessingFilter " ? %>
    <% @?page? import = " org.acegisecurity.AuthenticationException " ? %>

    < html >
    ??
    < head >
    ????
    < title > Login </ title >
    ??
    </ head >
    ??
    < body >
    ????
    < h1 > Login </ h1 >

    ????
    < P > Valid?users:
    ????
    < P >
    ????
    < P > username? < b > liuyxit </ b > ,?password? < b > 123 </ b > ?(supervisor)
    ????
    < P > username? < b > user1 </ b > ,?password? < b > user1 </ b > ?(normal?user)
    ????
    < p > username? < b > user2 </ b > ,?password? < b > user2 </ b > ?(user?disabled)
    ????
    < p >
    ????
    <%
    ????????String?strError?
    = ?request.getParameter( " login_error " );
    ????????
    ????????
    if ?( null ? != ?strError){?
    ?????
    %>
    ??????
    < font?color = " red " >
    ????????你的登陸失敗,請重試。
    < BR >< BR >
    ?????????原因:?
    <%= ?((AuthenticationException)?session.getAttribute(AbstractProcessingFilter.ACEGI_SECURITY_LAST_EXCEPTION_KEY)).getMessage()? %>
    ??????
    </ font >
    ??????
    <%
    ??????????}
    // end?if
    ?????? %>

    ????
    < form?action = " j_acegi_security_check " ?method = " POST " >
    ??????
    < table >
    ????????
    < tr >< td > User: </ td >< td >< input?type = ' text ' ?name = ' j_username ' ?value = ' <%=?session.getAttribute(AuthenticationProcessingFilter.ACEGI_SECURITY_LAST_USERNAME_KEY)?%> ' ></ td ></ tr >
    ????????
    < tr >< td > Password: </ td >< td >< input?type = ' password ' ?name = ' j_password ' ></ td ></ tr >
    ????????
    < tr >< td >< input?type = " checkbox " ?name = " _acegi_security_remember_me " ></ td >< td > 2周內自動登錄 </ td ></ tr >

    ????????
    < tr >< td?colspan = ' 2 ' >< input?name = " submit " ?type = " submit " ></ td ></ tr >
    ????????
    < tr >< td?colspan = ' 2 ' >< input?name = " reset " ?type = " reset " ></ td ></ tr >
    ??????
    </ table >

    ????
    </ form >

    ??
    </ body >
    </ html >


    7.OK,發布項目,訪問http://localhost:8080/acegiexample
    這時index.jsp會自動轉向userinfo.jsp,由于還沒有用戶登錄,所以沒有資料顯示。按登陸鏈接進入登錄頁,登錄成功后會看到顯示用戶名的頁面(當然可以有更多的用戶資料,但這僅僅是example),不成功時會在登錄頁提示信息。我們可以用user1和user2登陸,可以分別測試登錄成功和失敗的流程。

    8.可以看到登錄頁上有自動登陸功能,而userinfo.jsp頁有注銷功能。但還是不起作用,好,現在我們馬上首手加入這兩個功能。看acegi可以方便到什么程度。在applicationContext.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:aop
    = " http://www.springframework.org/schema/aop "
    ???????xmlns:tx
    = " http://www.springframework.org/schema/tx "
    ???????xsi:schemaLocation
    = " http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    ???????????http: // www.springframework.org/schema/aop? http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    ???????????http: // www.springframework.org/schema/tx? http://www.springframework.org/schema/tx/spring-tx-2.0.xsd "
    ??????? default - autowire = " byName " ? default - lazy - init = " true " >
    ????
    ????
    <!-- ? ======================== ?FILTER?CHAIN? ======================= ? -->
    ????
    < bean?id = " filterChainProxy " ? class = " org.acegisecurity.util.FilterChainProxy " >
    ??????
    < property?name = " filterInvocationDefinitionSource " >
    ?????????
    < value >
    ????????????CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    ????????????PATTERN_TYPE_APACHE_ANT
    ????????????
    /** =authenticationProcessingFilter,logoutFilter,rememberMeProcessingFilter,exceptionTranslationFilter
    ?????????</value>
    ??????</property>
    ????</bean>???
    ????<!--?========================?認證filter?=======================?-->
    ???
    ????<!--?表單認證處理filter?-->
    ????<bean?id="authenticationProcessingFilter"?class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
    ????????<property?name="authenticationManager"?ref="authenticationManager"/>
    ????????<property?name="authenticationFailureUrl"?value="/acegilogin.jsp?login_error=1"/>
    ????????<property?name="defaultTargetUrl"?value="/userinfo.jsp"/>
    ????????<property?name="filterProcessesUrl"?value="/j_acegi_security_check"/>
    ????</bean>
    ????
    ????<!--?利用cookie自動登陸filter?-->
    ????<bean?id="rememberMeProcessingFilter"
    ??????????class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
    ????????<property?name="authenticationManager"
    ??????????????????ref="authenticationManager"/>
    ????????<property?name="rememberMeServices"?ref="rememberMeServices"/>
    ????</bean>????
    ????<bean?id="rememberMeServices"
    ??????????class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
    ????????<property?name="userDetailsService"?ref="inMemoryDaoImpl"/>
    ????????<property?name="key"?value="javargb"/>
    ????</bean>??
    ????<bean?id="rememberMeAuthenticationProvider"
    ??????????class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
    ????????<property?name="key"?value="javargb"/>
    ????</bean>???
    ????
    ????<!--?注銷處理filter?-->
    ????<bean?id="logoutFilter"?class="org.acegisecurity.ui.logout.LogoutFilter">
    ??????<constructor-arg?value="/acegilogin.jsp"/>?<!--?URL?redirected?to?after?logout?-->
    ??????<constructor-arg>
    ?????????<list>
    ??????????????<ref?bean="rememberMeServices"/>
    ??????????????<bean?class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
    ?????????</list>
    ??????</constructor-arg>
    ???</bean>
    ????
    ???<!--?認證管理器?-->
    ???<bean?id="authenticationManager"?class="org.acegisecurity.providers.ProviderManager">
    ??????<property?name="providers"><!--?可有多個認證提供器,其中一個證通過就可以了?-->
    ?????????<list>
    ????????????<ref?local="daoAuthenticationProvider"/>
    ????????????<ref?local="rememberMeAuthenticationProvider"/>
    ?????????</list>
    ??????</property>
    ???</bean>???
    ????<bean?id="daoAuthenticationProvider"?class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
    ????????<property?name="userDetailsService"?ref="inMemoryDaoImpl"/>????????
    ????</bean>????
    ????<!--?
    ????<bean?id="inMemoryDaoImpl"?class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">
    ????????<property?name="userProperties">
    ????????????<bean?class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    ????????????????<property?name="location"?value="classpath:acegi/users.properties"/>
    ????????????</bean>
    ????????</property>
    ????</bean>
    ?????-->
    ?????<bean?id="inMemoryDaoImpl"?class="org.acegisecurity.userdetails.memory.InMemoryDaoImpl">??
    ????????<property?name="userMap">??
    ????????????<value>??
    ????????????????liuyxit=123,ROLE_SUPERVISOR
    ????????????????user1=user1,ROLE_USER
    ????????????????user2=user2,disabled,ROLE_USER???
    ????????????</value>??
    ????????</property>??
    ????</bean>
    ????<!--?異常處理filter?-->
    ????<bean?id="exceptionTranslationFilter"?class="org.acegisecurity.ui.ExceptionTranslationFilter">
    ????????<property?name="authenticationEntryPoint">
    ????????????<bean?class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
    ????????????????<property?name="loginFormUrl"?value="/acegilogin.jsp"/>
    ????????????????<property?name="forceHttps"?value="false"/>
    ????????????</bean>
    ????????</property>
    ????????<property?name="accessDeniedHandler">
    ????????????<bean?class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
    ????????????????<property?name="errorPage"?value="/accessDenied.jsp"/>
    ????????????</bean>
    ????????</property>
    ????</bean>????
    </beans>

    另要注意:Acegi默認的自動登陸設定參數名為_acegi_security_remember_me,注銷鏈接為/j_acegi_logout。

    馬上重啟Tomcat測試看看^_^。

    9.通常用戶資料會放在數據庫中,而不會放在配置文件,接著下面我們來再行修改一下。
    首先創建要用到的用戶表和權限表,并插入初始化數據:

    CREATE?TABLE?USERS(
    USERNAME?VARCHAR(
    50 )?NOT?NULL?PRIMARY?KEY,
    PASSWORD?VARCHAR(
    50 )?NOT?NULL,
    ENABLED?BIT?NOT?NULL)

    INSERT?INTO?USERS(username,password,enabled)?values(
    ' liuyxit ' , ' 123 ' , ' 1 ' )
    INSERT?INTO?USERS(username,password,enabled)?values(
    ' user1 ' , ' user1 ' , ' 1 ' )
    INSERT?INTO?USERS(username,password,enabled)?values(
    ' user2 ' , ' user2 ' , ' 0 ' )

    CREATE?TABLE?AUTHORITIES(
    USERNAME?VARCHAR(
    50 )?NOT?NULL,
    AUTHORITY?VARCHAR(
    50 )?NOT?NULL,
    CONSTRAINT?FK_AUTHORITIES_USERS?FOREIGN?KEY(USERNAME)?REFERENCES?USERS(USERNAME)
    );

    INSERT?INTO?AUTHORITIES(USERNAME,AUTHORITY)?values(
    ' liuyxit ' , ' ROLE_SUPERVISOR ' )
    INSERT?INTO?AUTHORITIES(USERNAME,AUTHORITY)?values(
    ' user1 ' , ' ROLE_USER ' )
    INSERT?INTO?AUTHORITIES(USERNAME,AUTHORITY)?values(
    ' user2 ' , ' ROLE_USER ' )

    這里我用的是acegi默認的數據結構,可以改只要你指定JdbcDaoImpl的authoritiesByUsernameQuery和usersByUsernameQuery屬性就可以了。另AUTHORITIES表也要一同加入,原因acegi獲得userDetail時,也會讀取這個表的內容,否則會拋“nested exception is java.sql.SQLException: 對象名 'authorities' 無效”這個異常。

    修改applicationContext.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:aop
    ="http://www.springframework.org/schema/aop"
    ???????xmlns:tx
    ="http://www.springframework.org/schema/tx"
    ???????xsi:schemaLocation
    ="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
    ???????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
    ???????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"

    ???????default-autowire
    ="byName" ?default-lazy-init ="true" >
    ????
    ????
    < bean? id ="dataSource" ?class ="org.springframework.jdbc.datasource.DriverManagerDataSource" >
    ????????
    < property? name ="driverClassName" >
    ????????????
    <!-- ?請自行修改為對應你的數據庫的驅動類? -->
    ????????????
    < value > net.sourceforge.jtds.jdbc.Driver </ value > ????????????
    ????????
    </ property >

    ????????
    < property? name ="url" >
    ????????????
    <!-- ?請自行修改為對應你的數據庫URL? -->
    ????????????
    < value > jdbc:jtds:sqlserver://localhost:1433/javauser </ value >
    ????????
    </ property >
    ????????
    < property? name ="username" >
    ????????????
    < value > sa </ value >
    ????????
    </ property >
    ????????
    < property? name ="password" >
    ????????????
    < value > javauser </ value >
    ????????
    </ property >
    ????
    </ bean >
    ??
    ????
    <!-- ?========================?FILTER?CHAIN?=======================? -->
    ????
    < bean? id ="filterChainProxy" ?class ="org.acegisecurity.util.FilterChainProxy" >
    ??????
    < property? name ="filterInvocationDefinitionSource" >
    ?????????
    < value >
    ????????????CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    ????????????PATTERN_TYPE_APACHE_ANT
    ????????????/**=authenticationProcessingFilter,logoutFilter,rememberMeProcessingFilter,exceptionTranslationFilter
    ?????????
    </ value >
    ??????
    </ property >
    ????
    </ bean > ???
    ????
    <!-- ?========================?認證filter?=======================? -->
    ???
    ????
    <!-- ?表單認證處理filter? -->
    ????
    < bean? id ="authenticationProcessingFilter" ?class ="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter" >
    ????????
    < property? name ="authenticationManager" ?ref ="authenticationManager" />
    ????????
    < property? name ="authenticationFailureUrl" ?value ="/acegilogin.jsp?login_error=1" />
    ????????
    < property? name ="defaultTargetUrl" ?value ="/userinfo.jsp" />
    ????????
    < property? name ="filterProcessesUrl" ?value ="/j_acegi_security_check" />
    ????
    </ bean >
    ????
    ????
    <!-- ?利用cookie自動登陸filter? -->
    ????
    < bean? id ="rememberMeProcessingFilter"
    ??????????class
    ="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter" >
    ????????
    < property? name ="authenticationManager"
    ??????????????????ref
    ="authenticationManager" />
    ????????
    < property? name ="rememberMeServices" ?ref ="rememberMeServices" />
    ????
    </ bean > ????
    ????
    < bean? id ="rememberMeServices"
    ??????????class
    ="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices" >
    ????????
    < property? name ="userDetailsService" ?ref ="jdbcDaoImpl" />
    ????????
    < property? name ="key" ?value ="javargb" />
    ????
    </ bean > ??
    ????
    < bean? id ="rememberMeAuthenticationProvider"
    ??????????class
    ="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider" >
    ????????
    < property? name ="key" ?value ="javargb" />
    ????
    </ bean > ???
    ????
    ????
    <!-- ?注銷處理filter? -->
    ????
    < bean? id ="logoutFilter" ?class ="org.acegisecurity.ui.logout.LogoutFilter" >
    ??????
    < constructor-arg? value ="/acegilogin.jsp" /> ? <!-- ?URL?redirected?to?after?logout? -->
    ??????
    < constructor-arg >
    ?????????
    < list >
    ??????????????
    < ref? bean ="rememberMeServices" />
    ??????????????
    < bean? class ="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
    ?????????
    </ list >
    ??????
    </ constructor-arg >
    ???
    </ bean >
    ????
    ???
    <!-- ?認證管理器? -->
    ???
    < bean? id ="authenticationManager" ?class ="org.acegisecurity.providers.ProviderManager" >
    ??????
    < property? name ="providers" > <!-- ?可有多個認證提供器,其中一個證通過就可以了? -->
    ?????????
    < list >
    ????????????
    < ref? local ="daoAuthenticationProvider" />
    ????????????
    < ref? local ="rememberMeAuthenticationProvider" />
    ?????????
    </ list >
    ??????
    </ property >
    ???
    </ bean > ???
    ????
    < bean? id ="daoAuthenticationProvider" ?class ="org.acegisecurity.providers.dao.DaoAuthenticationProvider" >
    ????????
    < property? name ="userDetailsService" ?ref ="jdbcDaoImpl" /> ????????
    ????
    </ bean > ????
    ????
    ????
    < bean? id ="jdbcDaoImpl" ?class ="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl" >
    ????????
    < property? name ="dataSource" >< ref? bean ="dataSource" /></ property >
    ????
    </ bean >
    ????
    ????
    <!-- ?異常處理filter? -->
    ????
    < bean? id ="exceptionTranslationFilter" ?class ="org.acegisecurity.ui.ExceptionTranslationFilter" >
    ????????
    < property? name ="authenticationEntryPoint" >
    ????????????
    < bean? class ="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint" >
    ????????????????
    < property? name ="loginFormUrl" ?value ="/acegilogin.jsp" />
    ????????????????
    < property? name ="forceHttps" ?value ="false" />
    ????????????
    </ bean >
    ????????
    </ property >
    ????????
    < property? name ="accessDeniedHandler" >
    ????????????
    < bean? class ="org.acegisecurity.ui.AccessDeniedHandlerImpl" >
    ????????????????
    < property? name ="errorPage" ?value ="/accessDenied.jsp" />
    ????????????
    </ bean >
    ????????
    </ property >
    ????
    </ bean > ????
    </ beans >

    這時userDetailsService是通過實現類jdbcDaoImpl從數據庫獲得用戶資料來作認證比較。

    OK,大功告成。

    后記:很少寫技術文章,除了要堅持之外,文筆和思路都很重要。感覺自己的寫作水平太差了,希望大家指出不合理的地方。有時間我會再寫后篇《學習Acegi-授權(authorization)》,感謝大家把拙文看完,TKS!

    posted on 2007-02-07 14:14 三刀流の逆風 閱讀(1949) 評論(3)  編輯  收藏 所屬分類: acegi

    FeedBack:
    # re: 學習Acegi-認證(authentication)
    2007-02-07 14:40 | lang
    老大,把源碼也貼在這吧!兄弟比較懶啊!  回復  更多評論
      
    # re: 學習Acegi-認證(authentication)
    2007-04-06 16:03 | 成長
    感謝,很有用
      回復  更多評論
      
    # re: 學習Acegi-認證(authentication)
    2007-10-11 10:54 | 小樣
    您有acegi+cas 整合的例子嗎?有的話給我郵箱發一個 `
    252792733@qq.com
    謝謝 `!!!  回復  更多評論
      

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 久久久久久久99精品免费| 亚洲欧洲无卡二区视頻| 亚洲成a人片在线观看日本| 亚洲精品麻豆av| 久久久久亚洲AV成人网人人网站 | 免费A级毛片av无码| 又粗又长又爽又长黄免费视频| 久久精品国产亚洲av成人| 亚洲人精品午夜射精日韩 | 精品国产污污免费网站入口| 美女裸免费观看网站| 日韩免费在线中文字幕| 亚州**色毛片免费观看| 两性色午夜视频免费播放| 精品免费视在线观看| 久久永久免费人妻精品| 很黄很黄的网站免费的| 夭天干天天做天天免费看| 国产在线19禁免费观看| 国产亚洲精品久久久久秋霞| 久久伊人久久亚洲综合| 亚洲毛片免费视频| 亚洲私人无码综合久久网| 日韩在线视精品在亚洲| 国产美女视频免费观看的网站| 亚洲日韩久久综合中文字幕| 亚洲免费网站观看视频| 草久免费在线观看网站| 91视频免费网站| 日本人的色道免费网站| 国产jizzjizz免费看jizz| 亚洲人成77777在线播放网站| 免费播放特黄特色毛片| 亚洲乱码中文字幕久久孕妇黑人| 精品国产精品久久一区免费式| 久久精品无码专区免费东京热| 国产精品福利片免费看| 日韩免费无码一区二区三区 | 色窝窝亚洲AV网在线观看| 男人和女人高潮免费网站| 无码精品人妻一区二区三区免费看|