3

セキュリティとセッション管理に shiro を使用する jsf アプリケーションで、デフォルトのセッション タイムアウトを変更する必要があります。デフォルトは 30 分です。

以下は私のshiro構成です

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.IniShiroFilter</filter-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>
        [main]

        authc = com.foo.bar
        authcRealm = com.foo.barAuthenticatingRealm
        sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
        securityManager.sessionManager = $sessionManager
        securityManager.sessionManager.globalSessionTimeout = 20000

        unAuthc = com.foo.UnauthorisedFilter



        /** = authc

        </param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>

上記の構成を使用すると、ログイン時にすぐにログアウトされます。次の行を削除すると、デフォルトでタイムアウトが 30 分に設定されます

        sessionManager = org.apache.shiro.web.session.mgt.DefaultWebSessionManager
        securityManager.sessionManager = $sessionManager
        securityManager.sessionManager.globalSessionTimeout = 20000
4

4 に答える 4

1

ネットで検索しようとして失敗し、ここでも失敗した後、ようやく方法を見つけることができました(一種のハックであり、最良の方法ではありません)。ここに行きます

Shiro はデフォルトでタイプ のセキュリティ マネージャを作成するDefaultWebSecurityManagerので、それを拡張することにしました。そのcreateSubject()メソッドをインターセプトし、次のようにタイムアウトを設定しました

public class SecurityManager extends DefaultWebSecurityManager {    
    @Override
    public Subject createSubject(SubjectContext subjectContext) {
        Subject subject = super.createSubject(subjectContext);
        subject.getSession().setTimeout(10 * 60 * 1000);
        return subject;
    }
}

SecurityManager次に、次のように構成でこれを割り当てますsessionManager(セキュリティマネージャーをセッションマネージャーと呼ぶ理由は非常に奇妙です。これを理解する前に多くの時間を無駄にしました)

[main]
authc = com.foo.bar
authcRealm = com.foo.barAuthenticatingRealm
sessionManager = com.foo.securityManager
unAuthc = com.foo.UnauthorisedFilter
/** = authc

これが唯一の方法だとは思いません。おそらくハックが少なく、パフォーマンスが向上する、はるかに優れた方法があると確信していますが、これは私にとっては機能し、パフォーマンスに目立った影響はありませんでした(ただし、このメソッドが呼び出されるのを観察しました数回、おそらく http リクエストごとに 1 回)。より良い方法を知っている場合は、別の回答を残してください。より良い解決策を喜んで受け入れます。

于 2012-10-07T20:12:06.353 に答える
0

入れてみてください:

<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>1</session-timeout>
</session-config>

あなたのweb.xmlで

于 2012-10-09T10:14:26.367 に答える
0

DefaultWebSessionManager に問題があるようです (少なくとも Shiro 1.1.0 では)。HttpSession に依存するマネージャーを使用します。これはデフォルトであるか、セッション モードを http に設定することで明示的に有効にすることができます。

その後、Shiro は globalSessionTimeout をすべての新しい http セッションに適用します。このコードは、セッション マネージャーとタイムアウト (ミリ秒単位) を構成します。

securityManager.sessionMode = http
securityManager.sessionManager.globalSessionTimeout = 3600000

自分でタイムアウトを指定しなくても、Shiro は常にタイムアウトを適用します。デフォルトは 1.1.0 で 30 分です。

タイムアウトは HttpSession の setMaxInactiveInterval で設定されることに注意してください。そのため、コンテナーは他の設定に従ってセッションを無効にすることを決定する可能性があります。たとえば、Gryzorz の回答を参照してください。

他のフレームワークも setMaxInactiveInterval を呼び出して独自の設定をインストールすることを好みます。

于 2013-05-31T16:05:25.333 に答える