2014-02-11 5 views
1

Я успешно применяю, как интегрировать пользовательские логины facebook с помощью facebook на основе этого article, который вращается вокруг создания пользовательской аутентификации по аутентификации, области, auth и пустого совпадения учетных данных для facebook.Apache Shiro: как вручную войти и создать сеанс?

Проблема, с которой я столкнулся сейчас, заключается в том, что, хотя я могу успешно выполнить вход в систему, я, похоже, не могу начать сеанс, как видно из моего пользовательского хранилища сеансов. Обратите внимание, что при использовании входа «normal-non-facebook» сеансы создаются.

Я думаю, что эта проблема имеет что-то делать с shiroFilter + в loginUrl будучи в состоянии создать нативную сессию и вручную делать SecurityUtils.getSubject(). Логин (маркер) не может создать нативную сессию.

Когда я сделать это в надежде создать сеанс после входа в систему вручную:

SecurityUtils.getSubject().login(facebookToken); 
SecurityUtils.getSubject().getSession(true); 

Я получаю это исключение:

org.apache.shiro.subject.support.DisabledSessionException: Session создание было отключено для текущего объекта. Это исключение указывает, что существует либо ошибка программирования (с использованием сеанса , когда она никогда не должна использоваться), либо что конфигурация Shiro должна соответствовать , чтобы настроить сеансы для текущего объекта. См. Org.apache.shiro.subject.support.DisabledSessionException JavaDoc для получения дополнительной информации.

Вот связанные моя сессия конфиги:

<bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> 
    <property name="globalSessionTimeout" value="xxx" /> 
    <property name="sessionDAO" ref="sessionDAO" /> 
    <property name="sessionValidationSchedulerEnabled" value="false" /> 
    <property name="sessionIdCookie.domain" value="xxx.com" /> 
</bean> 

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> 
    <property name="sessionMode" value="native" /> 
    <property name="realms"> 
     <list> 
      <ref bean="mainRealm" /> 
      <ref bean="fbRealm" /> 
     </list> 
    </property> 
    <property name="sessionManager" ref="sessionManager" /> 
</bean> 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> 
    <property name="securityManager" ref="securityManager"/> 
    <property name="loginUrl" value="/login"/> 
    <property name="successUrl" value="/"/> 
    <property name="unauthorizedUrl" value="/signup"/> 
    <property name="filterChainDefinitions"> 
     <value> 
      /login = ssl, authc 
      /logout = noSessionCreation, logout 
      /** = noSessionCreation, anon 
     </value> 
    </property> 
</bean> 

<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> 
    <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> 
    <property name="arguments" ref="securityManager"/> 
</bean> 

Таким образом, в конце концов, как я должен войти в систему таким образом, что автоматически создает сессию и возвращает куки сессии в браузер?

ответ

0

Это был фильтр noSessionCreation, который вызывает исключение.

Мне нужно было сделать req.setAttribute(DefaultSubjectContext.SESSION_CREATION_ENABLED, Boolean.TRUE);, прежде чем делать ввод в ручной форме, чтобы создать сеанс.

Теперь все отлично работает!

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