2013-04-25 34 views
10

Tôi đang cố gắng tạo một dịch vụ web an toàn sẽ được sử dụng bởi các dịch vụ web khác. Lý tưởng nhất là khi khách hàng truy cập dịch vụ và không được xác thực, họ sẽ nhận được 401. Tôi muốn người dùng có thể xác thực bằng cách thêm tiêu đề xác thực vào yêu cầu. Tôi không muốn người dùng điền vào biểu mẫu đăng nhập và đăng bài đó. Tôi cũng không muốn nó lưu trữ bất kỳ thông tin xác thực đăng nhập nào trong một cookie (tức là giữ trạng thái), tất cả nó phải nằm trong tiêu đề xác thực gửi với mỗi yêu cầu. Tôi đã sử dụng roo mùa xuân để tạo ra dịch vụ web.Nghỉ ngơi xác thực cơ bản thông qua bảo mật mùa xuân mà không cần đăng nhập bằng hình thức

Điều tôi hiện có, (được lấy từ một trong các hướng dẫn bảo mật mùa xuân 3.1), khi người dùng nhận được 401, họ được nhắc với trang đăng nhập và sau đó đăng trang, nhận cookie mà họ gửi yêu cầu.

Đây là bảo mật mùa xuân của tôi xml.

<http use-expressions="true"> 
    <intercept-url pattern="/customers/**" access="isAuthenticated()" /> 
<intercept-url pattern="/**" access="denyAll" /> 
<form-login /> 
</http> 
<authentication-manager> 
    <authentication-provider> 
     <user-service> 
      <user name="alice" password="other" authorities="user" /> 
      <user name="custome1" password="other" authorities="user" /> 
     </user-service> 
    </authentication-provider> 
</authentication-manager> 

Khi tôi gửi một yêu cầu từ curl, tôi nhận được như sau:

$ curl -i -H "Accept: application/json" -H "Authorization: Basic Y3VzdG9tZXIxOm90aGVy" http://localhost:8080/Secured/customers 

HTTP/1.1 302 Found 
Server: Apache-Coyote/1.1 
Set-Cookie: JSESSIONID=B4F983464F68199FA0160DBE6279F440; Path=/Secured/; HttpOnly 
Location:  http://localhost:8080/Secured/spring_security_login;jsessionid=B4F983464F68199FA0160DBE6279F440 
Content-Length: 0 
Date: Thu, 25 Apr 2013 17:18:48 GMT 

nơi tiêu đề thẻ cơ bản của tôi là base64 (Customer1: khác)

Làm thế nào tôi có thể nhận được các dịch vụ web để chấp nhận tiêu đề xác thực và không chuyển hướng tôi đến trang đăng nhập?

Khi tôi xóa tệp từ security.xml, tôi nhận được đoạn mã sau: org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Sự cố cấu hình: Không thể xác thực AuthenticEntryPoint. Vui lòng đảm bảo rằng bạn có cơ chế đăng nhập được định cấu hình thông qua không gian tên (chẳng hạn như đăng nhập bằng hình thức) hoặc chỉ định tùy chỉnh AuthenticationEntryPoint với thuộc tính 'entry-point-ref'

Trả lời

8

Tôi cần phải xóa <form-login> và thêm <http-basic>. Ngoài ra, bạn cũng có thể tạo phiên làm việc "stateless" cho cấu hình của mình.

<http use-expressions="true" create-session="stateless" > 
    <intercept-url pattern="/customers/**" access="isAuthenticated()" /> 
    <intercept-url pattern="/**" access="denyAll" /> 
    <http-basic/> 
</http> 
1

theo bản demo thử nghiệm này của jax-rs với an ninh mùa xuân http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/jax_rs/spring_security/

đây là phương pháp đơn giản để xác thực mà không thúc đẩy thông tin.

bạn có thể đi với thực hiện RequestHandler và trọng

public Response handleRequest(Message message, ClassResourceInfo resourceClass); 

sau: http://cxf.apache.org/docs/secure-jax-rs-services.html cho bộ hoàn chỉnh các phương pháp tiếp cận.

6

Dưới đây là một ví dụ cấu hình phi xml để xác thực Nghỉ ngơi hoặc với hình thức hoặc với cơ bản bất cứ điều gì cần thiết:

.and().httpBasic(); 

làm điều kỳ diệu!))

@Configuration 
@EnableWebMvcSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http.authorizeRequests() 
      .antMatchers("/someurl").hasRole("ADMIN") 
      .antMatchers("/anotherurl").hasRole("USER") 
      .antMatchers("/", "main").permitAll().anyRequest().authenticated() 
      .and() 
      .httpBasic(); 

     http.formLogin() 
      .loginPage("/login").permitAll() 
      .and() 
      .logout().permitAll(); 
    } 
... 
} 
Các vấn đề liên quan