/* ================================================================== * Created [2009-4-27 下午11:32:55] by Jon.King * ================================================================== * TSS * ================================================================== * mailTo:jinpujun@hotmail.com * Copyright (c) Jon.King, 2009-2012 * ================================================================== */ package com.jinhe.tss.portal.sso; import java.io.IOException; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.log4j.Logger; import com.jinhe.tss.core.Global; import com.jinhe.tss.core.sso.Environment; import com.jinhe.tss.core.sso.ILoginCustomizer; import com.jinhe.tss.core.sso.IPWDOperator; import com.jinhe.tss.core.sso.SSOConstants; import com.jinhe.tss.core.sso.appserver.AppServer; import com.jinhe.tss.core.sso.context.Context; import com.jinhe.tss.um.service.ILoginService; /** * <p> OAPasswordCustomizer.java </p> * 对OA用户密码的自定义操作。<br> * 在PMS登陆时(主要通过PMS搭建的门户网站登陆),如果能执行本对象的自定义操作,说明用户已经登陆成功。<br> * 取到用户登陆时输入的密码,和登陆时候生成的OperatorDTO对象,再通过OperatorDTO对象里的otherAppUserId取到用户对应的OA组用户,<br> * 比较两者密码,如果相等则不做处理;否则,请求UMS中重新设置密码的servlet来重新处理密码同步问题。 * */ public class OAPasswordCustomizer implements ILoginCustomizer { protected Logger log = Logger.getLogger(this.getClass()); private AppServer appServer; private ILoginService loginService; public OAPasswordCustomizer() { appServer = Context.getApplicationContext().getAppServer("UMS"); loginService = (ILoginService) Global.getContext().getBean("LoginService"); } public void execute() { try{ String password = Context.getRequestContext().getValueFromHeaderOrParameter(SSOConstants.USER_PASSWORD); if(password == null) return; //1、以下方式取主用户的对应用户方法是不对的,主用户组的用户可能对应多个应用的用户,所以用otherAppUserId取是错误的 // IOperator operator = Context.getIdentityCard().getOperator(); // Long oaUserId = Long.valueOf((String) operator.getAttribute("otherAppUserId")); // IPasswordOperator oaUser = loginService.getOperatorDTOByID(oaUserId); //2、正确的做法应该如下: Long operatorId = Environment.getOperatorId(); IPWDOperator oaUser = loginService.translateUser(operatorId, "OA"); if (oaUser.getPassword().equals(password)) return; HttpClient httpClient = new HttpClient(); //构造HttpClient的实例 PostMethod postMethod = new PostMethod(appServer.getBaseURL() + "/resetPassword.in"); // 填入各个表单域的值 NameValuePair[] params = { new NameValuePair("userId", operatorId.toString()), new NameValuePair("password", password), new NameValuePair("newPassword", password) }; // 将表单的值放入postMethod中 postMethod.setRequestBody(params); // 执行postMethod try { int statusCode = httpClient.executeMethod(postMethod); if(statusCode == HttpStatus.SC_OK){ // 读取内容 byte[] responseBody = postMethod.getResponseBody(); log.info(new String(responseBody)); } } catch (HttpException e) { log.error("执行请求修改密码的Servlet时,登陆servlet的连接地址可能有误!", e); } catch (IOException e) { log.error("执行请求修改密码的Servlet时,出现IO异常!", e); }finally{ postMethod.releaseConnection(); } } catch (Exception e) { log.error("PMS中执行OAPasswordCustomizer自定义操作时候失败!", e); } } }