隨筆-18  評論-8  文章-0  trackbacks-0

          安全域
          這是Tomcat服務(wù)器用來保護(hù)Web應(yīng)用資源的一種機(jī)制。一個用戶可以擁有一個或多個角色,每個角色限定了可訪問的Web資源,這樣就將用戶和Web資源對應(yīng)起來了。在org.apache.catalina.Realm接口中聲名了將用戶名、口令和角色相管理的方法,Tomcat5提供了4個實(shí)現(xiàn)這一接口的類,分別為:MemoryRealm(XML文件讀取)、JDBCRealm(JDBC驅(qū)動程序讀取)、DataSourceRealm(JNDI數(shù)據(jù)源讀取)、JNDIRealm(JNDI provider讀取LDAP的目錄服務(wù)器信息)。

          Web資源的設(shè)置
          需要在web.xml文件中加入<security-constraint>、<login-config>、<security-role>元素。
          例如在Tomcat的admin應(yīng)用中的配置:

          <security-constraint>
              <display-name>Tomcat Server Configuration Security Constraint</display-name>
              <web-resource-collection>
              <web-resource>Protected Area</web-resource>
                  <url-pattern>*.htm</url-pattern>
                  <url-pattern>*.jsp</url-pattern>
                  <url-pattern>*.do</url-pattern>
              </web-resource-collection>
              <auth-constraint>
                  <role-name>admin</role-name>
              </auth-constraint>
          </security-constraint>

          上面的代碼表明:只有admin角色才能訪問admin應(yīng)用中的*.jsp、*.do和*.html資源。
          另一個例子是jsp-examples應(yīng)用:

          <sercurity-constraint>
              <display-name>Tomcat Server Configuration Security Constraint</display-name>
              <web-resource-collection>
                  <web-resource>Protected Area</web-resource>
                  <url-pattern>/security/protected/*</url-pattern>
                  <http-method>DELETE</http-method>
               
          <http-method>GET</http-method>
               
          <http-method>POST</http-method>
               
          <http-method>PUT</http-method>
              </web-resource-collection>
              <auth-constraint>
                  <role-name>tomcat</role-name>
               
          <role-name>role1</role-name>
              
          </auth-constraint>
          </security-constraint>

          上面的代碼表明:只要tomcat和role1角色才可以以DELETE、GET、POST和GET方式訪問jsp-exzmples應(yīng)用URL為/security/protected/下的資源。
          在web.xml中加入<login-config>元素-系統(tǒng)會以對話框的方式進(jìn)行登陸

          <login-config>
              <auth-method>FORM</auth-method>
           
          <realm-name>Tomcat Configuration Form-Baseed Authenticaton Area</realm-name>
           
          <from-login-config>
                 
          <from-login-page>/login/login.jsp</from-login-page>
              
          <from-error-page>/error.jsp</from-error-page>
           
          <from-login-config>
          </login-config>

          <auth-method>有三個可選項:BASIC、DIGEST、FORM。
          BASIC-基本驗證:訪問受保護(hù)資源時,會彈出一對話框。要求輸入用戶名和密碼,如果連續(xù)3次失敗后,會顯示一個錯誤頁面。這個方法的缺點(diǎn)是用戶名和密碼的數(shù)據(jù)傳輸采用的是Base64編碼(可讀文本),是非常不安全的。
          DIGEST-摘要驗證:數(shù)據(jù)采用MD5對用戶名和密碼進(jìn)行加密,然后再傳輸,顯然這種方法很安全。
          FORM-表單驗證:可以使用自定義的登陸頁面,但用戶名對應(yīng)的文本框名稱必須是j_username,密碼為j_password,且表單action值為j_security_check。
          在web.xml中加入<security-role>元素-指明這個Web應(yīng)用應(yīng)用的所有角色的名字

          <security-role>
              <description>The role that is required to lon in to the Administration Application.</description>
           
          <role-name>admin</role-name>
           
          <role-name>friend</role-name>
          </security-role>

          你可以調(diào)用HttpRequeset接口的getRemoteUser()方法返回當(dāng)前用戶的名字:<%=request.getRemoteUser()%>


          內(nèi)存域-由org.apache.catalina.realm.MemoryRelam類實(shí)現(xiàn)
          小貓啟動時,自動讀取<%CATALINA_HOME%>/conf/tomcat-users.xml文件,要在Web應(yīng)用中使用,可以在對應(yīng)的<Context>元素內(nèi)加入如下內(nèi)容:<Realm className="org.apache.catalina.realm.MemoryRelam"/>

          JDBC域-通過JDBC驅(qū)動從數(shù)據(jù)庫中直接讀取驗證信息,通過驗證后,信息會存儲在session中。
          在mysql中新建兩張表:

          create table users{user_name varchar(15not null primary key,user_pass varchar(15not null };
          create table usr_roles{usr_name varchar(15not null,role_name varchar(15not null,
            primary key(user_name,role_name)};

          然后在server.xml中加入:

          <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" 
                       debug
          ="0" connectionURL="jdbc:mysql://localhost/tomcatusers" connectionName="roor" 
                       connectonPassword
          ="" userTable="users" userNameCol="user_name" 
                       userCredCol
          ="user_pass" userRoleTable="user_roles" roleNameCol="role_name">

          DataSource域-和JDBC域很類似,只不過訪問數(shù)據(jù)庫的方式不同,這個是使用JNDI DataSource來訪問數(shù)據(jù)庫的。
          先在web.xml中加入安全約束,在和JDBC域一樣新建兩張表,然后在server.xml文件的<GlobalNamingResources>元素下添加如下內(nèi)容:

          <Resource name="jdbc/tomcatusers" auth="Container" type="javx.sql.DataSource"/>
          <ResourceParams name="jdbc/tomcatusers">
              <parameter>
              
          <name>factory</name>
              
          <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
           
          </parameter>
           
          <parameter>
               
          <name>maxActiove</name>
              
          <value>100</value>
           
          </parameter>
           
          <parameter>
              
          <name>maxIdle</name>
              
          <value>30</value>
           
          </parameter>
           
          <parameter>
               
          <name>maxWait</name>
              
          <value>10000</value>
           
          </parameter>
           
          <parameter>
               
          <name>username</name>
               
          <value>root</value>
           
          </parameter>
           
          <parameter>
               
          <name>password</name>
              
          <value></value>
           
          </parameter>
           
          <parameter>
               
          <name>driverClassName</name>
              
          <value>com.mysql.jdbc.Driver</value>
           
          </parameter>
           
          <parameter>
               
          <name>url</name>
              
          <value>jdbc:mysql://localhost/tomcatusers?autoReconnect=true</value>
            
          </parameter>
          </ResourceParams>

          注意:Tomcat的JNDI資源必須配置在<GlobalNamingResources>元素下,服務(wù)器才能找到,否則會出現(xiàn)NameNotFoundException;低于Tomcat5.0.12的版本,即使正確配置了DataSourceRealm,也會出現(xiàn)找不到JNDI DataSource的異常,這個小貓的一個bug;在web.xml中是不需要配置<resource-ref>元素的,因為Web應(yīng)用并不會訪問這個DataSource。
          當(dāng)然server.xml還需要添加和JDBC域幾乎相同的代碼:

          <Realm className="org.apache.catalina.realm.DataSourceRealm" 
                       driverName
          ="com.mysql.jdbc.Driver" debug="0" 
                       connectionURL
          ="jdbc:mysql://localhost/tomcatusers" connectionName="roor" 
                       connectonPassword
          ="" userTable="users" userNameCol="user_name" 
                       userCredCol
          ="user_pass" userRoleTable="user_roles" roleNameCol="role_name">

          Tomcat閥
          由org.apache.Catalina.Value接口定義,能夠?qū)atalina容器接收的HTTP Request進(jìn)行預(yù)處理,是小貓?zhí)赜械墓δ埽梢约尤氲?種容器中(Engine、Host、Context)。

          客戶訪問日志閥(Access Log Value)- 能夠?qū)⒖梢缘腞equest信息寫入到日志中。可以記錄頁面訪問的次數(shù)、用戶Session活動和用戶驗證信息等。
          例如:<Value className="org.apache.catalina.AccessLogValue" directory="logs" prifix="localhost_access_log" suffix=".txt" pattern="%h%l%u%t%s%r%s%b" resolveHost="true">
          上面的pattern值可以用common,一個默認(rèn)的值。
          pattern屬性規(guī)定日志的格式和內(nèi)容:%a-遠(yuǎn)程IP地址;%A-本地IP地址;%b-發(fā)送的字節(jié)數(shù),不包括HTTP Header;%h-遠(yuǎn)程主機(jī)名;%H-客戶請求所用的協(xié)議;%l-"-";%m-請求的方法;%p-接受請求的本地服務(wù)器斷開;%q-查詢字符串;%r-用戶請求的第一行內(nèi)容;%s-響應(yīng)HTTP Request的狀態(tài)碼;%S-用戶Session ID;%t-時間;%u-驗證的用戶名;%U-請求URL路徑;%v-本地服務(wù)器名。

          遠(yuǎn)程地址過濾器(Remote Address Filter)-根據(jù)IP地址決定是否接受客戶的請求。
          例如:<Value className="org.apache.catalina.RemoteAddrValue" allow="127.0.0.1" deny="127.111.*"/>

          遠(yuǎn)程主機(jī)過濾器(Remot Host Filter)-根據(jù)主機(jī)名決定是否接受請求。
          <Value className="org.apache.catalina.RemoteHostValue" allow="localhost" deny="monster*"/>

          客戶請求記錄器(Request Dumper)-把客戶請求的詳細(xì)信息記錄在日志文件中,這里的日志文件是指<Logger>元素。
          假定在server.xml中l(wèi)ocalhost的<Host>元素下已經(jīng)配置了<Logger>元素:

          <Logger className="org.apache.catalina.logger.FileLogger" directory="logs" prefix="localhos_log." 
                        suffix
          =".txt" timestamp="true"/>

          然后再添加<Value>元素:

          <Value className="org.apache.catalina.RequestDumperValue"/>


          參考:《Tomcat與JavaWeb開發(fā)技術(shù)詳解》

          posted on 2005-02-16 23:29 阿姆斯壯 閱讀(1530) 評論(0)  編輯  收藏 所屬分類: 基礎(chǔ)很重要
          主站蜘蛛池模板: 营口市| 敖汉旗| 郁南县| 长乐市| 延津县| 贵德县| 建瓯市| 太谷县| 霞浦县| 西峡县| 四会市| 曲松县| 凌海市| 阳东县| 赤峰市| 正蓝旗| 鄄城县| 岳阳市| 兴文县| 大英县| 东阳市| 杨浦区| 台中市| 石柱| 城固县| 博白县| 郯城县| 彰武县| 屏山县| 杭锦后旗| 山西省| 台东县| 阳西县| 霍城县| 南昌县| 遂平县| 和平县| 资中县| 崇州市| 清涧县| 通道|