2013-08-06 28 views
15

Tôi đang sử dụng JBoss ASJAX-RS để tạo các thiết bị đầu cuối REST.JAX-RS: Cách bảo mật các điểm cuối REST?

phép nói rằng lớp học của tôi trông giống như

@Path("/users") 
public class UserResource { 


    @GET 
    public Response getAccount() { 
    return "hello"; 
    } 
} 

Bây giờ getAccount không được chứng thực tại thời điểm

Wanted
- Tôi muốn thêm xác thực để khi mã số truy cập getAccount người dùng được xác thực
- Tôi muốn xác thực được thúc đẩy bởi chú thích thay vì cấu hình XML, nếu có thể
- Tôi muốn làm việc so sánh cơ sở dữ liệu để xem nếu người dùng là hợp lệ

Vấn đề
- Tôi chưa bao giờ làm điều đó vì vậy tôi không có ý tưởng làm thế nào để thực hiện nó
- Tôi đã googled xung quanh rất nhiều và thấy Jersey ví dụ

CẬP NHẬT
- tôi muốn gửi thông tin xác thực với mỗi yêu cầu và không tạo ra bất kỳ phiên

Vui lòng hướng dẫn tôi bằng một ví dụ đơn giản và tôi sẽ cố gắng mở rộng từ đó

+0

Bạn sẽ yêu cầu thông tin xác thực được truyền vào với mọi yêu cầu hoặc bạn có cho phép tạo phiên không? – thatidiotguy

+0

Tôi vừa cập nhật câu hỏi của mình, tôi muốn gửi bằng chứng xác thực cho mỗi yêu cầu và không tạo bất kỳ phiên nào – daydreamer

+0

Tôi đã triển khai giải pháp Vui lòng xem câu trả lời của tôi tại http://stackoverflow.com/questions/18345600/how- answer-to-receive-all-headers? answerertab = cũ nhất # tab-top – daydreamer

Trả lời

10

Tôi đã giải quyết vấn đề này bằng mã sau.

lưu ý cơ chế Mã sẽ được cập nhật một lần tôi làm điều đó

Tôi đã giải quyết điều này bằng cách sửa đổi đánh chặn tôi có, sau là mã

Chú

@Inherited 
@InterceptorBinding 
@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface SecurityChecked { 

} 

Loại tài nguyên

public class SecureResource { 

    @GET 
    @SecurityChecked 
    public Response getUser() { 
     return Response.ok("authenticated successfully!").build(); 
    } 
} 

lớp Interceptor

@Interceptor 
@Provider 
@ServerInterceptor 
@SecurityChecked 
public class SecurityCheckInterceptor implements PreProcessInterceptor, AcceptedByMethod { 
    private static final Logger LOGGER = LoggerFactory.getLogger(SecurityCheckInterceptor.class); 

    @Nullable 
    @Override 
    public ServerResponse preProcess(final HttpRequest request, final ResourceMethod method) throws Failure, WebApplicationException { 
     final List<String> authToken = request.getHttpHeaders().getRequestHeader("X-AUTH"); 

     if (authToken == null || !isValidToken(authToken.get(0))) { 
      final ServerResponse serverResponse = new ServerResponse(); 
      serverResponse.setStatus(Response.Status.UNAUTHORIZED.getStatusCode()); 
      return serverResponse; 
     } 

     return null; 
    } 

    private static boolean isValidToken(@Nonnull final String authToken) { 
     LOGGER.info("validating token: " + authToken); 
     return true; 
    } 

    @SuppressWarnings("rawtypes") 
    @Override 
    public boolean accept(final Class declaring, final Method method) { 
     // return declaring.isAnnotationPresent(SecurityChecked.class); // if annotation on class 
     return method.isAnnotationPresent(SecurityChecked.class); 
    } 
} 

và sau đó tôi chạy thử nghiệm tích hợp của tôi bằng cách triển khai các lớp tài nguyên trong JBoss và phát hành sau lệnh trên dòng lệnh

