2012-11-07 103 views
7

我試圖巢國度在Tomcat的7.0.32如下(這裏寫的僞XML):的Tomcat 7築巢CombinedRealm,LockoutRealm和DataSourceRealm

<CombinedRealm> 
    <LockoutRealm> 
    <DataSourceRealm/> 
    </LockoutRealm> 
    <UserDatabaseRealm/> 
</CombinedRealm> 

這似乎並不工作 - 是有可能在Tomcat中將Realm嵌套兩個以上的級別?我得到一個警告在日誌中:

No rules found matching 'Server/Service/Engine/Realm/Realm/Realm'. 

背後的想法是,網絡服務具有一定不會像在一些挑剔的用戶(例如,作爲DOS)和一些普通用戶,這可能有弱密碼, lockoutRealm應該處於活動狀態。我相信其他人一直處於這種情況。

如果還有其他方法可以實現這一點(例如LockoutRealm的白名單),請告訴我。

單點登錄也是需要的。

我猜想用現有的LockoutRealm代碼與一個永遠不會鎖定的帳戶列表是一個選項,但我並不那麼熱衷於編寫自己的Realm,我寧願不在該級別上向Tomcat添加自定義代碼,因爲這會使其他人的設置變得複雜,並且隨着每個Tomcat更新可能會崩潰等。

感謝您的幫助!

這裏是我的測試配置的server.xml中的相關部分:

<Engine name="Catalina" defaultHost="localhost"> 

    <Realm className="org.apache.catalina.realm.CombinedRealm"> 

    <!-- Lockout realm for the DB users --> 
    <Realm className="org.apache.catalina.realm.LockOutRealm"> 
     <!-- PRIMARY: DataSourceRealm with user DB --> 
     <Realm className="org.apache.catalina.realm.DataSourceRealm" 
     dataSourceName="jdbc/authority" 
     userTable="user" userNameCol="username" 
     userCredCol="password" digest="SHA" 
     userRoleTable="user_role" roleNameCol="rolename" /> 
    </Realm> 

    <!-- FALLBACK: 
     This Realm uses the UserDatabase configured in the global JNDI 
     resources under the key "UserDatabase". Any edits 
     that are performed against this UserDatabase are immediately 
     available for use by the Realm. --> 
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
      resourceName="UserDatabase"/> 

    </Realm> 

    <Host name="localhost" appBase="webapps" 
     unpackWARs="true" autoDeploy="true"> 

    <!-- SingleSignOn valve, share authentication between web applications 
     Documentation at: /docs/config/valve.html --> 
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" /> 

    <!-- Access log processes all example. 
     Documentation at: /docs/config/valve.html 
     Note: The pattern used is equivalent to using pattern="common" --> 
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" 
      prefix="localhost_access_log." suffix=".txt" 
      pattern="%h %l %u %t &quot;%r&quot; %s %b" /> 

    </Host> 
</Engine> 

回答

3

新的答案現在是:

更新到Tomcat 7.0.33或更高版本。然後它完美地工作。

克里斯托弗舒爾茨非常友好,可以將我的問題轉發到Tomcat用戶列表。偉大的Tomcat開發人員已經立即解決了這個問題,並將其放入下一個版本。非常感謝!

所以,你現在可以使用一個建築像一個在問題或像這樣用不同的順序/「優先」:

... 

<Engine name="Catalina" defaultHost="localhost"> 

    <Realm className="org.apache.catalina.realm.CombinedRealm"> 

    <!-- PRIMARY: tomcat-users.xml with critical system users 
        that should always work, DB independent and without lockout 
        NOTE: If the wrong password is given, the secondary path with 
         lockout is still attempted, so that a lockout on that path 
         will still occur and be logged. Still the primary path is not 
         locked for access by that happening.       --> 
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" 
      resourceName="UserDatabase"/> 

    <!-- SECONDARY: DataSourceRealm with DB with lockout functionality --> 
    <!-- (three level nesting of realms requires Tomcat >= 7.0.33)  --> 
    <Realm className="org.apache.catalina.realm.LockOutRealm" 
     failureCount="5" lockOutTime="60" > <!-- note that when an account is locked correct password 
               login is no longer possible (would otherwise defeat purpose of lockout), 
               but also lockoutTime is still reset in each correct attempt --> 

     <Realm className="org.apache.catalina.realm.DataSourceRealm" 
     dataSourceName="jdbc/authority" 
     userTable="user" userNameCol="username" 
     userCredCol="password" digest="SHA" 
     userRoleTable="user_role" roleNameCol="rolename" /> 

    </Realm> 

    </Realm> 

    <Host > 

    ... 

    </Host> 
</Engine> 

... 

當然你也可以使用其他領域和其他組合。

請注意,有一件事可能會在日誌中產生誤導:在此構造中,如果爲主域中存儲的關鍵用戶之一提供了錯誤密碼,則主域拒絕訪問,則通過鎖定次域域被嘗試並且也拒絕訪問,最終鎖定用戶名。鎖定領域記錄了這一點,作爲警告「試圖驗證鎖定的用戶...」。仍然有正確的密碼,訪問通過主領域繼續工作,因爲它不通過鎖定領域。即全部按預期工作,只是日誌消息可能導致混淆(當然這是不可能避免的)。

3

阿帕奇公地沼氣池用於解析配置文件,所以我懷疑這個特定用例根本沒有料到。

Tomcat的org.apache.catalina.startup.RealmRuleSet.addRuleInstances似乎只能在Realm的配置下進行2級深度操作。似乎很簡單,在那裏添加另一個圖層。

我不得不看看蒸煮器是如何配置的,看是否可以支持任意水平,或者是否需要手動配置某些子集。

請隨時前往Tomcat users' list申請此類更改。

+0

克里斯托弗,非常感謝您的出色答案!我還會看看用戶列表(這可能是我在那裏訂閱的時候了,只有我必須使用太多不同的技術來訂閱所有的用戶列表......)。聽起來像我將無法避免更改/擴展Tomcat代碼,除非官方代碼在不久的將來會支持任意嵌套級別。如果我需要開始更改Tomcat代碼,我可能更願意使用用戶名排除選項來擴展LockoutRealm,或者您是否知道是否存在類似的東西?謝謝! – FelixD

+0

我已經記錄了一個[bug報告](https://issues.apache.org/bugzilla/show_bug.cgi?id=54141)。 –

+0

非常感謝克里斯託弗!對不起,我自己沒有這樣做,現在有點緊張... – FelixD