Останете основното удостоверяване чрез пролетна защита без влизане във формуляр

Опитвам се да създам спокойна уеб услуга, която ще се използва от други уеб услуги. В идеалния случай, когато клиент получи достъп до услугата и не е удостоверен, той трябва да получи 401. Искам потребителят да може да се удостовери, като добави заглавка за удостоверяване към заявката. Не искам потребителят да попълни формуляр за вход и да го публикува. Също така не искам да съхранява идентификационни данни за влизане в бисквитка (т.е. запазване на състоянието), всичко трябва да е в заглавката за удостоверяване, изпращана с всяка заявка. Използвах spring roo, за да създам уеб услугата.

Това, което имам в момента (взето от един от пролетните уроци за сигурност 3.1), когато потребителят получи 401, той получава подкана със страница за вход и след това публикува страницата, получавайки бисквитка, която изпраща с всяка заявка.

Ето моя пролетен 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>

Когато изпратя заявка от curl, получавам следното:

 $ 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

където основният ми токен за заглавка е base64(customer1:other)

Как мога да накарам уеб услугата да приеме заглавката за удостоверяване и да не ме пренасочва към страница за вход?

Когато премахна от security.xml, получавам следното:

excpetion:org.springframework.beans.factory.parsing.BeanDefinitionParsingException:
    Configuration problem: No AuthenticationEntryPoint could be established.
    Please make sure you have a login mechanism configured through the namespace
    (such as form-login) or specify a custom AuthenticationEntryPoint with the
    'entry-point-ref' attribute

person Andy N    schedule 25.04.2013    source източник


Отговори (3)


Ето примерна не-xml конфигурация за Rest удостоверяване или с формуляр или с основно каквото е необходимо:

.and().httpBasic(); 

прави магията! ))

@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();
    }
...
}
person Andrew    schedule 12.11.2014

Трябваше да премахна <form-login> и да добавя <http-basic>. Също така добавих create-session-"stateless" към моята конфигурация.

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

следвайте тази тестова демонстрация на jax-rs с пролетна сигурност http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/jax_rs/spring_security/

това е прост подход за удостоверяване без насърчаване на идентификационни данни.

можете да приложите RequestHandler и да замените

public Response handleRequest(Message message, ClassResourceInfo resourceClass);

следвайте: http://cxf.apache.org/docs/secure-jax-rs-services.html за пълен набор от подходи.

person Jayaram    schedule 25.04.2013