2011-10-03 37 views
8

Tôi đã định cấu hình tomcat để xác thực cơ bản. Tôi không muốn bất kỳ ai có quyền truy cập vào ứng dụng web của mình nhưng ứng dụng đang phục vụ các dịch vụ web. Vì vậy, tôi muốn bỏ qua một địa chỉ IP cụ thể từ xác thực cơ bản (ip rằng không nên yêu cầu xác thực.)Tomcat: Bỏ qua xác thực cơ bản cho địa chỉ IP được chỉ định

tomcat-users.xml:.

<tomcat-users> 
<user username="user" password="password" roles="user"/> 
</tomcat-users> 

web.xml:

<security-constraint> 
<web-resource-collection> 
    <web-resource-name>Entire Application</web-resource-name> 
    <url-pattern>/*</url-pattern> 
</web-resource-collection> 
<auth-constraint> 
    <role-name>user</role-name> 
</auth-constraint> 
</security-constraint> 


<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>You must enter your login credentials to continue</realm-name> 
</login-config> 

<security-role> 
    <description> 
     The role that is required to log in to the Application 
    </description> 
    <role-name>user</role-name> 
</security-role> 

Cảm ơn, Chetan.

Trả lời

9

Nếu bạn muốn chỉ cho phép một vài địa chỉ IP và không cho phép mọi người khác, Remote Address Filter Valve là những gì bạn cần.

Nếu bạn muốn khách hàng từ địa chỉ IP không xác định thấy hộp thoại đăng nhập cơ bản và có thể đăng nhập, bạn cần tùy chỉnh Valve. Nguồn gốc của RemoteAddrValve (và đó là tầng lớp phụ huynh RequestFilterValve là một điểm khởi đầu tốt. Hãy xem my former answer too.

Dù sao, dưới đây là một bằng chứng của mã khái niệm. Nó đặt một điền Principal đến Request nếu khách hàng đến từ một IP tin cậy để các module đăng nhập sẽ không yêu cầu mật khẩu Nếu nó không chạm vào đối tượng Request và người dùng có thể đăng nhập như bình thường

import java.io.IOException; 
import java.security.Principal; 
import java.util.ArrayList; 
import java.util.List; 

import javax.servlet.ServletException; 

import org.apache.catalina.connector.Request; 
import org.apache.catalina.connector.Response; 
import org.apache.catalina.realm.GenericPrincipal; 
import org.apache.catalina.valves.ValveBase; 

public class AutoLoginValve extends ValveBase { 

    private String trustedIpAddress; 

    public AutoLoginValve() { 
    } 

    @Override 
    public void invoke(final Request request, final Response response) 
      throws IOException, ServletException { 
     final String remoteAddr = request.getRemoteAddr(); 
     final boolean isTrustedIp = remoteAddr.equals(trustedIpAddress); 
     System.out.println("remoteAddr: " + remoteAddr + ", trusted ip: " 
       + trustedIpAddress + ", isTrustedIp: " + isTrustedIp); 
     if (isTrustedIp) { 
      final String username = "myTrusedUser"; 
      final String credentials = "credentials"; 
      final List<String> roles = new ArrayList<String>(); 
      roles.add("user"); 
      roles.add("admin"); 

      final Principal principal = new GenericPrincipal(username, 
       credentials, roles); 
      request.setUserPrincipal(principal); 
     } 

     getNext().invoke(request, response); 
    } 

    public void setTrustedIpAddress(final String trustedIpAddress) { 
     System.out.println("setTrusedIpAddress " + trustedIpAddress); 
     this.trustedIpAddress = trustedIpAddress; 
    } 

} 

và một ví dụ cấu hình cho server.xml:..

<Valve className="autologinvalve.AutoLoginValve" 
    trustedIpAddress="127.0.0.1" /> 
+0

Cảm ơn palacsinit, tôi sẽ cố gắng thêm điều này và sẽ sớm đăng kết quả. – Chetan

+1

Nó hoạt động hoàn hảo, Cảm ơn bạn rất nhiều. – Chetan

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