Tôi đang thử nghiệm tuyên truyền của JAAS Subject với một custom Principal từ một máy khách EJB độc lập đang chạy trên một thời gian chạy Java thô đến một máy chủ JavaEE. Tôi đang nhắm mục tiêu cả triển khai JBoss và WebSphere.Làm thế nào để truyền JAAS Subject khi gọi EJB từ xa (RMI over IIOP) từ một máy khách thuần túy
Theo this forum thread Tôi đã mong đợi nó sẽ hoạt động với JBoss dễ dàng.
Đây là EJB đoạn mã mã khách hàng của tôi:
Subject subject = new Subject();
Principal myPrincipal = new MyPrincipal("me I myself");
subject.getPrincipals().add(myPrincipal);
PrivilegedExceptionAction<String> action = new PrivilegedExceptionAction<String>() {
public String run() throws Exception {
String result;
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
InitialContext ic = new InitialContext();
Business1 b = (Business1) ic.lookup("StatelessBusiness1");
result = b.getNewMessage("Hello World");
return result;
}
};
result = subject.doAs(subject, action);
System.out.println("result "+result);
server-side code là:
public String getNewMessage(String msg) {
System.out.println("getNewMessage principal: " + sessionContext.getCallerPrincipal());
System.out.println("Current Subject: " + Subject.getSubject(AccessController.getContext()));
return "getNewMessage: " + msg;
}
Để chắc chắn, ngay cả khi nó là hành vi mặc định, tôi đã thêm phần này vào bean phiên ejb-jar.xml
của tôi:
<security-identity>
<use-caller-identity/>
</security-identity>
Đậu phiên của tôi không được bảo vệ bởi y vai trò.
Theo this IBM WebSphere infocenter section, tôi cũng đã bật thuộc tính hệ thống com.ibm.CSI.rmiOutboundPropagationEnabled=true
.
Về mặt kỹ thuật, cuộc gọi dịch vụ hoạt động bình thường trên JBoss hoặc WebSphere. Nhưng Chủ đề JAAS bao gồm hiệu trưởng tùy chỉnh của tôi được tạo trên máy khách không được truyền đến máy chủ. Hoặc tất nhiên, các Subject
bán phá giá ngay trước khi tạo bối cảnh JNDI và EJB gọi là OK.
tôi chạy phiên bản Java runtime tương tự cho máy chủ và máy khách (IBM Java6 SR9 FP2 ...), MyPrincipal
lớp serializable có sẵn trong máy chủ classpath (AppServer/lib/ext
cho WebSphere, server/default/lib
cho JBoss)
WebSphere bãi:
[8/31/12 11:56:26:514 CEST] 00000024 SystemOut O getNewMessage principal: UNAUTHENTICATED
[8/31/12 11:56:26:515 CEST] 00000024 SystemOut O Current Subject: null
JBoss bãi:
12:30:20,540 INFO [STDOUT] getNewMessage principal: anonymous
12:30:20,540 INFO [STDOUT] Current Subject: null
Để chắc chắn, tôi đã bỏ lỡ một số loại của ma thuật pell. Bạn có biết cái nào?
Thì sao? Tôi đã viết thành công một LoginModule tùy chỉnh cho hỗ trợ WebSphere và Tivoli PDPrincipal, tôi đã cấu hình LoginModule trong JBoss để kích hoạt Kerberos SPNEGO qua HTTP ... Chắc chắn tôi thấy thoải mái với JAAS và những thứ khác xung quanh. Tôi chỉ hỏi nếu tôi suy nghĩ sai nó nên làm việc ... trước khi mở mã nguồn JBoss để xác minh –
Sau đó, bạn có nhiều kinh nghiệm hơn tôi;) (Tôi đã chơi với LoginModules, xác thực tùy chỉnh, chuyển tiếp chính qua RMI-IIOP/CORBA trong Glassfish 2.x, và điều đó luôn luôn rất phức tạp. Cuối cùng, chúng tôi chỉ xử lý ở cấp độ ứng dụng) Tôi sẽ ngăn cản biểu mẫu bất kỳ bằng cách sử dụng các tiêu chuẩn này để xác thực tên người dùng/mật khẩu. Nếu vấn đề là tích hợp với Kerberos và cung cấp đăng nhập một lần, thì đó vẫn có thể là cách tốt nhất để thực hiện! Xin lỗi, tôi không thể giúp thêm. – ewernli
Nếu thực tế, mục đích là để làm việc xung quanh không sử dụng Kerberos với WebSphere trong bối cảnh cụ thể của chúng tôi: http://stackoverflow.com/questions/10518057/how-to-enable-kerberos-authentication-for-remote-ejb- call-on-websphere –