2012-01-31 22 views
6

Có thể sử dụng chú thích @RolesAllowed trên dịch vụ web JAX-WS và nếu có thì làm cách nào?Dịch vụ web JAX-WS và @rolesAllowed

Tôi có dịch vụ web trên thủy tinh 3.1.1 bằng Xác thực cơ bản nhưng bị bỏ qua các hạn chế được hiển thị bằng cách sử dụng @RolesAllowed. Các thông tin vai trò nên có sẵn, như tôi có thể truy cập vào nó như thế này:

@Resource 
WebServiceContext wsContext; 

if (wsContext.isUserInRole("READ")) 
log.info("Role: READ"); 

tôi nhận vai trò dự kiến ​​nhưng vẫn tất cả các phương pháp có thể truy cập, ngay cả khi @RolesAllowed được thiết lập để vai trò khác nhau. @DenyAll cũng không hoạt động.

Nếu các chú thích này không được hỗ trợ, có thể sử dụng các bộ mô tả triển khai để quản lý quyền truy cập vào các phương pháp webservice dựa trên vai trò người dùng không?

Sửa: This phần của JAVA EE 6 hướng dẫn mô tả việc sử dụng @RolesAllowed chú thích. Nó đọc

Đối với các thành phần Java EE, bạn xác định vai trò bảo mật bằng cách sử dụng chú thích siêu dữ liệu @DeclareRoles và @RolesAllowed.

Dịch vụ web không được liệt kê là thành phần Java EE trong phần đầu của hướng dẫn, vì vậy có vẻ như chú thích bảo mật không được hỗ trợ.

Chỉnh sửa2 Sau bài đăng của Izan, tôi đã thử lần nữa. Dưới đây là những gì tôi đã làm:

@Webservice 
@DeclareRoles(value = {"READ", "UPDATE", "DELETE"}) 
public class ServiceImpl implements Service { 
    @Override 
    @WebMethod(operationName = "helloWorld") 
    @RolesAllowed({"NONE"}) 
    public String helloWorld() throws Exception { 
    return "Hello World!"; 
    } 
} 

Sử dụng loại thiết lập này, mọi người đều có thể truy cập phương pháp, bất kể vai trò nào được đặt. Người dùng được xác thực (có thể thấy điều đó trong audit.log) nhưng không có ủy quyền nào diễn ra. Như đã nêu ở trên, tôi có thể truy cập vai trò từ WebServiceContext (Tôi thực sự làm hướng dẫn sử dụng ủy quyền sử dụng thông tin này).

Thêm chú thích @Stateless, hãy để tôi sử dụng chú thích bảo mật. Vì vậy, @permitAll hoạt động như mong đợi. Nhưng việc sử dụng các vai trò vẫn không hoạt động, vì người dùng không được xác thực ngay bây giờ. Chúng hiển thị dưới dạng ANONYMOUS trong nhật ký kiểm tra và quyền truy cập bị từ chối đối với chúng.

web.xml của tôi trông như thế này:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
<display-name>OneMore</display-name> 

<security-constraint> 
    <display-name>WebServiceSecurity</display-name> 

    <web-resource-collection> 
     <web-resource-name>Authorized users only</web-resource-name> 
     <url-pattern>/service</url-pattern> 
     <http-method>POST</http-method> 
    </web-resource-collection> 

    <auth-constraint>  
     <role-name>READ</role-name> 
     <role-name>UPDATE</role-name> 
     <role-name>DELETE</role-name> 
    </auth-constraint> 

</security-constraint> 

<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

<security-role> 
    <role-name>READ</role-name> 
</security-role> 

<security-role> 
    <role-name>UPDATE</role-name> 
</security-role> 

<security-role> 
    <role-name>DELETE</role-name> 
</security-role> 
</web-app> 

Glassfish-web.xml chỉ bản đồ tên vai tên nhóm, như thế này:

<security-role-mapping> 
    <role-name>READ</role-name> 
    <group-name>READ</group-name> 
</security-role-mapping> 

Sửa 3 Nhờ Izan và không biết bao nhiêu cố gắng sau, tôi cuối cùng làm cho nó hoạt động.

Như đã nói ở trên, điểm chính đã chuyển từ dịch vụ web đơn giản sang dịch vụ web EJB bằng cách thêm chú thích @Stateless. Điều này cho phép sử dụng chú thích bảo mật.

