2013-04-14 39 views
19

Tôi đang sử dụng Xác thực cơ sở HTTP với Java.Cách nhận mật khẩu từ xác thực cơ bản HTTP

My Servlet gửi một thông điệp JMS nhưng tôi cần phải cung cấp cho người sử dụng và mật khẩu để xác thực bản thân mình trong khi tạo ra các kết nối:

javax.jms.ConnectionFactory.createConnection(String username, String password) 

tôi có thể lấy tên người dùng từ HttpServletRequest.getUserPrincipal(). Nhưng dường như không có cách nào để lấy lại mật khẩu. Tôi giải quyết điều này như thế nào?

Trả lời

57

Mật khẩu bạn đang đề cập có thể khác với mật khẩu do người dùng cung cấp khi đăng nhập. Trong khi trường hợp sử dụng không rõ ràng từ câu hỏi, nhưng có vẻ như bạn đang cố gắng sử dụng tên người dùng/mật khẩu được cung cấp bởi người dùng bên ngoài để tạo kết nối đến Nhà máy kết nối JMS. Điều này nghe không an toàn về mặt kiến ​​trúc đối với tôi. Bạn chỉ nên sử dụng một thông tin xác thực để kết nối với ConnectionFactory cần được bảo vệ (xử lý nó như kết nối db). Tốt hơn là sử dụng JNDI để tra cứu ConnectionFactory và bỏ qua công cụ quản lý tên người dùng/mật khẩu.

Tuy nhiên, trong trường hợp bạn phải sử dụng kỹ thuật này, có thể sử dụng đoạn mã sau block.I đang sao chép nó từ dự án Gitblit như nó đã được mở trong nhật thực của tôi

Sử dụng Java8 Base64 lớp:

final String authorization = httpRequest.getHeader("Authorization"); 
    if (authorization != null && authorization.startsWith("Basic")) { 
     // Authorization: Basic base64credentials 
     String base64Credentials = authorization.substring("Basic".length()).trim(); 
     String credentials = new String(Base64.getDecoder().decode(base64Credentials), 
       Charset.forName("UTF-8")); 
     // credentials = username:password 
     final String[] values = credentials.split(":",2); 
+0

Bạn nói đúng về kiến ​​trúc. Tôi đã từ bỏ cách tiếp cận này và chỉ chấp nhận phương thức javax.jms.ConnectionFactory.createConnection() không có giấy uỷ nhiệm. –

+1

Cảm ơn. Nó hoạt động nhưng với một tinh chỉnh. Nhưng bạn không thể gọi 'Base64' là lớp tĩnh. Tôi đã làm: Base64 b = new Base64(); \t \t \t Thông tin đăng nhập chuỗi = chuỗi mới (b.decode (base64Credentials), Charset.forName ("UTF-8")); – iankits

+1

@iankits Java 8 ngữ nghĩa hơi khác nhau. –

1

Tên người dùng và mật khẩu ban đầu được gửi trong tiêu đề HTTP Authorization (mã hóa base64) để bạn có thể sử dụng; nhưng nếu người dùng duy trì phiên sử dụng cookie, họ sẽ không nhất thiết phải gửi tiêu đề đó mỗi lần.

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