2015-09-13 57 views
50

Wiem, że zabezpieczenie REST API jest szeroko komentowanym tematem, ale nie jestem w stanie stworzyć małego prototypu spełniającego moje kryteria (i muszę potwierdzić, że te kryteria są realistyczne). Jest tak wiele opcji, jak zabezpieczyć zasoby i jak pracować z bezpieczeństwem Spring, muszę wyjaśnić, czy moje potrzeby są realistyczne.Jak zabezpieczyć API REST za pomocą Spring Boot i Spring Security?

Moje wymagania

  • Reklamowe Authenticator oparte - użytkownicy zapewnią jego poświadczeń i uzyskać niepowtarzalny i czas ograniczony dostęp token. Chciałbym zarządzać tworzeniem tokenów, sprawdzaniem poprawności, wygaśnięciem we własnej implementacji.
  • Niektóre zasoby reszta będzie publiczna - nie ma potrzeby uwierzytelniania w ogóle,
  • Niektóre zasoby będą dostępne tylko dla użytkowników z prawami administratora,
  • Inne zasób będzie dostępny po autoryzacji dla wszystkich użytkowników.
  • Nie chcę używać uwierzytelniania podstawowego
  • konfiguracja kod Java (nie XML)

Aktualny stan

Moja REST API działa bardzo dobrze, ale teraz muszę ją zabezpieczyć . Kiedy szukałem rozwiązania stworzyłem javax.servlet.Filter filtr:

@Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest request = (HttpServletRequest) req; 

     String accessToken = request.getHeader(AUTHORIZATION_TOKEN); 
     Account account = accountDao.find(accessToken); 

     if (account == null) {  
      throw new UnauthorizedException();  
     } 

     chain.doFilter(req, res); 

    } 

Ale to rozwiązanie z javax.servlet.filters nie działa jak trzeba, ponieważ istnieje problem z obsługą wyjątków poprzez @ControllerAdviceservlet dispatcher z wiosną.

Co muszę

Chciałbym wiedzieć, czy kryteria te są realistyczne i uzyskać jakąkolwiek pomoc, jak rozpocząć zabezpieczanie REST API z wiosennym Security. Przeczytałem wiele samouczków (np. Spring Data REST + Spring Security), ale wszystkie działają w bardzo podstawowej konfiguracji - użytkownicy z ich referencjami są zapisani w pamięci w konfiguracji i muszę pracować z DBMS i utworzyć własny wystawca uwierzytelnienia.

Proszę dać mi kilka pomysłów, jak zacząć.

Odpowiedz

36

Reklamowe uwierzytelnianie oparte - użytkownicy będą dostarczać swoje poświadczenia i dostać unikalny znacznik czasu i ograniczony dostęp. Chciałbym zarządzać tworzeniem tokena , sprawdzaniem poprawności, wygaśnięciem we własnej implementacji.

Właściwie stosowanie filtru dla tokena Auth - Najlepszym sposobem, w tym przypadku

Ostatecznie, można utworzyć CRUD poprzez wiosenny danych do zarządzania właściwości Reklamowe Like wygaśnie, etc.

Oto mój znak filtr: http://pastebin.com/13WWpLq2

i realizacja Reklamowe usługi

http://pastebin.com/dUYM555E

Niektóre zasoby reszta będzie publiczna - nie ma potrzeby uwierzytelniania w ogóle

To nie problem, możesz zarządzać swoimi zasobami ia config bezpieczeństwo Wiosna tak: .antMatchers("/rest/blabla/**").permitAll()

Niektóre zasoby będą dostępne tylko dla użytkowników z prawami administratora,

Spójrz na @Secured adnotacji do klasy. Przykład:

@Controller 
@RequestMapping(value = "/adminservice") 
@Secured("ROLE_ADMIN") 
public class AdminServiceController { 

Drugi zasób będzie dostępny po autoryzacji dla wszystkich użytkowników.

Powrót do konfigurowania Wiosna zabezpieczeń, można skonfigurować url tak:

http 
      .authorizeRequests() 
      .antMatchers("/openforall/**").permitAll() 
      .antMatchers("/alsoopen/**").permitAll() 
      .anyRequest().authenticated() 

Nie chcę używać uwierzytelniania podstawowego

Tak, poprzez filtr tokena, Twoi użytkownicy zostaną uwierzytelnieni.

konfiguracja kod Java (nie XML)

Powrót do słów powyższych, spojrzeć na @EnableWebSecurity. Twoja klasa będzie:

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter {} 

Trzeba zastąpić configure metody. Kod poniżej, na przykład, jak skonfigurować matchers. To z innego projektu.

+0

możesz mi pomóc w moim pytaniu proszę? https://stackoverflow.com/questions/46065063/spring-boot-basic-authentication –

+0

Każdy przykładowy projekt, który zawiera wszystkie wymagania? –

3

Wiosna bezpieczeństwa również bardzo użyteczne dla zapewnienia uwierzytelniania i autoryzacji do reszty adresów URL. Nie musimy określać żadnych niestandardowych implementacji.

Najpierw należy określić punkt-punkt-odnówAuthenticationEntryPoint w konfiguracji zabezpieczeń, jak poniżej.

<security:http pattern="/api/**" entry-point-ref="restAuthenticationEntryPoint" use-expressions="true" auto-config="true" create-session="stateless" > 

    <security:intercept-url pattern="/api/userList" access="hasRole('ROLE_USER')"/> 
    <security:intercept-url pattern="/api/managerList" access="hasRole('ROLE_ADMIN')"/> 
    <security:custom-filter ref="preAuthFilter" position="PRE_AUTH_FILTER"/> 
</security:http> 

Realizacja dla resztyAuthenticationEntryPoint może być poniżej.

@Component 
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint { 

    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { 
     response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); 
    } 
} 

Po tym trzeba określić RequestHeaderAuthenticationFilter. Zawiera klucz RequestHeader. Jest to zasadniczo używane do identyfikacji uwierzytelniania użytkownika. Generalnie RequestHeader przenosi te informacje podczas wykonywania wywołań REST. Na przykład rozważyć poniżej kod

<bean id="preAuthFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter"> 
    <property name="principalRequestHeader" value="Authorization"/> 
    <property name="authenticationManager" ref="authenticationManager" /> 
    </bean> 

Tutaj

<property name="principalRequestHeader" value="Authorization"/> 

"Authorization" jest kluczem przedstawił żądania przychodzące. Przechowuje wymagane informacje uwierzytelniające użytkownika. Należy również skonfigurować PreAuthenticatedAuthenticationProvider, aby spełnić nasze wymagania.

<bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> 
<property name="preAuthenticatedUserDetailsService"> 
    <bean id="userDetailsServiceWrapper" 
     class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> 
    <property name="userDetailsService" ref="authenticationService"/> 
    </bean> 
</property> 
</bean> 

Ten kod będzie pracować dla zabezpieczenia adresy URL REST za pomocą uwierzytelnianie i autoryzacja bez implementacji niestandardowych.

Dla Kompletny kod znajdą poniższego linku:

https://github.com/srinivas1918/spring-rest-security

0

do sprawdzania poprawności REST API istnieją 2 sposoby

1 - Podstawowe uwierzytelnianie przy użyciu domyślnej nazwy użytkownika i hasła utworzone w pliku application.properties

Basic Authentication

2 - uwierzytelnienia przy użyciu bazy danych (u serDetailsService) z rzeczywistą nazwę użytkownika i hasło

Advanced Authentication

Powiązane problemy