Thay đổi này cũng được yêu cầu để thay đổi các bộ mô tả triển khai. Mặc dù dịch vụ web gốc yêu cầu glassfish-web.xml để thiết lập vai trò, sau đó yêu cầu glassfish-ejb-jar.xml.

Trả lời

6

Có thể đây là một câu hỏi khá ngu ngốc, nhưng EJBs webservices của bạn? Như đã nêu trong Security Annotations and Authorization in GlassFish and the Java EE 5 SDK

Các chú thích @PermitAll, @DenyAll và @RolesAllowed được định nghĩa để xác định quyền của phương thức kinh doanh EJB

tôi sử dụng những chú thích với WS từ dưới lên từ stateless EJB và họ làm việc như một sự quyến rũ trong JBoss.


EDIT 1 @TPete Tôi sẽ thêm một số mã để cho bạn thấy nhiều hơn hoặc ít hơn những gì tôi đang làm.

@Stateless 
@WebService() 
@WebContext(contextRoot = WSContextRoot.CTX_ROOT, 
    authMethod = "BASIC") 
@EndpointConfig(configName = "Standard WSSecurity Endpoint") 
@SecurityDomain(value = "myDeclaredDomain") 
@RolesAllowed({ "AUTHORISED" }) 
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT) 
public class MyWS implements MyInterface { 
    @Override 
    public void doSomething(){ 
     //impl 
    } 
} 

Và như đối với giao diện

@Remote 
@WebService 
public interface MyInterface { 

    @WebMethod(operationName="doSomething") 
    public void doSomething(); 
} 

WebContext, EndpointConfig và SecurityDomain là JBoss chú thích, nhưng tôi cho rằng có cái gì đó tương tự cho GlassFish, hoặc một cách tương đương để làm việc đó. Miền bảo mật được bao gồm trong bộ mô tả triển khai cho jboss và được định nghĩa trong tệp login-config.xml từ các tệp cấu hình của JBoss.


EDIT 2 @TPete

Tôi cho rằng bạn cần phải thêm một số mô tả triển khai EJB từ Glassfish, một nắng ejb-jar.xml gói tập tin bên trong EAR của bạn. Một lần nữa, từ cùng một bài viết được đăng tải trong câu trả lời, có một Sử dụng triển khai Phần mô tả chương mà các tiểu bang

Đối với các điểm cuối dịch vụ EJB web với @RolesAllowed, bạn cần phải xác định loại xác thực để sử dụng bằng cách xác định yếu tố trong sun-ejb-jar.xml. Để xác thực mật khẩu tên người dùng, hãy đặt phần tử thành BASIC, như trong ví dụ sau. Bước này chỉ bắt buộc đối với các điểm cuối dịch vụ web EJB và không bắt buộc đối với các EJB.

Vì bạn đang xác định điểm cuối dịch vụ web EJB, tôi nghĩ bạn nên đặt bộ mô tả này vào bạn EAR. Hãy xem nhanh bài viết đó, nó mô tả khá tốt quá trình bạn đang theo dõi :-)

+0

Xin lỗi, có lẽ có thể đăng tải này như một chỉnh sửa thay vì một câu trả lời. – igracia

+0

Tôi nghĩ rằng đăng nó như là một bình luận sẽ là thích hợp nhất, mặc dù cho đến khi bạn đã có 50 đại diện đó là không thể – Flexo

+0

@Izan Tôi đoán là không, mặc dù đây là dự án Java EE đầu tiên của tôi và tôi không quen thuộc với thuật ngữ đó. Có lẽ đăng một ví dụ có thể làm rõ vấn đề. Tôi chỉ sử dụng chú thích '@ Webservice' ngay bây giờ. Tôi đã cố gắng kết hợp nó với '@ Stateless' nhưng tôi không thể truy cập dịch vụ web bằng Https sau đó. – TPete

0

Câu hỏi ban đầu cũ nhưng tôi vẫn để lại nhận xét trong trường hợp ai đó như tôi tình cờ gặp nó. Bắt đầu với EJB 3.1, các EJB có thể được đóng gói trong một mô-đun WAR nhưng khi nói đến việc bảo vệ chúng, các mô tả triển khai EJB cần phải được sử dụng. Điều không rõ ràng trong spec là các EJB có thể không được khai báo là Servlets trong web.xml hoặc ứng dụng khác sẽ không khởi động được.

Dưới đây là một bài báo tuyệt vời về đóng gói EJB trong module WAR và sự khác biệt với bao bì trong module JAR EJB: http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc%2Finfo%2Fae%2Fae%2Fcejb_ejbinwar.html

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