2011-01-07 24 views

Trả lời

13

Không trực tiếp. Cách duy nhất để thực hiện điều này là có phương thức xác thực tạo khóa (tạm thời) trên máy chủ, sau đó thay đổi tất cả các phương thức của bạn để đối số đầu tiên là khóa này và tất cả chúng đều tăng thêm lỗi không được xác thực. Ví dụ:

exception NotAuthorisedException { 
    1: string errorMessage, 
} 

exception AuthTimeoutException { 
    1: string errorMessage, 
} 

service MyAuthService { 
    string authenticate(1:string user, 2:string pass) 
     throws (1:NotAuthorisedException e), 

    string mymethod(1:string authstring, 2:string otherargs, ...) 
     throws (1:AuthTimeoutException e, ...), 
} 

Chúng tôi sử dụng phương pháp này và lưu khóa của chúng tôi vào một bản ghi nhớ bảo mật với thời gian chờ 30 phút để giữ mọi thứ "linh hoạt". Khách hàng nhận được AuthTimeoutException dự kiến ​​sẽ ủy quyền lại và thử lại và chúng tôi có một số quy tắc tường lửa để ngăn chặn các cuộc tấn công bạo lực.

+0

Bạn đang gửi mật khẩu trong văn bản rõ ràng hơn dây? – JensG

+2

@ JensG Không, bạn muốn gửi mật khẩu theo định dạng được mã hóa và kiểm tra xem phía máy chủ chuỗi được mã hóa hay chưa. Bcrypt là tốt cho điều này, vì chuỗi được gửi qua dây có thể không khớp chính xác với chuỗi được lưu trữ, nhưng khi được kiểm tra bằng thuật toán bcrypt vẫn có thể xác thực. –

+0

Nếu đây là trường hợp bạn sẽ không gửi mật khẩu văn bản rõ ràng nhưng nếu kẻ tấn công có thể đọc mật khẩu băm, anh ta có thể phát lại cuộc gọi xác thực và truy cập vào các dịch vụ của bạn. – cjungel

1

Các tác vụ như tự động và quyền không được coi là một phần của Tiết kiệm, chủ yếu là vì những thứ này thường liên quan đến logic ứng dụng hơn khái niệm RPC/serialization chung. Điều duy nhất mà tiết kiệm hỗ trợ ra khỏi hộp ngay bây giờ là TSASLTransport. Tôi không thể nói nhiều về bản thân mình, đơn giản là vì tôi không bao giờ cảm thấy cần phải sử dụng nó.

Tùy chọn khác có thể là sử dụng THeaderTransport mà không may tại thời điểm viết chỉ được triển khai với C++. Do đó, nếu bạn có kế hoạch sử dụng nó với một số ngôn ngữ khác, bạn có thể phải đầu tư một số công việc bổ sung. Không cần phải nói rằng chúng tôi chấp nhận những đóng góp ...

0

Một chút trễ (tôi đoán rất muộn) nhưng tôi đã sửa đổi mã nguồn tiết kiệm cho điều này một vài năm trước đây.

Chỉ cần gửi một vé có Bản vá đến https://issues.apache.org/jira/browse/THRIFT-4221 chỉ với điều này.

Hãy xem xét điều đó. Về cơ bản đề xuất là thêm một móc "BeforeAction" thực hiện chính xác điều đó.

Ví dụ Golang tạo diff

+  // Called before any other action is called 
+  BeforeAction(serviceName string, actionName string, args map[string]interface{}) (err error) 
+  // Called if an action returned an error 
+  ProcessError(err error) error 
} 

type MyServiceClient struct { 
@@ -391,7 +395,12 @@ func (p *myServiceProcessorMyMethod) Process(seqId int32, iprot, oprot thrift.TP 
     result := MyServiceMyMethodResult{} 
     var retval string 
     var err2 error 
-  if retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_); err2 != nil { 
+  err2 = p.handler.BeforeAction("MyService", "MyMethod", map[string]interface{}{"AuthString": args.AuthString, "OtherArgs_": args.OtherArgs_}) 
+  if err2 == nil { 
+    retval, err2 = p.handler.MyMethod(args.AuthString, args.OtherArgs_) 
+  } 
+  if err2 != nil { 
+    err2 = p.handler.ProcessError(err2) 
Các vấn đề liên quan