2012-03-28 35 views
7

Tôi có một ứng dụng với bảo mật mùa xuân được cài đặt và hoạt động tốt - hiện đang chạy hết số www.exampledomain.com.Bảo mật mùa xuân Java - chặn url tên miền phụ cho thông tin đăng nhập khác nhau?

Tôi hiện muốn mở rộng ứng dụng đang chạy ra khỏi tên miền phụ. Ví dụ: newapp.exampledomain.com.

Vấn đề duy nhất là cho các ứng dụng mới này người dùng cần phải đăng nhập. Vào mùa xuân nó là rất dễ dàng để đánh chặn các url qua <intercept-url pattern="/Admin/*" access="ROLE_GENERAL"/>

nhưng bạn sẽ làm gì khi bạn muốn chặn một tên miền phụ để đăng nhập? Ví dụ: những điều sau đây không phù hợp với tôi:

<intercept-url pattern="http://newapp.exampledomain.com/*" access="ROLE_GENERAL"/> 

Bất kỳ suy nghĩ nào về cách giải quyết vấn đề này?

+0

Bạn đang sử dụng các ứng dụng web tương tự trong tên miền phụ, không phải là một ứng dụng web khác nhau? – Qwerky

+0

Bạn có thể ghi đè lên 'FilterSecurityInterceptor' để thêm các kiểm tra tên miền phụ, nhưng nó có mùi giống như một hack, không phải là một giải pháp thực sự. Upvote câu hỏi của bạn cho giải pháp out-of-the-box. Ngoài ra, bạn có thể cụ thể hơn về cấu hình tên miền phụ web-app/web-container hay không. – alexkasko

+0

Yeh sử dụng cùng một ứng dụng cho các miền phụ khác nhau, các miền phụ khác nhau đại diện cho chức năng khác nhau cho người dùng nhưng cùng một máy chủ xử lý nó (vì lý do hiệu quả về chi phí). Đối với cấu hình miền phụ của miền chứa ứng dụng web, bộ lọc được đặt để tìm tên miền phụ được gọi và sau đó yêu cầu được chuyển tiếp đến hành động có liên quan cho tính năng điều khiển miền đó. Hãy tưởng tượng free.domain.com mà tất cả có thể truy cập và các pro.domain.com đó là một cái nhìn tốt hơn và cảm nhận với chức năng bổ sung. –

Trả lời

2

Một tùy chọn là viết AccessDecisionVoter của riêng bạn mở rộng RoleVoter và thêm một kiểm tra bổ sung dựa trên tên máy chủ. Một cái gì đó như thế này:

public class MyVoter extends RoleVoter { 
    public int vote(Authentication authentication, 
       java.lang.Object object, 
       java.util.Collection<ConfigAttribute> attributes) { 
    FilterInvocation filterInvocation = (FilterInvocation) object; 
    HttpRequest request = filterInvocation.getHttpRequest(); 
    // get subdomain from request 
    String subdomain = getSubdomain(request); 
    if ("free".equals(subdomain)) { 
     return ACCESS_GRANTED; 
    } 
    else { 
     super.vote(authentication, object, attributes); 
    } 
    } 
} 

Sau đó dây lên cử tri của bạn:

<security:http auto-config="true" 
       use-expressions="true" 
       access-decision-manager-ref="accessDecisionManager"> 
... 
</security:http> 

<bean id="accessDecisionManager" 
     class="org.springframework.security.access.vote.UnanimousBased"> 
    <property name="decisionVoters"> 
     <list> 
      <bean class="com.acme.MyVoter" /> 
     </list> 
    </property> 
</bean> 

Nếu bạn muốn mang nó một bước xa hơn bạn cũng có thể viết riêng của bạn configuration attributes mà sẽ cho phép bạn loại bỏ các kiểm tra hostname hardcoded trong cử tri và làm điều gì đó như:

<intercept-url pattern="/Admin/*" access="ROLE_GENERAL" domain="free.acme.com" /> 
+0

thẻ chặn url không bao giờ nhận được thuộc tính được gọi là "tên miền", trong bất kỳ phiên bản bảo mật mùa xuân nào. Sử dụng cử tri có thể đúng, nhưng giải pháp này sẽ không bao giờ hoạt động. – tugcem

1

Trong cookie phiên, tên miền của bạn nên được đặt rõ ràng là exampledomain.com.

Máy chủ ứng dụng chịu trách nhiệm tạo cookie phiên (JSESSIONID) nhưng không phải là Bảo mật mùa xuân.

Tất cả những gì bạn phải làm là thông báo cho máy chủ ứng dụng của mình rằng bạn muốn luôn có cùng tên miền trong cookie.

Thêm vào web.xml của bạn:

<session-config> 
     <cookie-config> 
      <domain>exampledomain.com</domain> 
     </cookie-config> 
    </session-config> 
Các vấn đề liên quan