7

我试图在 Tomcat 7.0.32 中嵌套 Realms 如下(这里用伪 XML 编写):

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

这似乎不起作用 - 是否可以在 Tomcat 中将 Realms 嵌套两个以上的级别?我在日志中收到警告:

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

背后的想法是,Web 服务有一些不能被锁定的关键用户(例如作为 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>
4

2 回答 2

3

现在的新答案是:

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

Christopher Schultz 非常友好地将我的问题转发到 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>

...

当然,您也可以使用其他领域和其他组合。

请注意,日志中可能会产生误导:在此构造中,如果为存储在主要领域中的关键用户之一提供了错误密码,则主要领域拒绝访问,然后尝试通过锁定领域的辅助领域并也拒绝访问最终锁定用户名。这被锁定领域记录为警告“尝试对锁定的用户进行身份验证......”。仍然使用正确的密码,访问通过主要领域继续工作,因为它不通过锁定领域。即所有工作都按预期工作,只是日志消息可能会导致混乱(当然这是不可能避免的)。

于 2013-01-31T14:23:20.593 回答
3

Apache commons-digester 用于解析配置文件,所以我怀疑这个特殊的用例根本不是预期的。

Tomcatorg.apache.catalina.startup.RealmRuleSet.addRuleInstances似乎只能进行 2 级深度的Realm配置。似乎很简单,可以在其中添加另一层。

我必须看看如何配置消化器以查看是否可以支持任意级别,或者是否必须手动配置某些子集。

随意前往Tomcat 用户列表请求此类更改。

于 2012-11-08T19:58:56.217 回答