2013-06-12 107 views
5

Tôi đang cố xác thực người dùng bằng bộ lọc JAX-RS có vẻ như hoạt động cho đến nay. Đây là bộ lọc mà tôi đang thiết lập một SecurityContext mới:Ủy quyền với RolesAllowedDynamicFeature và Jersey

@Provider 
public class AuthenticationFilter implements ContainerRequestFilter { 

    @Override 
    public void filter(final ContainerRequestContext requestContext) throws IOException { 

    requestContext.setSecurityContext(new SecurityContext() { 
     @Override 
     public Principal getUserPrincipal() { 
     return new Principal() { 
      @Override 
      public String getName() { 
      return "Joe"; 
      } 
     }; 
     } 

     @Override 
     public boolean isUserInRole(String string) { 
     return false; 
     } 

     @Override 
     public boolean isSecure() { 
     return requestContext.getSecurityContext().isSecure(); 
     } 

     @Override 
     public String getAuthenticationScheme() { 
     return requestContext.getSecurityContext().getAuthenticationScheme(); 
     } 
    }); 

    if (!isAuthenticated(requestContext)) { 
     requestContext.abortWith(
       Response.status(Status.UNAUTHORIZED) 
       .header(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Example\"") 
       .entity("Login required.").build()); 
    } 
    } 

    private boolean isAuthenticated(final ContainerRequestContext requestContext) { 
    return requestContext.getHeaderString("authorization") != null; // simplified 
    } 
} 

Phương pháp nguồn trông như thế này:

@GET 
    // @RolesAllowed("user") 
    public Viewable get(@Context SecurityContext context) { 
    System.out.println(context.getUserPrincipal().getName()); 
    System.out.println(context.isUserInRole("user")); 
    return new Viewable("index"); 
    } 

Các RolesAllowedDynamicFeature được đăng ký như thế này:

.register(RolesAllowedDynamicFeature.class) 

tôi có thể xem các kết quả đầu ra mong đợi trên bảng điều khiển. Nhưng nếu tôi bỏ ghi chú @RolesAllowed("user"), tôi nhận được lỗi Forbidden và phương thức isUserInRole của SecurityContext của tôi không bao giờ được gọi. Theo sau API doc RolesAllowedDynamicFeature nên gọi phương thức này.

Tôi có thể sử dụng RolesAllowedDynamicFeature như thế nào?

Trả lời

1

Tôi đoán đó là vì

@Override 
    public boolean isUserInRole(String string) { 
    return false; 
    } 

nào khẳng định, mà người sử dụng đã không phải là vai trò cần thiết @RolesAllowed ("user") để thậm chí nhập thực hiện các phương pháp được chú thích.

Bạn nên thực hiện một phương pháp isUserInRole phức tạp hơn để kiểm tra, wheter một người dùng có vai trò cụ thể hay không :)

liên quan

13

Bạn cần phải xác định ưu tiên cho bộ lọc xác thực của bạn, nếu không RolesAllowedRequestFilter trong RolesAllowedDynamicFeature sẽ được thực hiện trước AuthenticationFilter của bạn. Nếu bạn nhìn vào mã nguồn, RolesAllowedRequestFilter có chú thích @Priority(Priorities.AUTHORIZATION), vì vậy nếu bạn chỉ định @Priority(Priorities.AUTHENTICATION) cho bộ lọc xác thực của mình, nó sẽ được thực thi trước RolesAllowedRequestFilter. Như thế này:

@Provider 
@Priority(Priorities.AUTHENTICATION) 
public class AuthenticationFilter implements ContainerRequestFilter { 

Bạn cũng có thể cần phải thực sự đăng ký AuthenticationFilter sử dụng register(AuthenticationFilter.class), tùy thuộc vào nếu quét máy chủ của bạn cho các chú thích hay không.

+1

Cảm ơn, bạn đã lưu ngày của tôi. Tôi đã thiết lập mức độ ưu tiên bằng cách sử dụng thanh ghi (AuthenticationFilter.class, Priorities.AUTHENTICATION) nhưng dường như bằng cách nào đó hoàn toàn bị bỏ qua. Sử dụng chú thích đã sửa nó. – emas

+0

Bạn đã lưu ngày của tôi quá !!! – Manish