JSF在shiro中改变会话时间

时间:2012-10-06 15:31:49

标签: session jsf-2 primefaces session-timeout shiro

我需要在使用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 个答案:

答案 0 :(得分: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

我不认为这是唯一的方法,我相信有更好的方法,可能更少的hacky,更好的性能,但这对我有用,没有任何明显的性能影响(虽然我确实观察到这一点多次调用的方法,可能每次http请求一次)。如果您知道更好的方法,请留下另一个答案,我将非常乐意接受更好的解决方案。

答案 1 :(得分:0)

尝试推杆:

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

答案 2 :(得分:0)

DefaultWebSessionManager似乎有问题(至少在Shiro 1.1.0中)。 使用依赖于HttpSession的管理器,这是默认的或者可以 通过将会话模式设置为http。

来显式启用

然后Shiro将globalSessionTimeout应用于所有新的http会话。这段代码配置 会话管理器和超时(以毫秒为单位):

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

Shiro将始终应用超时,即使您没有自己指定。默认为30分钟 在1.1.0。

请注意,在HttpSession上使用setMaxInactiveInterval设置超时,所以 您的容器可能决定遵循其他设置并使之前的会话无效。 例如,参见Gryzorz的答案。

其他框架也喜欢调用setMaxInactiveInterval来安装自己的设置。

答案 3 :(得分:0)

AbstractNativeSessionManager的applyGlobalSessionTimeout()方法有代码 session.setTimeout(getGlobalSessionTimeout()); 如果重写applyGlobalSessionTimeout()以不调用setTimeout,则应采用自定义超时。