%@page import="com.amarsoft.are.util.SpecialTools"%>
<%@page contentType="text/html; charset=GBK" session="false"%>
<%@page import="com.amarsoft.are.util.StringFunction"%>
<%@page import="com.amarsoft.awe.Configure"%>
<%@page import="com.amarsoft.awe.RuntimeContext"%>
<%@page import="com.amarsoft.awe.control.SessionListener"%>
<%@page import="com.amarsoft.awe.control.model.ComponentSession"%>
<%@page import="com.amarsoft.awe.security.*"%>
<%@page import="com.amarsoft.awe.security.pwdrule.ALSPWDRules"%><%@
page import="com.amarsoft.awe.security.pwdrule.IsPasswordOverdueRule"%><%@
page import="com.amarsoft.awe.security.pwdrule.PasswordRuleManager"%><%@
page import="com.amarsoft.awe.util.ASResultSet"%><%@
page import="com.amarsoft.awe.util.SqlObject"%><%@
page import="com.amarsoft.awe.util.Transaction"%><%@
page import="com.amarsoft.context.ASPreference"%>
<%@ page import="com.amarsoft.context.ASUser" %>
<%@ page import="com.amarsoft.dict.als.manage.NameManager" %>
<%!
//检验验证码
public boolean vaildCheckCode(HttpServletRequest request, HttpSession session) {
String sCheckCode = request.getParameter("CheckCode");
if (session == null) return true;
String sSaveCheckCode = (String)session.getAttribute("CheckCode");
if (sSaveCheckCode==null || sCheckCode==null) return true;
else if (sCheckCode.equalsIgnoreCase(sSaveCheckCode)) return true;
else return false;
}
public String getUserId(String lognid,Transaction Sqlca) throws Exception{
String userinfo="";
ASResultSet rs = null;
String sql="SELECT userid FROM user_info WHERE loginid=:loginid ";
SqlObject asql = new SqlObject(sql);
asql.setParameter("loginid", lognid);
rs = Sqlca.getASResultSet(asql);
if(rs.next()){
userinfo=rs.getString("userid");
}else{
throw new Exception("用户["+lognid+"]是无效用户");
}
return userinfo;
}
public String getCurUseMainPath(String lognid,Transaction Sqlca) throws Exception{
String userinfo="";
ASResultSet rs = null;
String sql="SELECT fi.itemdescribe mainpath FROM user_info ui LEFT OUTER JOIN ( ";
sql=sql+" SELECT itemno,itemdescribe FROM CODE_LIBRARY WHERE codeno='FirstPage') fi ON ui.mainpath=fi.itemno ";
sql=sql+" WHERE ui.userid=:loginid ";
SqlObject asql = new SqlObject(sql);
asql.setParameter("loginid", lognid);
rs = Sqlca.getASResultSet(asql);
String mainPath="/Main.jsp";
if(rs.next()){
mainPath=rs.getString("mainpath");
if(mainPath==null||mainPath.length()==0){mainPath="/Main.jsp";}
}
return mainPath;
}
//用户登录检查与密码验证性检查
public boolean validUserPassword(HttpServletRequest request, Transaction Sqlca,String sUserID,String sPWD) throws Exception {
String userName = NameManager.getUserName(sUserID);
System.out.println(userName);
System.out.println(userName+":"+sUserID+":"+sPWD);
LogonUser user = new LogonUser(userName, sUserID, sPWD);
SecurityAudit securityAudit = new SecurityAudit(user);
String requestMessage = request.getRemoteAddr() + "," + request.getRemoteAddr() + "," + request.getServerName() + "," + request.getServerPort();//将request请求信息拼接一下,传进去
if(securityAudit.isLogonSuccessful(Sqlca, null, requestMessage)){//目前这步不需要别的登录验证
//登录成功,还需进一步进行密码验证
PasswordRuleManager pwm = new PasswordRuleManager();
IsPasswordOverdueRule isPWDOverdueRule = new IsPasswordOverdueRule(sUserID, SecurityOptionManager.getPWDLimitDays(Sqlca), Sqlca);//该规则只是验证性规则,不是登录成功失败的必要条件
ALSPWDRules alsRules = new ALSPWDRules(SecurityOptionManager.getRules(Sqlca));
pwm.addRule(isPWDOverdueRule);//该规则比ALSPWDRules更重要,先添加进去
pwm.addRule(alsRules);
securityAudit.isValidateSuccessful(Sqlca, pwm);
return true;
}
else return false;
}
%><%
HttpSession session = request.getSession(false);
if (!vaildCheckCode(request,session)) {
%><%
return;
}
if (session!= null) {
com.amarsoft.awe.RuntimeContext CurARCTemp = (com.amarsoft.awe.RuntimeContext) session.getAttribute("CurARC");
String sUserIDCom = request.getParameter("UserID");
if (sUserIDCom == null || sUserIDCom.equals("")) {
String sUserIDSelectedCom = request.getParameter("UserIDSelected");
sUserIDCom = sUserIDSelectedCom;
}
if(sUserIDCom != null && !sUserIDCom.equals("") && CurARCTemp != null && CurARCTemp.getUser()!=null && !sUserIDCom.equals(CurARCTemp.getUser().getUserID())){
%><%
return;
}
java.util.Enumeration attrs = session.getAttributeNames();
while (attrs.hasMoreElements()) {session.removeAttribute(attrs.nextElement());}
if (!session.isNew()) {
session.invalidate();
}
}
Transaction Sqlca = null;
String sUserID = null;
String sPWD = null;
String sScreenWidth = null;
String logonId = null;
try {
//获得传入的参数:用户登录账号、口令、界面风格
sUserID = request.getParameter("UserID");
logonId = sUserID;
sPWD = request.getParameter("Password");
sScreenWidth = request.getParameter("ScreenWidth");
//下拉选框用户快速登陆,系统正式运行后可删除
String sUserIDSelected = "";
if (sUserID == null || sUserID.equals("")) {
sUserIDSelected = request.getParameter("UserIDSelected");
sUserID = sUserIDSelected;
}
Configure CurConfig = Configure.getInstance(application);
CurConfig.setContextPath(request.getContextPath());
Sqlca = Transaction.createTransaction(CurConfig.getConfigure("DataSource"));
sUserID=getUserId(sUserID,Sqlca);//根据登陆ID获得用户的ID
if (!validUserPassword(request, Sqlca, sUserID, sPWD)) throw new Exception("用户["+sUserID+"]登录失败:用户密码检验失败");
Sqlca.commit();
//取当前用户和机构,并将其放入 Session
ASUser CurUser = ASUser.getUser(SpecialTools.real2Amarsoft(sUserID),Sqlca);
//读取上下文单点登陆配置
String singleSignon = pageContext.getServletContext().getInitParameter("singleSignon");
String loginType = request.getParameter("loginType");
if(!"compulsive".equals(loginType) && "true".equals(singleSignon)){
StringBuffer sql = new StringBuffer();
sql.append("select count(1) num from user_list where userid='");
sql.append(sUserID);
sql.append("' and (endtime is null or endtime = '') group by userid");
String num = Sqlca.getString(new SqlObject(sql.toString()));
if(null != num && !"80009U00000001".equals(sUserID) && !"administrator".equals(sUserID)){
throw new Exception("false");
}
}else if("compulsive".equals(loginType)){
StringBuffer updateSql = new StringBuffer();
updateSql.append("update user_list set endtime='");
updateSql.append(StringFunction.getTodayNow().replaceAll(":", "△"));
updateSql.append("' where userid='");
updateSql.append(sUserID);
updateSql.append("'");
SqlObject so = new SqlObject(updateSql.toString());
so.setDebugSql(so.getDebugSql().replaceAll("△", ":"));
so.setOriginalSql(so.getOriginalSql().replaceAll("△", ":"));
so.setRunSql(so.getRunSql().replaceAll("△", ":"));
Sqlca.executeSQL(so);
Sqlca.commit();
}
//设置运行上下文参数 CurARC 在IncludeBegin.jsp中使用
RuntimeContext CurARC = new RuntimeContext();
CurARC.setAttribute("ScreenWidth",sScreenWidth);
CurARC.setUser(CurUser);
CurARC.setPref(new ASPreference(CurUser.getUserID()));
CurARC.setCompSession(new ComponentSession());
session = request.getSession(true);
session.setAttribute("CurARC",CurARC);
//用户登陆成功,记录登陆信息
SessionListener sessionListener=new SessionListener(request,session,CurUser,CurConfig.getConfigure("DataSource"));
session.setAttribute("listener",sessionListener);
%>
<%
} catch (Exception e) {
%>
<%
} finally {
if(Sqlca!=null) {
//断掉当前数据连接
Sqlca.commit();
Sqlca.disConnect();
Sqlca = null;
}
}
%>