2011-11-24 32 views
5

Với javax.security.Principal bạn có thể truy xuất thông tin người dùng tại bất kỳ thời điểm nào bằng cách tiêm EJBContext với @Resource.Mở rộng thông tin người dùng trên nhiều EJBs

Điều tôi đang cố gắng làm là thêm thông tin bổ sung cụ thể cho ứng dụng của tôi và cho người dùng của tôi như là một phần của Principal. Tôi cũng đã cố gắng bao gồm thông tin này trong số contextData() của EJBContext, nhưng điều này chỉ kéo dài trong vòng đời EJB chứ không phải trong nhiều cuộc gọi EJB.

Có cách nào để mở rộng Principal để thêm bất kỳ thông tin bổ sung nào không? Tôi không muốn sử dụng ThreadLocal hoặc sửa đổi tất cả chữ ký EJB của tôi để chuyển thông tin này.

Trả lời

1

Cuối cùng, hãy làm việc này. Tùy chỉnh Principal s có thể được tạo trong JBoss AS. Nó là đủ với việc tạo ra một lớp thực hiện java.security.Principal và thêm thuộc tính tùy chỉnh và getters/setters.

Sau đó, khi cấu hình các module đăng nhập (ví dụ DatabaseServerLoginModule) một mô-đun-tùy chọn trong các tập tin đăng nhập-config.xml chỉ cần thêm một lựa chọn principalClass:

<application-policy name="my-security-domain"> 
    <authentication> 
    <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required"> 
      <module-option name="principalClass">com.custom.security.MyCustomPrincipal</module-option> 
... 

Bây giờ vấn đề là do một lỗi đang tồn tại trong JBoss, một cuộc gọi đến một tiêm EJBContext.getCallerPrincipal() sẽ không trả về Hiệu trưởng tùy chỉnh mà là một thể hiện đơn giản của SimplePrincipal! Nhưng tin tốt là điều này có thể được giải quyết bằng mã JAAS sau đó cho phép kiểm tra các thông tin xác thực EJB container:

try { 
     Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container"); 
     Set<Group> subjectGroups = subject.getPrincipals(Group.class); 
     Iterator<Group> iter = subjectGroups.iterator(); 
     while (iter.hasNext()) { 
     Group group = iter.next(); 
     String name = group.getName(); 
     if (name.equals("CallerPrincipal")) { 
      Enumeration<? extends Principal> members = group.members(); 
      if (members.hasMoreElements()) { 
      context = members.nextElement(); 
      myCustomPrincipal = (MyCustomPrincipal) context; 
      } 
     } 
     } 
    } catch (PolicyContextException e) { 
     .... 
    } 

tôi quấn mã trên trong một POJO mà tôi có thể tiêm trong EJB của tôi để có được những Hiệu trưởng tương tự như lớp EJBContext.

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