[SPRING] Spring Boot와 Spring Security로 REST API를 보호하는 방법은 무엇입니까?
SPRINGSpring 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.실제로, 토큰 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.스프링 보안은 또한 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.나는이 오랜 시간도 검색했다. 비슷한 프로젝트를 진행하고있다. Spring이 redis를 통해 세션을 구현하는 모듈을 가지고 있다는 것을 알았다. 그것은 쉽고 유용하게 보입니다. 나는 내 프로젝트에도 추가 할 것이다. 도움이 될 수 있음 :
나는이 오랜 시간도 검색했다. 비슷한 프로젝트를 진행하고있다. Spring이 redis를 통해 세션을 구현하는 모듈을 가지고 있다는 것을 알았다. 그것은 쉽고 유용하게 보입니다. 나는 내 프로젝트에도 추가 할 것이다. 도움이 될 수 있음 :
http://docs.spring.io/spring-session/docs/1.2.1.BUILD-SNAPSHOT/reference/html5/guides/rest.html
-
==============================
4.REST API의 유효성을 검사하기 위해 두 가지 방법이 있습니다.
REST API의 유효성을 검사하기 위해 두 가지 방법이 있습니다.
1 - application.properties 파일에 설정된 기본 사용자 이름과 암호를 사용하는 기본 인증
기본 인증
2 - 실제 사용자 이름과 암호로 데이터베이스 (userDetailsService)를 사용하여 인증
고급 인증
from https://stackoverflow.com/questions/32548372/how-to-secure-rest-api-with-spring-boot-and-spring-security by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] mockMvc를 사용하여 응답 본문에서 문자열을 확인하는 방법 (0) | 2019.01.07 |
---|---|
[SPRING] 여러 프로젝트 / 모듈에서 PropertyPlaceholderConfigurer를 통해 여러 속성 파일 사용 (0) | 2019.01.07 |
[SPRING] 스프링 프레임 워크에서 Dependency Injection과 Inversion of Control은 무엇입니까? (0) | 2019.01.07 |
[SPRING] Spring 대 EJB. Spring이 EJB를 대체 할 수 있습니까? [닫은] (0) | 2019.01.07 |
[SPRING] 봄 데이터 JPA - 개체를 반환하는 가장 좋은 방법은? (0) | 2019.01.07 |