/* * Copyright 2002-2006 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.openuap.cms.user.action.login; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.openuap.base.util.ControllerHelper; import org.openuap.base.util.DateUtil; import org.openuap.cms.CmsPlugin; import org.openuap.cms.user.action.UserBaseAction; import org.openuap.cms.user.config.UserConfig; import org.openuap.cms.user.manager.IUserManager; import org.openuap.cms.workbench.ui.Workbench; import org.openuap.passport.sso.UnauthorizedException; import org.openuap.plugin.Plugin; import org.openuap.runtime.plugin.WebPluginManagerUtils; import org.openuap.runtime.util.StringUtil; import org.springframework.util.StringUtils; import org.springframework.web.servlet.ModelAndView; /** * <p> * 前台登录控制器. * </p> * <p> * $Id: LoginAction.java 3992 2011-01-05 06:34:18Z orangeforjava $ * </p> * * @author Joseph * @version 1.0 */ public class LoginAction extends UserBaseAction { private String loginViewName = "/plugin/cms/base/screens/user/login_new.html"; private IUserManager userManager; /** * */ public LoginAction() { } public ModelAndView perform(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper, Map model) throws Exception { Workbench workbench = getWorkbench(); model.put("workbench", workbench); // 登录成功后返回地址 String done = helper.getString("done", ""); if (!done.equals("")) { done = java.net.URLDecoder.decode(done, "UTF-8"); } // 判断是否已经登录 if (isLogin()) { helper.sendRedirect(done == null ? helper.getBaseURL() : (helper .getBaseURL() + "" + done)); } UserConfig userConfig = UserConfig.getInstance(); model.put("userConfig", userConfig); // 是否是管理员登录 String force = helper.getString("force", "0"); if (userConfig.isEnablePassport() && !force.equals("1")) { // 通行证登录 String domain = userConfig.getPassportDomain(); this.getAuthService().logout(request, response, domain); // String loginUrl = userConfig.getLoginUrl(); String fullURI = request.getRequestURI(); String baseUrl = helper.getBaseURL(); String fullURL = baseUrl.substring(0, baseUrl.length()) + fullURI; // String redirectUrl = null; // if (!loginUrl.trim().equals("") && !loginUrl.equalsIgnoreCase(fullURL)) { if (StringUtils.hasText(done)) { if (done.toLowerCase().startsWith("http://") || done.toLowerCase().startsWith("https://")) { redirectUrl = loginUrl + java.net.URLEncoder.encode(done, "UTF-8"); } else { redirectUrl = loginUrl + "" + java.net.URLEncoder.encode(baseUrl + done, "UTF-8"); } } else { redirectUrl = loginUrl + java.net.URLEncoder.encode(helper.getBaseURL(), "UTF-8"); } // helper.sendRedirect(redirectUrl); } } if (userConfig.isEnableSecureCode()) { String code = StringUtil.randomInt(4) + ""; String key = StringUtil.encrypt(code); helper.getCookies().addTemporaryData("code", code) .addTemporaryData("time", DateUtil.currentTimeSeconds() + "") .setTemporaryCookie(); model.put("key", key); } // if (!done.equals("")) { done = java.net.URLEncoder.encode(done, "UTF-8"); } model.put("done", done); return new ModelAndView(loginViewName, model); } /** * 执行登录 * * @param request * @param response * @param helper * @param model * @return * @throws Exception */ public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper, Map model) throws Exception { String username = helper.getString("username", "").trim(); String encodedUserName = StringUtil.encodeURL(username, "UTF-8"); String password = helper.getString("password"); int autoLoginAge = helper.getInt("age", -2); UserConfig userConfig = UserConfig.getInstance(); String passportDomain = userConfig.getPassportDomain(); if (userConfig.isEnableSecureCode()) { // try { String code = helper.getString("code", ""); String validCode = helper.getCookies().getTemporaryData("code"); int time = Integer.parseInt(helper.getCookies() .getTemporaryData("time")); if (!code.equals(validCode)) { return errorPage(request, response, helper, "invalid_secure_code", model); } else if (time < DateUtil.currentTimeSeconds() - userConfig.getSecureLoginDuration()) { return errorPage(request, response, helper, "secure_code_expired", model); } } catch (Exception ex) { return errorPage(request, response, helper, "secure_code_expired", model); } } // if (username.length() < 1) { return errorPage(request, response, helper, "username_empty", model); } try { getAuthService().createAuthToken(username, password); if (userConfig.isEnablePassport()) { // 若启用通行证则按照通行证域保存 this.getAuthService() .login(request, response, username, encodedUserName, password, passportDomain, autoLoginAge); } else { this.getAuthService().login(request, response, username, encodedUserName, password, null, autoLoginAge); } helper.getCookies().removeTemporaryData("code") .removeTemporaryData("time").setTemporaryCookie(); String done = helper.getString("done"); if (done != null) { done = java.net.URLDecoder.decode(done, "utf-8"); while (done.charAt(0) == '/') { done = done.substring(1); } done = helper.getBaseURL() + done; } else { done = helper.getBaseURL(); } done = java.net.URLDecoder.decode(done, "utf-8"); // System.out.println("dologin done="+done); helper.sendRedirect(done); return null; } catch (UnauthorizedException e) { return errorPage(request, response, helper, e.getMessage(), model); } } /** * 校验安全码 * * @param request * @param response * @param helper * @param model * @return * @throws IOException * @throws ServletException */ public ModelAndView doCheckSecurityCode(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper, Map model) throws IOException, ServletException { boolean success = false; String code = helper.getString("code", ""); String validCode = helper.getCookies().getTemporaryData("code"); int time = Integer.parseInt(helper.getCookies() .getTemporaryData("time")); if (!code.equals(validCode)) { success = false; } else { success = true; } PrintWriter writer = response.getWriter(); if (success) { writer.print("1"); } else { writer.print("0"); } writer.flush(); writer.close(); return null; } /** * 重写错误页面 */ public ModelAndView errorPage(HttpServletRequest request, HttpServletResponse response, ControllerHelper helper, String code, Map model) { try { // String errorMsg=this.getLang(model).get(code,code); // System.out.println("error code="+code); model.put("errorMsg", code); return perform(request, response, helper, model); } catch (Exception e) { e.printStackTrace(); return super.errorPage(request, response, helper, code, model); } } public void setLoginViewName(String loginViewName) { this.loginViewName = loginViewName; } public void setUserManager(IUserManager userManager) { this.userManager = userManager; } public String getLoginViewName() { return loginViewName; } private Workbench getWorkbench() { Plugin plugin = WebPluginManagerUtils.getPlugin(this .getServletContext(), CmsPlugin.PLUGIN_ID); if (plugin != null && plugin instanceof CmsPlugin) { CmsPlugin wPlugin = (CmsPlugin) plugin; Workbench workbench = wPlugin.getWorkbench(); return workbench; } return null; } }