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

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

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

    Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計(jì)

    留言簿(23)

    積分與排名

    優(yōu)秀學(xué)習(xí)網(wǎng)站

    友情連接

    閱讀排行榜

    評(píng)論排行榜

    用Acegi為你的Spring應(yīng)用加把鎖!(zhuan)

    http://www.blogcn.com.cn/user1/2313/archives/2005/11791.shtml
    {簡(jiǎn)介]

    對(duì)于一個(gè)典型的Web應(yīng)用,完善的認(rèn)證和授權(quán)機(jī)制是必不可少的,在SpringFramework中,Juergen Hoeller提供的范例JPetStore給了一些這方面的介紹,但還遠(yuǎn)遠(yuǎn)不夠,Acegi是一個(gè)專(zhuān)門(mén)為SpringFramework提供安全機(jī)制的 項(xiàng)目,全稱(chēng)為Acegi Security System for Spring,當(dāng)前版本為0.5.1,就其目前提供的功能,應(yīng)該可以滿(mǎn)足絕大多數(shù)應(yīng)用的需求。

    本文的主要目的是希望能夠說(shuō)明如何在基于Spring構(gòu)架的Web應(yīng)用中使用Acegi,而不是詳細(xì)介紹其中的每個(gè)接口、每個(gè)類(lèi)。注意,即使對(duì)已經(jīng)存在的Spring應(yīng)用,通過(guò)下面介紹的步驟,也可以馬上享受到Acegi提供的認(rèn)證和授權(quán)。


    [基礎(chǔ)工作]

    在你的Web應(yīng)用的lib中添加Acegi下載包中的acegi-security.jar

    [web.xml]
    實(shí)現(xiàn)認(rèn)證和授權(quán)的最常用的方法是通過(guò)filter,Acegi亦是如此,通常Acegi需要在web.xml添加以下5個(gè)filter:

    <filter>
      <filter-name>Acegi Channel Processing Filter</filter-name>
      <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
      <init-param>
        <param-name>targetClass</param-name>
        <param-value>net.sf.acegisecurity.securechannel.ChannelProcessingFilter</param-value>
      </init-param>
    </filter>
    <filter>
      <filter-name>Acegi Authentication Processing Filter</filter-name>
      <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
      <init-param>
        <param-name>targetClass</param-name>
        <param-value>net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter</param-value>
      </init-param>
    </filter>
    <filter>
      <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
      <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
      <init-param>
        <param-name>targetClass</param-name>
        <param-value>net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter</param-value>
      </init-param>
    </filter>
    <filter>
      <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
      <filter-class>net.sf.acegisecurity.ui.AutoIntegrationFilter</filter-class>
    </filter>
    <filter>
      <filter-name>Acegi HTTP Request Security Filter</filter-name>
      <filter-class>net.sf.acegisecurity.util.FilterToBeanProxy</filter-class>
      <init-param>
        <param-name>targetClass</param-name>
        <param-value>net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter</param-value>
      </init-param>
    </filter>

    最先引起迷惑的是net.sf.acegisecurity.util.FilterToBeanProxy,Acegi自己的文檔上解釋是: “What  FilterToBeanProxy does is delegate the Filter's methods through to a bean which is obtained from the
    Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.”,如希望深究的話,去看看源代碼應(yīng)該不難理解。

    再下來(lái)就是添加filter-mapping了:
    <filter-mapping>
      <filter-name>Acegi Channel Processing Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
      <filter-name>Acegi Authentication Processing Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
      <filter-name>Acegi HTTP BASIC Authorization Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
      <filter-name>Acegi Security System for Spring Auto Integration Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter-mapping>
      <filter-name>Acegi HTTP Request Security Filter</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    這里,需要注意以下兩點(diǎn):
    1) 這幾個(gè)filter的順序是不能更改的,順序不對(duì)將無(wú)法正常工作;
    2) 如果你的應(yīng)用不需要安全傳輸,如https,則將"Acegi Channel Processing Filter"相關(guān)內(nèi)容注釋掉即可;
    3) 如果你的應(yīng)用不需要Spring提供的遠(yuǎn)程訪問(wèn)機(jī)制,如Hessian and Burlap,將"Acegi HTTP BASIC Authorization
    Filter"相關(guān)內(nèi)容注釋掉即可。

    [applicationContext.xml]
    接下來(lái)就是要添加applicationContext.xml中的內(nèi)容了,從剛才FilterToBeanFactory的解釋可以看出,真正的filter都
    在Spring的applicationContext中管理:

    1) 首先,你的數(shù)據(jù)庫(kù)中必須具有保存用戶(hù)名和密碼的table,Acegi要求table的schema必須如下:

    CREATE TABLE users (
        username VARCHAR(50) NOT NULL PRIMARY KEY,
        password VARCHAR(50) NOT NULL,
        enabled BIT NOT NULL
    );
    CREATE TABLE authorities (
        username VARCHAR(50) NOT NULL,
        authority VARCHAR(50) NOT NULL
    );
    CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority );
    ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users
    (username);

    2) 添加訪問(wèn)你的數(shù)據(jù)庫(kù)的datasource和Acegi的jdbcDao,如下:

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
      <property name="driverClassName"><value>${jdbc.driverClassName}</value></property>
      <property name="url"><value>${jdbc.url}</value></property>
      <property name="username"><value>${jdbc.username}</value></property>
      <property name="password"><value>${jdbc.password}</value></property>
    </bean>
    <bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
      <property name="dataSource"><ref bean="dataSource"/></property>
    </bean>


    3) 添加DaoAuthenticationProvider:

    <bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider">
      <property name="authenticationDao"><ref bean="authenticationDao"/></property>
      <property name="userCache"><ref bean="userCache"/></property>
    </bean>

    <bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache">
      <property name="minutesToIdle"><value>5</value></property>
    </bean>


    如果你需要對(duì)密碼加密,則在daoAuthenticationProvider中加入:<property name="passwordEncoder"><ref
    bean="passwordEncoder"/></property>,Acegi提供了幾種加密方法,詳細(xì)情況可看包
    net.sf.acegisecurity.providers.encoding

    4) 添加authenticationManager:

    <bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager">
      <property name="providers">
        <list>
          <ref bean="daoAuthenticationProvider"/>
        </list>
       </property>
    </bean>


    5) 添加accessDecisionManager:

    <bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased">
      <property name="allowIfAllAbstainDecisions">
        <value>false</value>
      </property>
      <property name="decisionVoters">
        <list><ref bean="roleVoter"/></list>
      </property>
    </bean>
    <bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/>

    6) 添加authenticationProcessingFilterEntryPoint:

    <bean id="authenticationProcessingFilterEntryPoint"
    class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
      <property name="loginFormUrl"><value>/acegilogin.jsp</value></property>
      <property name="forceHttps"><value>false</value></property>
    </bean>


    其中acegilogin.jsp是登陸頁(yè)面,一個(gè)最簡(jiǎn)單的登錄頁(yè)面如下:

    <%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %>
    <%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %>
    <%@ page import="net.sf.acegisecurity.AuthenticationException" %>
    <html>
      <head>
        <title>Login</title>
      </head>

      <body>
        <h1>Login</h1>
        <form action="<c:url value='j_acegi_security_check'/>" method="POST">
          <table>
            <tr><td>User:</td><td><input type='text' name='j_username'></td></tr>
            <tr><td>Password:</td><td><input type='password' name='j_password'></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) 添加filterInvocationInterceptor:

    <bean id="filterInvocationInterceptor"
    class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor">
      <property name="authenticationManager">
        <ref bean="authenticationManager"/>
      </property>
      <property name="accessDecisionManager">
        <ref bean="accessDecisionManager"/>
      </property>
      <property name="objectDefinitionSource">
        <value>
          CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
          \A/sec/administrator.*\Z=ROLE_SUPERVISOR
          \A/sec/user.*\Z=ROLE_TELLER
        </value>
      </property>
    </bean>


    這里請(qǐng)注意,要objectDefinitionSource中定義哪些頁(yè)面需要權(quán)限訪問(wèn),需要根據(jù)自己的應(yīng)用需求進(jìn)行修改,我上面給出
    的定義的意思是這樣的:
     a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比較請(qǐng)求路徑時(shí)全部轉(zhuǎn)換為小寫(xiě)
     b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有權(quán)限為ROLE_SUPERVISOR才能訪問(wèn)/sec/administrator*的頁(yè)面
     c. \A/sec/user.*\Z=ROLE_TELLER意思是只有權(quán)限為ROLE_TELLER的用戶(hù)才能訪問(wèn)/sec/user*的頁(yè)面

    8) 添加securityEnforcementFilter:

    <bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter">
      <property name="filterSecurityInterceptor">
        <ref bean="filterInvocationInterceptor"/>
      </property>
      <property name="authenticationEntryPoint">
        <ref bean="authenticationProcessingFilterEntryPoint"/>
      </property>
    </bean>

    9) 添加authenticationProcessingFilter:

    <bean id="authenticationProcessingFilter"
    class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
      <property name="authenticationManager">
        <ref bean="authenticationManager"/>
      </property>
      <property name="authenticationFailureUrl">
        <value>/loginerror.jsp</value>
      </property>
      <property name="defaultTargetUrl">
        <value>/</value>
      </property>
      <property name="filterProcessesUrl">
        <value>/j_acegi_security_check</value>
      </property>
    </bean>

    其中authenticationFailureUrl是認(rèn)證失敗的頁(yè)面。

    10) 如果需要一些頁(yè)面通過(guò)安全通道的話,添加下面的配置:

    <bean id="channelProcessingFilter" class="net.sf.acegisecurity.securechannel.ChannelProcessingFilter">
      <property name="channelDecisionManager">
        <ref bean="channelDecisionManager"/>
      </property>
      <property name="filterInvocationDefinitionSource">
        <value>
          CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
          \A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL
          \A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL
          \A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL
          \A.*\Z=REQUIRES_INSECURE_CHANNEL
        </value>
      </property>
    </bean>

    <bean id="channelDecisionManager" class="net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl">
      <property name="channelProcessors">
        <list>
          <ref bean="secureChannelProcessor"/>
          <ref bean="insecureChannelProcessor"/>
        </list>
      </property>
    </bean>
    <bean id="secureChannelProcessor" class="net.sf.acegisecurity.securechannel.SecureChannelProcessor"/>
    <bean id="insecureChannelProcessor" class="net.sf.acegisecurity.securechannel.InsecureChannelProcessor"/>


    [缺少了什么?]
    Acegi目前提供了兩種"secure object",分別對(duì)頁(yè)面和方法進(jìn)行安全認(rèn)證管理,我這里介紹的只是利用
    FilterSecurityInterceptor對(duì)訪問(wèn)頁(yè)面的權(quán)限控制,除此之外,Acegi還提供了另外一個(gè)Interceptor——
    MethodSecurityInterceptor,它結(jié)合runAsManager可實(shí)現(xiàn)對(duì)對(duì)象中的方法的權(quán)限控制,使用方法可參看Acegi自帶的文檔
    和contact范例。

    [最后要說(shuō)的]
    本來(lái)以為只是說(shuō)明如何使用Acegi而已,應(yīng)該非常簡(jiǎn)單,但真正寫(xiě)起來(lái)才發(fā)現(xiàn)想要條理清楚的理順?biāo)行枰腷ean還是很
    困難的,但愿我沒(méi)有遺漏太多東西,如果我的文章有什么遺漏或錯(cuò)誤的話,還請(qǐng)參看Acegi自帶的quick-start范例,但請(qǐng)
    注意,這個(gè)范例是不能直接拿來(lái)用的

    posted on 2006-02-24 11:06 都市淘沙者 閱讀(711) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Spring+Struts+Hibernate

    主站蜘蛛池模板: 30岁的女人韩剧免费观看| 亚洲国产一区二区a毛片| 免费无码AV片在线观看软件| 中文字幕免费在线看| 色窝窝亚洲AV网在线观看| 亚洲欧洲自拍拍偷综合| 久久精品夜色国产亚洲av| 国产成人毛片亚洲精品| 国产免费啪嗒啪嗒视频看看| 四虎永久在线精品免费网址 | 日本人的色道免费网站| 中文字幕免费在线观看动作大片| 国产av无码专区亚洲av毛片搜| 日韩亚洲人成在线| 亚洲乱码无限2021芒果| 亚洲国产精品张柏芝在线观看| 水蜜桃亚洲一二三四在线| 国产亚洲综合一区柠檬导航| 亚洲天堂中文字幕在线| 亚洲国产精品第一区二区三区| 免费无码黄网站在线观看| 思思99re66在线精品免费观看| 无码免费午夜福利片在线 | 亚洲AV一宅男色影视| 在线观看午夜亚洲一区| 久久久久久久亚洲精品| 国产精品亚洲综合一区| 国产成人99久久亚洲综合精品| 亚洲国产精品一区二区第一页免 | 色欲色欲天天天www亚洲伊| 亚洲人成电影网站色| 亚洲精品理论电影在线观看| 亚洲色偷精品一区二区三区| 亚洲精品免费网站| 亚洲日韩中文字幕无码一区| 亚洲国产精品日韩av不卡在线 | 国产免费131美女视频| 国产午夜影视大全免费观看| 四虎永久在线免费观看| 亚洲综合色视频在线观看| 亚洲国产一成人久久精品|