13.4. 在 Web 应用程序里使用单点登录

概述

单点登录(Single Sign On,SSO)是通过 web 和 Infinispan 子系统提供的。请使用下列步骤在 web 应用程序里配置 SSO。

前提条件

  • 你需要一个处理验证和授权的配置好的安全域。
  • 你需要 infinispan 子系统。对于受管域它位于 full-ha 配置集里,而对于独立服务器,你需要使用 standalone-full-ha.xml 配置。
  • webcache-container 和 SSO cache-container 都必须存在。配置文件示例已经包含了 web cache-container,而一些配置也已经包含了 SSO cache-container。请使用下列命令来检查并启用 SSO cache-container。请注意,这些命令修改了受管域的 full 配置集。对于独立服务器,你可以修改这些命令来使用其他的配置集,或者去掉命令行的 /profile=full 部分。

    例 13.1. 检查 web cache-container

    上面提及的配置集和配置在默认情况下包括 web cache-container。请使用下列命令来检验它的存在。如果你使用了不同的配置集,请用这个配置集的名称来替换 ha
    /profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=false,proxies=false,include-runtime=false,include-defaults=true)
    如果结果为 success,表示子系统存在。否则,你需要添加它。

    例 13.2. 添加 web cache-container

    请使用下列三个命令来启用你的配置里的 web cache-container。修改配置集的名称以及其他参数。这里的参数是用于默认配置的。
    /profile=ha/subsystem=infinispan/cache-container=web:add(aliases=["standard-session-cache"],default-cache="repl",module="org.jboss.as.clustering.web.infinispan")
    /profile=ha/subsystem=infinispan/cache-container=web/transport=TRANSPORT:add(lock-timeout=60000)
    /profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=repl:add(mode="ASYNC",batching=true)

    例 13.3. 检查 SSO cache-container

    运行下列管理 CLI 命令:
    /profile=ha/subsystem=infinispan/cache-container=web/:read-resource(recursive=true,proxies=false,include-runtime=false,include-defaults=true)
    找到类似于 "sso" => { 的输出:
    如果没有找到则表示 SSO cache-container 没有在你的配置里出现。

    例 13.4. 添加 SSO cache-container

    /profile=ha/subsystem=infinispan/cache-container=web/replicated-cache=sso:add(mode="SYNC", batching=true)
  • 你需要配置 web 子系统来使用 SSO。下面的命令在名为 default-host 的虚拟服务器和 cookie 域 domain.com 上启用了 SSO。缓存名称是 sso,重新验证是禁用的。
    /profile=ha/subsystem=web/virtual-server=default-host/sso=configuration:add(cache-container="web",cache-name="sso",reauthenticate="false",domain="domain.com")
  • 你需要配置将共享 SSO 信息的每个应用程序以在 jboss-web.xml 里使用相同 <security-domain> 以及在 web.xml 里使用相同的 Realm 元素。
群集和非群集 SSO 阀之间的区别

群集 SSO 允许在不同的主机间共享验证信息,而非群集的 SSO 不允许。群集和非群集的 SSO 阀的配置方式相同,但群集 SSO 包含了 cacheConfigprocessExpiresIntervalmaxEmptyLife 参数,它们控制持久数据的群集复制。

例 13.5. 群集 SSO 配置示例

因为群集和非群集 SSO 配置是如此的相似,所以我们只列出了群集 SSO 的配置。这个例子使用了一个名为 tomcat 的安全域。
<jboss-web>
	<security-domain>tomcat</security-domain>
	<valve>
		<class-name>org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn</class-name>
		<param>
			<param-name>maxEmptyLife</param-name>
			<param-value>900</param-value>
		</param>
	</valve>
</jboss-web>
		

表 13.1. SSO 配置选项

选项 描述
cookieDomain
用于 SSO cookie 的主机域。默认为 /。要允许 app1.xyz.comapp2.xyz.com 共享 SSO cookie,你可以设置 cookieDomain 为 xyz.com
maxEmptyLife
只适用于群集 SSO。没有活动会话的 SSO 阀可被请求所使用的最长时间(秒)。正值允许正确处理节点的关闭,如果它是唯一带有附加到阀的会话的节点的话。如果 maxEmptyLife 被设置为 0,当本地会话复制时阀将终止,但会从群集应用程序里备份会话以供其他群集节点使用。允许阀超过其受管会话的生命周期给了用户进行其他请求的时间,以便失效切换到不同的节点,从而可以激活会话的备份。它默认为 1800 秒(30 分钟)。
processExpiresInterval
只适用于群集 SSO。阀寻找和使已超过 MaxEmptyLife 的 SSO 实例失效的最长时间(秒)。默认为 60 秒(1 分钟)。
requiresReauthentication
如果为 true,每个请求都使用缓存的凭证来重新验证安全域。如果为 false(默认值),对于这个阀来说,有效的 SSO cookie 就足够验证每个新的请求了。
使会话失效

应用程序可以通过调用 javax.servlet.http.HttpSession.invalidate() 方法在程序里使会话失效。