2016-03-16 1 views
0

Я использую JdbcTokenStore и базы данных спящего режима параллельно, и я получаю следующее сообщение об ошибке при запросе маркера доступа:Spring OAuth2: Не удалось получить транзакции синхронизированные сессии для текущего потока

sparklr2 09:59:54.292 [DEBUG] ResourceOwnerPasswordTokenGranter - Getting access token for: officialclient 
sparklr2 09:59:54.292 [DEBUG] ProviderManager - Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider 
sparklr2 09:59:54.292 [DEBUG] DefaultAuthenticationEventPublisher - No event was found for the exception org.springframework.security.authentication.InternalAuthenticationServiceException 
sparklr2 09:59:54.308 [INFO] TokenEndpoint - Handling error: InternalAuthenticationServiceException, Could not obtain transaction-synchronized Session for current thread 
sparklr2 09:59:54.448 [DEBUG] ExceptionTranslationFilter - Chain processed normally 
sparklr2 09:59:54.448 [DEBUG] SecurityContextPersistenceFilter - SecurityContextHolder now cleared, as request processing completed 
Mär 16, 2016 9:59:54 AM org.apache.catalina.core.StandardWrapperValve invoke 
SCHWERWIEGEND: Servlet.service() for servlet [dispatcher] in context with path [/organizer] threw exception [Request processing failed; nested exception is error="access_denied", error_description="Error requesting access token."] with root cause 
org.springframework.web.client.HttpClientErrorException: 401 Unauthorized 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:91) 
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport$AccessTokenErrorHandler.handleError(OAuth2AccessTokenSupport.java:244) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:641) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:597) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:565) 
    at org.springframework.security.oauth2.client.token.OAuth2AccessTokenSupport.retrieveToken(OAuth2AccessTokenSupport.java:137) 
    at org.springframework.security.oauth2.client.token.grant.password.ResourceOwnerPasswordAccessTokenProvider.obtainAccessToken(ResourceOwnerPasswordAccessTokenProvider.java:47) 
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainNewAccessTokenInternal(AccessTokenProviderChain.java:142) 
    at org.springframework.security.oauth2.client.token.AccessTokenProviderChain.obtainAccessToken(AccessTokenProviderChain.java:118) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.acquireAccessToken(OAuth2RestTemplate.java:221) 
    at org.springframework.security.oauth2.client.OAuth2RestTemplate.getAccessToken(OAuth2RestTemplate.java:173) 
    at my.base.package.controller.OfficialClientController.authenticate(OfficialClientController.java:71) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:817) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:731) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:968) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:870) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:844) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:207) 
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:176) 
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Я запрос маркера следующим образом:

ResourceOwnerPasswordResourceDetails resourceDetails = new ResourceOwnerPasswordResourceDetails(); 
     resourceDetails.setClientAuthenticationScheme(AuthenticationScheme.header); 
     resourceDetails.setAccessTokenUri(tokenEndpoint); 
     resourceDetails.setScope(Arrays.asList("read", "write")); 
     resourceDetails.setId("resource"); 
     resourceDetails.setClientId("officialclient"); 
     resourceDetails.setClientSecret("officialclientsecret"); 
     resourceDetails.setUsername(username); 
     resourceDetails.setPassword(password); 

     OAuth2RestTemplate template = new OAuth2RestTemplate(resourceDetails, context); 
     return template.getAccessToken(); 

Я активировал управление транзакциями с помощью @EnableTransactionManagement на моей конфигурации корня:

@Configuration 
@EnableWebSecurity 
@Import({WebMvcConfig.class, HibernateConfig.class, MethodSecurityConfig.class, OAuth2ServerConfig.class}) 
@ComponentScan("my.base.package") 
@EnableTransactionManagement 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 
    ... 
} 

В HibernateConfig я добавил следующий код:

@Bean 
@Autowired 
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) { 
    HibernateTransactionManager txManager = new HibernateTransactionManager(); 
    txManager.setSessionFactory(sessionFactory); 
    return txManager; 
} 

Что я делаю неправильно?

Редактировать

Я использую пользовательский UserDetailsManager со следующим loadUserByUsername способом:

@Override 
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 
     Criteria crit = getSession().createCriteria(OrganizerUser.class); 
     crit.add(Restrictions.eq("username", username)); 
     OrganizerUser user = (OrganizerUser) crit.uniqueResult(); 

     if(user == null) { 
      trans.rollback(); 
      throw new UsernameNotFoundException("Username not found!"); 
     } 
     else { 
      return user; 
     } 
    } 

ответ

0

мне не хватает @Transactional на обычае UserDetailsManager.

+0

Пожалуйста, используйте ссылку для редактирования по вашему вопросу, чтобы добавить дополнительную информацию. Кнопка «Ответ на сообщение» должна использоваться только для полных ответов на вопрос. - [Из обзора] (/ review/low-quality-posts/11651632) –

+0

Это было на самом деле полное решение моей проблемы – user2035039

+0

Можете ли вы принять свой собственный ответ в этом случае? Потому что кто-то в будущем может попытаться написать новый ответ на ваш вопрос. –

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

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