복붙노트

[SPRING] Spring Boot와 Spring Security로 REST API를 보호하는 방법은 무엇입니까?

SPRING

Spring Boot와 Spring Security로 REST API를 보호하는 방법은 무엇입니까?

나는 REST API 보안이 널리 논평 된 주제이지만, 필자는 나의 기준을 충족시키는 작은 프로토 타입을 만들 수 없다는 것을 알고있다. (나는이 기준이 현실적인지 확인해야한다). 리소스를 확보하는 방법과 Spring 보안을 사용하는 방법이 너무 많아서, 내 요구가 현실적인지 명확히해야합니다.

내 요구 사항

현재 상태

내 REST API는 잘 작동하지만 이제는 보안을 설정해야합니다. 솔루션을 찾고있을 때 javax.servlet.Filter 필터를 만들었습니다.

  @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);

    }

그러나 javax.servlet.filters를 사용하는이 솔루션은 스프링 서블릿 디스패처가있는 @ControllerAdvice를 통한 예외 처리 문제가 있기 때문에 필자가 필요로하는대로 작동하지 않습니다.

내가 필요한 것

이러한 기준이 현실적인지, 도움이되는지, Spring Security로 REST API를 보호하는 방법을 알고 싶습니다. 많은 튜토리얼 (예 : Spring Data REST + Spring Security)을 읽었지 만 모든 기본 구성에서 작동합니다. 자격 증명을 가진 사용자는 구성에서 메모리에 저장되며 DBMS로 작업하고 자체 인증자를 생성해야합니다.

시작하는 방법을 알려주세요.

해결법

  1. ==============================

    1.실제로, 토큰 Auth에 대한 필터 사용 -이 경우 가장 좋은 방법입니다.

    실제로, 토큰 Auth에 대한 필터 사용 -이 경우 가장 좋은 방법입니다.

    결국 Token의 속성을 관리하기 위해 Spring Data를 통해 CRUD를 생성 할 수 있습니다.

    내 토큰 필터는 다음과 같습니다. http://pastebin.com/13WWpLq2

    토큰 서비스 구현

    http://pastebin.com/dUYM555E

    이것은 문제가 아니며 다음과 같은 스프링 보안 설정을 통해 리소스를 관리 할 수 ​​있습니다 : .antMatchers ( "/ rest / blabla / **"). permitAll ()

    @Secured 주석을 클래스에 대해 살펴보십시오. 예:

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

    Spring Security configure로 돌아 가면 다음과 같이 url을 설정할 수 있습니다 :

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

    네, 토큰 필터를 통해 사용자가 인증됩니다.

    위의 단어로 돌아가서 @EnableWebSecurity를 ​​살펴보십시오. 수업은 다음과 같습니다 :

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {}
    

    configure 메소드를 오버라이드 (override)해야한다. 예를 들어, matchers를 구성하는 방법과 같은 아래의 코드. 다른 프로젝트에서 온거야.

        @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .antMatchers("/assets/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                    .usernameParameter("j_username")
                    .passwordParameter("j_password")
                    .loginPage("/login")
                    .defaultSuccessUrl("/", true)
                    .successHandler(customAuthenticationSuccessHandler)
                    .permitAll()
                .and()
                    .logout()
                    .logoutUrl("/logout")
                    .invalidateHttpSession(true)
                    .logoutSuccessUrl("/")
                    .deleteCookies("JSESSIONID")
                    .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .and()
                    .csrf();
    }
    
  2. ==============================

    2.스프링 보안은 또한 REST URL에 대한 인증 및 권한 부여에 매우 유용합니다. 사용자 지정 구현을 지정할 필요가 없습니다.

    스프링 보안은 또한 REST URL에 대한 인증 및 권한 부여에 매우 유용합니다. 사용자 지정 구현을 지정할 필요가 없습니다.

    먼저 아래와 같이 보안 구성에서 restAuthenticationEntryPoint에 대한 entry-point-ref를 지정해야합니다.

     <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>
    

    restAuthenticationEntryPoint에 대한 구현은 다음과 같을 수 있습니다.

     @Component
    public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
    
       public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException ) throws IOException {
          response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
       }
    }
    

    그 후에 RequestHeaderAuthenticationFilter를 지정해야합니다. RequestHeader 키가 있습니다. 이것은 기본적으로 사용자의 인증을 식별하는 데 사용됩니다. 일반적으로 RequestHeader는 REST 호출을하는 동안이 정보를 전달합니다. 예를 들어 아래 코드를 고려하십시오.

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

    이리,

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

    "Authorization"은 수신 요청을 나타내는 키입니다. 필요한 사용자의 인증 정보를 보유합니다. 또한 우리의 요구 사항을 충족시키기 위해 PreAuthenticatedAuthenticationProvider를 구성해야합니다.

       <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>
    

    이 코드는 사용자 정의 구현없이 인증 및 권한 부여를 통해 REST URL을 보호하는 데 유용합니다.

    전체 코드는 아래 링크를 참조하십시오.

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

  3. ==============================

    3.나는이 오랜 시간도 검색했다. 비슷한 프로젝트를 진행하고있다. Spring이 redis를 통해 세션을 구현하는 모듈을 가지고 있다는 것을 알았다. 그것은 쉽고 유용하게 보입니다. 나는 내 프로젝트에도 추가 할 것이다. 도움이 될 수 있음 :

    나는이 오랜 시간도 검색했다. 비슷한 프로젝트를 진행하고있다. Spring이 redis를 통해 세션을 구현하는 모듈을 가지고 있다는 것을 알았다. 그것은 쉽고 유용하게 보입니다. 나는 내 프로젝트에도 추가 할 것이다. 도움이 될 수 있음 :

    http://docs.spring.io/spring-session/docs/1.2.1.BUILD-SNAPSHOT/reference/html5/guides/rest.html

  4. ==============================

    4.REST API의 유효성을 검사하기 위해 두 가지 방법이 있습니다.

    REST API의 유효성을 검사하기 위해 두 가지 방법이 있습니다.

    1 - application.properties 파일에 설정된 기본 사용자 이름과 암호를 사용하는 기본 인증

    기본 인증

    2 - 실제 사용자 이름과 암호로 데이터베이스 (userDetailsService)를 사용하여 인증

    고급 인증

  5. from https://stackoverflow.com/questions/32548372/how-to-secure-rest-api-with-spring-boot-and-spring-security by cc-by-sa and MIT license