2016-02-16 5 views
0

Я уже ломаю голову над этим на пару дней. Backstory is, я использую Spring Boot с зависимостью spring-boot-starter-security для аспекта безопасности. Я пытаюсь создать веб-службу REST, которая должна отвечать только JSON (или XML, если я также решила реализовать это). Я могу вернуть ресурсы и работать с URI, поэтому проблем нет. У меня даже есть проверка подлинности объекта json в безопасности.Spring Boot Security Вход в систему (v4)

Итак, вот моя проблема. Когда несанкционированный пользователь пытается получить доступ к ограниченному ресурсу, Spring Security предоставляет страницу входа (HTML). Это проблематично. Я просто хочу, чтобы он возвратил 401 и, возможно, объект ошибки JSON по моему выбору. То же самое с успешными входами. Я не хочу, чтобы он перенаправлялся. И особенно не подготовленная HTML-страница.

Я искал учебники, и все упоминают, используя AuthenticationEntryPoint и т. Д. Для управления потоком. НО! У меня этого нет. По-видимому, этот метод больше не существует для класса HttpSecurity. У кого-нибудь есть ответ? Вот соответствующий код, я буду поставлять больше, если вам это нужно.

@Configuration 
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    @Autowired 
    private UserDetailsService userDetailsService; 

    private JsonAuthenticationFilter authFilter; 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     authFilter = new JsonAuthenticationFilter(); 
     authFilter.setRequiresAuthenticationRequestMatcher(new AntPathRequestMatcher("/login","POST")); 
     authFilter.setAuthenticationManager(this.authenticationManagerBean()); 

     httpSecurity 
      .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class) 
      .csrf() 
       .disable() 
      .formLogin() 
       .permitAll() 
       .loginProcessingUrl("/login") 
       .failureUrl("/error") 
       .usernameParameter("username") 
       .passwordParameter("password") 
      .and() 
      .logout() 
       .permitAll() 
       .logoutUrl("/logout") 
      .and() 
      .authorizeRequests() 
       .antMatchers("/", "/version") 
       .permitAll() 
      .and() 
      .authorizeRequests() 
       .anyRequest() 
       .authenticated(); 
    } 

    @Override 
    public void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder()); 
    } 
} 

И зависимостей Maven ...

<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.3.2.RELEASE</version> 
    <relativePath/> <!-- lookup parent from repository --> 
</parent> 

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <java.version>1.8</java.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-devtools</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-hateoas</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-validation</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 

    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <scope>runtime</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-test</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.restdocs</groupId> 
     <artifactId>spring-restdocs-mockmvc</artifactId> 
     <scope>test</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>com.datastax.cassandra</groupId> 
     <artifactId>cassandra-driver-mapping</artifactId> 
    </dependency> 
</dependencies> 

ответ

3

Когда не-авторизованный пользователь пытается получить доступ к ограниченным ресурсом, Spring Security обеспечивает страницу входа в систему (HTML). Это проблематично. Я просто хочу, чтобы вернуть 401 и, возможно, JSON объект ошибки из моих выбора

Если вы не хотите Form Login, просто отключить его в SecurityConfiguration. Для того, чтобы сделать это, заменить эту часть конфигурации:

formLogin() 
     .permitAll() 
     .loginProcessingUrl("/login") 
     .failureUrl("/error") 
     .usernameParameter("username") 
     .passwordParameter("password") 

С:

formLogin() 
     .disable(); 

Или вы можете просто выбросить formLogin часть.

BUT! У меня этого нет. По-видимому, этот метод больше не существует для класса HttpSecurity. У кого-нибудь есть ответ?

Это под exceptionHandling:

http.exceptionHandling() 
     .authenticationEntryPoint(yourEntryPoint) 
+0

Будет ли отключить блок formLogin избавиться от обработки URL? Мне нравится, что весна просто вводит объект json POST-ed в/login автоматически. – CP510

+0

HOLY C *** ЭТО РАБОТАЕТ. Это просто не задокументировано? Или я просто сосать при чтении документов? – CP510

+0

Это задокументировано, но не в документации весеннего ботинка. Вы должны прочитать весеннюю справочную документацию по безопасности, которая очень тщательна. –

Смежные вопросы