2014-02-11 50 views
1

我已經成功地應用瞭如何基於這個article整合facebook用戶登錄與facebook,它圍繞創建自定義認證令牌,領域,認證信息和facebook的空憑證匹配器。Apache Shiro:如何手動登錄和創建會話?

我現在遇到的問題是,儘管我可以成功地進行登錄,但我似乎無法啓動會話,從我的自定義會話存儲中可以看到。請注意,使用'normal-non-facebook'登錄有效,會話被創建。

我的猜測是,這個問題有事情做與shiroFilter +的loginUrl能夠創建本地會話,並手動做SecurityUtils.getSubject()登錄(令牌)無法創建本地會話。

當我這樣做是希望創建手動登錄後的會話:

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

我得到這個異常:

org.apache.shiro.subject.support.DisabledSessionException:會話 當前主題的創建已被禁用。 這一例外表示存在編程錯誤(在不應使用會話時使用會話 ),或者調整Shiro的配置 以允許爲當前主題創建會話。 有關更多信息,請參閱org.apache.shiro.subject.support.DisabledSessionException JavaDoc。

這裏是我的會話相關CONFIGS:

<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> 

所以最後,我應該如何在自動創建會話並返回會話cookie到瀏覽器的方式登錄?

回答

0

這是導致異常的noSessionCreation過濾器。

在完成手動登錄以創建會話之前,我必須做req.setAttribute(DefaultSubjectContext.SESSION_CREATION_ENABLED, Boolean.TRUE);

現在一切都很好!