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
.
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
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
@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