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

然后在配置中将其分配SecurityManagersessionManager(很奇怪为什么他们称安全管理器为会话管理器,我在弄清楚这一点之前浪费了很多时间),如下所示

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

我不认为这是唯一的方法,我相信有更好的方法,可能不那么hacky,性能更好,但这对我有用,没有任何明显的性能影响(尽管我确实观察到这个方法被调用几次,可能每个http请求一次)。如果您知道更好的方法,请留下另一个答案,我很乐意重新接受更好的解决方案。

于 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 回答
0

AbstractNativeSessionManager 的 applyGlobalSessionTimeout() 方法有代码 session.setTimeout(getGlobalSessionTimeout()); 如果您覆盖 applyGlobalSessionTimeout() 以不调用 setTimeout,它应该采用自定义超时。

于 2014-11-25T13:34:18.090 回答