2012-11-07 24 views
7

Tôi đang cố gắng để Realms tổ như sau trong Tomcat 7.0.32 (viết ở đây trong pseudo-XML):Tomcat 7 tổ CombinedRealm, LockoutRealm và DataSourceRealm

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

này dường như không làm việc - được có thể làm tổ ở cõi Tomcat bằng hơn hai cấp độ? Tôi nhận được một cảnh báo trong các bản ghi:

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

Ý tưởng đằng sau là các dịch vụ web có một số người dùng quan trọng là không được khóa ra (ví dụ như một hệ điều hành DOS) và một số người dùng bình thường, có thể có mật khẩu yếu, nơi lockoutRealm sẽ hoạt động. Tôi chắc rằng những người khác đã ở trong tình huống này.

Nếu có cách khác để đạt được điều này (ví dụ: danh sách cho phép của LockoutRealm), vui lòng cho tôi biết.

Đăng nhập một lần cũng là cần thiết.

Tôi đoán việc mở rộng mã LockoutRealm hiện tại bằng danh sách tài khoản không bao giờ khóa sẽ là một tùy chọn, nhưng tôi không muốn viết lĩnh vực của riêng mình, tôi không muốn thêm mã tùy chỉnh ở cấp đó vào Tomcat , vì điều này sẽ làm phức tạp thiết lập cho người khác và với mọi bản cập nhật Tomcat, nó có thể bị hỏng, v.v.

Cảm ơn bạn đã trợ giúp!

Dưới đây là phần có liên quan của server.xml của cấu hình thử nghiệm của tôi:

<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> 

Trả lời

3

Câu trả lời mới bây giờ là:

Update để Tomcat 7.0.33 hoặc sau đó. Sau đó, nó hoạt động hoàn hảo.

Christopher Schultz rất thân thiện để chuyển tiếp câu hỏi của tôi ở đây đến danh sách người dùng Tomcat. Các nhà phát triển Tomcat lớn đã ngay lập tức giải quyết vấn đề và đưa điều này vào bản phát hành tiếp theo. Cảm ơn rất nhiều!

Vì vậy, bây giờ bạn có thể sử dụng một cấu trúc giống như một trong câu hỏi hay như thế này với thứ tự khác nhau/"ưu tiên":

... 

<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> 

... 

Tất nhiên bạn cũng có thể sử dụng Realms khác và kết hợp khác. Lưu ý rằng một điều có thể gây hiểu lầm trong nhật ký: Trong cấu trúc này, nếu một mật khẩu sai được đưa ra cho một trong những người dùng quan trọng được lưu trữ trong lĩnh vực chính, thì lĩnh vực chính sẽ từ chối truy cập, sau đó là lĩnh vực thứ cấp thông qua khóa lĩnh vực được thử và cũng từ chối truy cập cuối cùng khóa tên người dùng.Điều này được ghi lại bởi lĩnh vực lockout như một cảnh báo "Một nỗ lực đã được thực hiện để xác thực người dùng bị khóa ...". Vẫn với mật khẩu chính xác, quyền truy cập tiếp tục hoạt động thông qua lĩnh vực chính, vì nó không đi qua lĩnh vực khóa. I E. tất cả các công trình như dự định, chỉ cần thông điệp tường trình có thể dẫn đến nhầm lẫn (tất nhiên điều này là không thể tránh).

3

Apache commons-phân hủy được sử dụng để phân tích các tập tin cấu hình, vì vậy tôi nghi ngờ trường hợp sử dụng cụ này chỉ đơn giản là không được trông đợi.

Tomcat's org.apache.catalina.startup.RealmRuleSet.addRuleInstances dường như bị gian lận để chỉ đi sâu 2 cấp cho cấu hình Realm. Có vẻ đơn giản, đủ để thêm một lớp khác trong đó.

Tôi phải xem cách cấu hình của phân tử để xem liệu các mức tùy ý có thể được hỗ trợ hay không hoặc nếu một số tập hợp con sẽ phải được định cấu hình theo cách thủ công.

Hãy thoải mái truy cập vào số Tomcat users' list để yêu cầu thay đổi như vậy.

+0

Christopher, cảm ơn rất nhiều vì câu trả lời tuyệt vời! Ngoài ra tôi sẽ có một cái nhìn vào danh sách người dùng (có thể là lúc tôi đăng ký ở đó, chỉ có tôi phải làm với quá nhiều công nghệ khác nhau để đăng ký tất cả các danh sách người dùng ...). Có vẻ như tôi sẽ không thể tránh thay đổi/mở rộng mã Tomcat, trừ khi mã chính thức sẽ hỗ trợ các cấp lồng nhau tùy ý trong tương lai gần. Nếu tôi cần bắt đầu thay đổi mã Tomcat, tôi có thể sẽ mở rộng LockoutRealm bằng tùy chọn loại trừ tên người dùng - hoặc bạn có biết liệu có bất kỳ điều gì tương tự tồn tại không? Cảm ơn! – FelixD

+0

Tôi đã đăng nhập [báo cáo lỗi cho điều này] (https://issues.apache.org/bugzilla/show_bug.cgi?id=54141). –

+0

Tuyệt vời, cảm ơn Christopher! Xin lỗi vì đã không tự mình làm điều này, một chút căng thẳng ở đây vào lúc này ... – FelixD

Các vấn đề liên quan