Наличие «UnknownSessionException: нет сеанса с идентификатором» на сервере ресурсов Oauth после аутентификации - PullRequest
0 голосов
/ 04 января 2019

Я работаю на сервере ресурсов с Spring 4.3.21.RELEASE и Spring Security 4.2.10.RELEASE,

Я настроил свой сервер ресурсов следующим образом

@Configuration
@EnableResourceServer
public class Oauth2ResourceServerConfig extends ResourceServerConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().hasRole("USER");
    }
    @Override
    public void configure(ResourceServerSecurityConfigurer config) {
        config.resourceId("resource_server");
        RemoteTokenServices remoteTokenServices = new RemoteTokenServices();
        remoteTokenServices.setCheckTokenEndpointUrl("http://my_url_to_validate_token/");
        remoteTokenServices.setClientId("cliend_id");
        remoteTokenServices.setClientSecret("secred_id");
        config.tokenServices(remoteTokenServices);
    }
}

Отладка RemoteTokenServices.loadAuthentication и OAuth2AuthenticationManager.authenticate работают правильно и выполняют правильную проверку и аутентификацию.

но после этого я получаю эту ошибку

Jan 04, 2019 4:58:13 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [apiServlet] in context with path [] threw exception [Filtered request failed.] with root cause
org.apache.shiro.session.UnknownSessionException: There is no session with id [0bfdf9b2-7e2b-421c-97d3-e0fef7f5a531]
    at org.apache.shiro.session.mgt.eis.AbstractSessionDAO.readSession(AbstractSessionDAO.java:170)
    at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSessionFromDataSource(DefaultSessionManager.java:236)
    at org.apache.shiro.session.mgt.DefaultSessionManager.retrieveSession(DefaultSessionManager.java:222)
    at org.apache.shiro.session.mgt.AbstractValidatingSessionManager.doGetSession(AbstractValidatingSessionManager.java:118)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupSession(AbstractNativeSessionManager.java:108)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.lookupRequiredSession(AbstractNativeSessionManager.java:112)
    at org.apache.shiro.session.mgt.AbstractNativeSessionManager.setAttribute(AbstractNativeSessionManager.java:216)
    at org.apache.shiro.session.mgt.DelegatingSession.setAttribute(DelegatingSession.java:151)
    at org.apache.shiro.session.ProxiedSession.setAttribute(ProxiedSession.java:128)
    at org.apache.shiro.web.servlet.ShiroHttpSession.setAttribute(ShiroHttpSession.java:202)

Есть ли что-то дополнительное, что необходимо настроить?

С нетерпением жду вашей помощи. Большое спасибо!

1 Ответ

0 голосов
/ 28 февраля 2019

Похоже, что эти проблемы связаны с механизмом безопасности Spring для защиты от атак с фиксацией сеанса и ShiroFilter, который, вероятно, создает новый сеанс, который Spring рассматривает как атаку с фиксацией сеанса.

Одним из решений является отключение фиксации сессии Spring Security (не очень хороший вариант)

http.sessionManagement().sessionFixation().none();

Другое изменение порядка фильтров, которое я ранее определил в этом порядке

//Shiro Filter
FilterRegistration.Dynamic shiroFilterRegistration = servletContext.addFilter("shiroFilter", new DelegatingFilterProxy("shiroFilter"));
shiroFilterRegistration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
//Shiro Filter

//Spring security filter
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME, DelegatingFilterProxy.class);
filterRegistration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/protected_resource");
// Spring security filter

Если мы изменим заказ

//Spring security filter
FilterRegistration.Dynamic filterRegistration = servletContext.addFilter(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME, DelegatingFilterProxy.class);
filterRegistration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/protected_resource");
// Spring security filter

//Shiro Filter
FilterRegistration.Dynamic shiroFilterRegistration = servletContext.addFilter("shiroFilter", new DelegatingFilterProxy("shiroFilter"));
shiroFilterRegistration.addMappingForUrlPatterns(EnumSet.allOf(DispatcherType.class), true, "/*");
//Shiro Filter

Мы избавляемся от этого исключения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...