Czy ktoś mógłby mi pomóc z przykładem aplikacji Spring Boot, która zawiera usługę Rest z punktami końcowymi chronionymi przez Spring Security przy użyciu oAuth2 z poświadczeniami użytkownika z bazy danych MySQL?Usługa Spring Boot Rest z oAuth2 Poświadczenia bezpieczeństwa z bazy danych
Odpowiedz
Co na ten temat: https://github.com/spring-projects/spring-security-oauth/tree/master/tests/annotation/jdbc (to nie jest MySQL, ale to JDBC, więc transformacja jest banalna)?
Proszę odnieść się do https://github.com/royclarkson/spring-rest-service-oauth/ i wykonać następujące zmiany Wykorzystuje źródło danych podstawowy określony w application.properties,
@Configuration
public class OAuth2ServerConfiguration {
private static final String RESOURCE_ID = "rest_api";
@Configuration
@EnableResourceServer
protected static class ResourceServerConfiguration extends
ResourceServerConfigurerAdapter {
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
resources.resourceId(RESOURCE_ID);
}
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/users").hasRole("ADMIN")
.antMatchers("/review").authenticated()
.antMatchers("/logreview").authenticated()
.antMatchers("/oauth/token").authenticated()
.and()
.csrf()
.csrfTokenRepository(csrfTokenRepository()).and()
.addFilterAfter(csrfHeaderFilter(), CsrfFilter.class)
;
}
private Filter csrfHeaderFilter() {
return new OncePerRequestFilter() {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class
.getName());
if (csrf != null) {
Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
String token = csrf.getToken();
if (cookie == null || token != null
&& !token.equals(cookie.getValue())) {
cookie = new Cookie("XSRF-TOKEN", token);
cookie.setPath("/");
response.addCookie(cookie);
}
}
filterChain.doFilter(request, response);
}
};
}
private CsrfTokenRepository csrfTokenRepository() {
HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
repository.setHeaderName("X-XSRF-TOKEN");
return repository;
}
}
@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends
AuthorizationServerConfigurerAdapter {
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
DataSource dataSource;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
throws Exception {
endpoints
.tokenStore(new JdbcTokenStore(dataSource))
.authenticationManager(this.authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients
.jdbc(dataSource);
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
DefaultTokenServices tokenServices = new DefaultTokenServices();
tokenServices.setSupportRefreshToken(true);
tokenServices.setAccessTokenValiditySeconds(300);
tokenServices.setRefreshTokenValiditySeconds(6000);
tokenServices.setTokenStore(new JdbcTokenStore(dataSource));
return tokenServices;
}
}
}
Witam, jestem nowy w tym, ale z pewnych powodów nie pracuję dla żądań POST. {"error": "access_denied", "error_description": "Nie znaleziono oczekiwanego tokenu CSRF. Czy twoja sesja wygasła?"} Działa dobrze z metodami GET –
ma ten sam problem, czy znalazłeś rozwiązanie? –
Thanks Dave. Wciąż jestem całkiem nowy z bezpieczeństwem wiosennym. Wiosenne uruchamianie ułatwia utworzenie usługi RESTful, ale nadal nie jestem pewien co do implementacji zabezpieczeń za pomocą oAuth2 i referencji bazy danych. Widziałem niektóre przed-wiosenne projekty rozruchowe, które tworzy tabele znaczników i odświeżania w bazie danych. Czy to już nie jest zwyczaj? https://github.com/royclarkson/spring-rest-service-oauth używa uwierzytelniania w pamięci. Czy jest to preferowane powyżej przechowywania żetonów w DB? –
To łącze zawiera pliki SQL dla wspomnianego schematu (są one wykonywane podczas uruchamiania dla bazy danych w pamięci, ale można je wykonać samodzielnie dla mysql). Próbka Roya jest podobna (i równie minimalna), ale magazyn użytkownika w pamięci oczywiście nie będzie przydatny w produkcji dla większości systemów. –