将 Java 认证和授权服务编程模型用于 Web 认证

WebSphere® Application Server 支持 Java™ Platform, Enterprise Edition (Java EE) 声明式安全性模型。可以使用 Java EE 部署描述符来定义认证和访问控制策略。可以进一步堆叠定制登录模块来定制 WebSphere Application Server 认证机制。

开始之前

定制登录模块可以执行主体和凭证映射、定制安全性令牌和定制凭证处理以及在其他可能发生的情况中的错误处理。通常,您不需要使用应用程序代码来执行认证功能。如果您需要用应用程序代码执行认证功能,请使用此部分中所述的编程技术。通常使用声明式安全性;使用本节中描述的技巧作为最终的手段。

关于此任务

如果启用了轻量级第三方认证 (LTPA) 机制单点登录 (SSO) 选项,那么在成功登录后,Web 客户机登录会话由 LTPA SSO 令牌 Cookie 跟踪。注销时,此令牌被删除,以终止登录会话,但服务器端主体集未被删除。当您使用声明式安全性模型时,WebSphere Application Server Web 容器自动执行客户机认证和登录会话管理。通过在没有 Java EE 安全性约束的情况下设置登录页面,并且将客户机请求首先定向到您的登录页面,您可以使用应用程序代码执行认证。您的登录页面可以使用 Java 认证和授权服务 (JAAS) 编程模型来执行认证。要使 WebSphere Application Server Web 登录模块能够生成 SSO Cookie,请使用以下步骤。

过程

  1. 创建新的系统登录 JAAS 配置。要访问此面板,请单击安全性 > 全局安全性。在“Java 认证和授权服务”下,单击系统登录
  2. 对 WEB_INBOUND 登录配置进行手动克隆,并赋予它新的别名。要克隆该登录配置,请单击新建,输入配置的名称,单击应用,然后在“其他属性”下单击 JAAS 登录模块。单击新建,并配置 JAAS 登录模块。有关更多信息,请参阅Java 认证和授权服务的登录模块设置 WebSphere Application Server Web 容器使用 WEB_INBOUND 登录配置来认证 Web 客户机。更改 WEB_INBOUND 登录配置影响单元中的所有 Web 应用程序。您应该通过克隆 WEB_INBOUND 登录配置的内容来创建您自己的登录配置。
  3. 选择 wsMapDefaultInboundLoginModule 登录模块,然后单击定制属性。您的登录配置中定义了两个登录模块:ltpaLoginModulewsMapDefaultInboundLoginModule
  4. 添加登录属性名 Cookie,其值为 true。会启用两个登录模块来生成 LTPA SSO Cookie。不要将 Cookie 登录选项添加到原始的 WEB_INBOUND 登录配置。
  5. 在新的登录配置中堆叠您的定制 LoginModule(可选)。
  6. 通过使用新定义的登录配置来执行 JAAS LoginContext.login,将登录页面用于程序化登录。成功登录后,由于成功认证,ltpaLoginModulewsMapDefaultInboundLoginModule 生成 LTPA SSO Cookie。确切地,哪个 LoginModule 生成 SSO Cookie 取决于许多因素,包括系统认证配置和运行时情况(它超出了此部分的范围)。
  7. 调用已修改的 WSSubject.setRunAsSubject 方法将主体集添加到认证高速缓存。该主体集必须是 LoginModule 所创建的 WebSphere Application Server JAAS 主体集。将主体集添加到认证高速缓存从 SSO 令牌重新创建主体集。
  8. 通过从 WSSecurityHelper 类调用 revokeSSOCookies 方法,使用您的程序化注销页来撤销 SSO cookie。

    使用术语“cookie”是因为 WebSphere Application Server V5.1.1 及更高版本支持使用另一种加密算法的新 LTPA SSO 令牌,但可以将 Cookie 项配置成生成原始的 LTPA SSO 令牌以向后兼容。注意,主体集仍在认证高速缓存中,并只撤销 SSO Cookie。

    不推荐使用的功能部件 不推荐使用的功能部件: 建议不要使用 WSSecurityHelper 类中的 revokeSSOCookies(HttpServletRequest, HttpServletResponse) 方法。请使用 Java Servlet-3.0 logout() 方法提供的功能。阅读Servlet 安全性方法depfeat

示例

使用以下代码样本来执行认证。

避免故障 避免故障: 如果将用于获取处理程序的 WSCallbackHandlerFactoryset 工厂类的密码设为 null(如以下示例中所执行的操作那样),那么可允许没有密码的身份断言。gotcha
Suppose you wrote a LoginServlet.java:

	Import com.ibm.wsspi.security.auth.callback.WSCallbackHandlerFactory;
	Import com.ibm.websphere.security.auth.WSSubject;

	public Object login(HttpServletRequest req, HttpServletResponse res) 
	throws ServletException {

	PrintWriter out = null;
	try {
		out =  res.getWriter();
      res.setContentType("text/html");
	} catch (java.io.IOException e){
		// Error handling
	}

	Subject subject = null;
	try {
	LoginContext lc = new LoginContext("system.Your_login_configuration",
WSCallbackHandlerFactory.getInstance().getCallbackHandler(
userid, null, password, req, res, null));
		lc.login();
		subject = lc.getSubject();
      WSSubject.setRunAsSubject(subject);
	} catch(Exception e) {
		// catch all possible exceptions if you want or handle them separately
		out.println("Exception in LoginContext login + Exception = " +
 e.getMessage());
		throw new ServletException(e.getMessage());
	}

The following is sample code to revoke the SSO cookies upon a programming logout:


The LogoutServlet.java:

	public void logout(HttpServletRequest req, HttpServletResponse res,
 Object retCreds)  throws ServletException {
		 PrintWriter out =null;
		 try {
		 	out =  res.getWriter();
        res.setContentType("text/html");
		 } catch (java.io.IOException e){
			// Error Handling
		 }
		 try {
		  	WSSecurityHelper.revokeSSOCookies(req, res);
		 } catch(Exception e) {
		 	// catch all possible exceptions if you want or handle them separately
		 	out.println("JAASLogoutServlet: logout Exception = " + e.getMessage());
		 	throw new ServletException(e);
		 }
	 }

下一步做什么

有关 JAAS 认证的更多信息,请参阅开发带 Java 认证和授权服务的程序化登录。有关 AuthenLoginModule 登录模块的更多信息,请参阅示例:定制服务器端 Java 认证和授权服务认证以及登录配置

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_jaasauthentprog
文件名:tsec_jaasauthentprog.html