curl --header 'X-AUTH: 1a629d035831feadOOO4uFReLyEW8aTmrCS' http://localhost:8080/market-1.0-SNAPSHOT/rest/login 
curl --header 'InvalidHeader: InvalidHeaderValue' http://localhost:8080/market-1.0-SNAPSHOT/rest/login 
16

Bạn cần có cấu hình Bảo mật mùa xuân không trạng thái trước điểm kết thúc JAX RS của mình. Tôi đã giải quyết vấn đề chính xác mà bạn đang cố gắng giải quyết nhưng tôi không có mã của riêng tôi để chia sẻ ..

Đây là một dự án đã thực hiện chính xác điều bạn đang hỏi, Một số người khôn ngoan đã làm tất cả bạn;)

https://github.com/philipsorst/angular-rest-springsecurity

Phép thuật là gì?

  1. Bạn có một URL không được bảo vệ mà hiện xác thực, và thiết lập vai trò người dùng cũng ..
  2. Sau đó bạn quay lại một số loại Token, đặt nó một số nơi trong bộ nhớ cache sẽ được dự kiến ​​trên tất cả các cuộc gọi tiếp theo ..
  3. Khi có yêu cầu mới về các tài nguyên được bảo vệ khác, bạn sẽ kiểm tra xem Mã thông báo có xuất hiện trong bộ nhớ cache/phiên lưu trữ không (bạn cần một số cơ chế để theo dõi mã thông báo hợp lệ)
  4. Nếu mã thông báo bị gửi lại và hợp lệ, bạn thực hiện đăng nhập có lập trình trong Spring Security để đảm bảo rằng bạn có thể sử dụng tất cả các tính năng bảo mật mà Spring cung cấp, (Chú thích, Thẻ JSTL, v.v.)!
  5. Sau khi xác thực mã thông báo, bạn sẽ nhận được thông tin chi tiết về người dùng đã đăng nhập trong bộ điều khiển (còn gọi là tài nguyên RS JAX) để giải quyết vấn đề bảo mật hơn nữa.
  6. Nếu mã thông báo không hợp lệ hoặc không có, nó sẽ bị kẹt bởi lỗi điểm cuối sẽ trả về phản hồi thích hợp (401)

Tham khảo liên kết sau để hiểu cách cấu hình bảo mật mùa xuân không quốc tịch .., https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/resources/context.xml

Xem cách một người dùng được xác nhận lần đầu tiên và một mã thông báo được tạo ra .. https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/resources/UserResource.java

Đây là lớp học, nơi đăng nhập chương trình được thực hiện trên tất cả các yêu cầu sau thẻ séc .. https://github.com/philipsorst/angular-rest-springsecurity/blob/master/src/main/java/net/dontdrinkandroot/example/angularrestspringsecurity/rest/AuthenticationTokenProcessingFilter.java

+0

thực sự đã giúp tôi – daydreamer

+0

Điều này cũng giúp tôi. Khi tôi cần kiểm tra một vài chi tiết theo cách khác, tôi đã kết thúc bằng "một bản demo khác". Trong khi những điều cơ bản rất giống nhau (không thể từ chối cảm hứng bắt đầu ở đây), tôi đã bỏ UI và JPA/DB và tập trung vào Spring Security nhiều hơn. Kết quả là [ở đây] (https://github.com/virgo47/restful-spring-security), nó nhận xét, Gradle-based, chứa test.sh dựa trên curl. Và tôi đã viết một [bài đăng blog] (http://virgo47.wordpress.com/2014/07/27/restful-spring-security-with-authentication-token/) về chủ đề này cũng như với một vài sơ đồ trình tự. Nên hữu ích. – virgo47

+1

Hey rakesh, tôi đã kiểm tra dự án angular-rest-springsecurity trên github, tôi có một câu hỏi, mặc dù tất cả các vấn đề liên quan đến bảo mật đều được thực hiện với sự cho phép trong ảnh, nhưng khi tôi làm mới trình duyệt khi người dùng được xác thực kiểm soát dường như được chuyển hướng đến trang đăng nhập, ngay cả khi tôi chỉ cần đăng nhập và nhấp vào làm mới .... do u có bất kỳ ý tưởng về điều này ..? – Amit

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