/*
* 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.admin;
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.core.action.CMSBaseAction;
import org.openuap.cms.user.config.UserConfig;
import org.openuap.cms.user.security.IUserSession;
import org.openuap.cms.user.security.SecurityUtil;
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.web.servlet.ModelAndView;
/**
* <p>
* 后台登录控制器
* </p>
*
* <p>
* $Id: LoginAction.java 4026 2011-03-22 14:58:42Z orangeforjava $
* </p>
*
*
* @author Joseph
* @version 1.0
*/
public class LoginAction extends CMSBaseAction {
private String loginViewName = "/plugin/cms/base/screens/login_new.html";
/**
* 检查是否进行了前端登录,若没有前端登录,则跳转到前端登录部分
*/
public ModelAndView beforePerform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = super.beforePerform(request, response, helper, model);
if (mv != null) {
return mv;
}
if (SecurityUtil.isAnonymous()) {
// 如果是匿名则转向前端登录
String done = helper.getString("done", helper.getBaseURL());
// System.out.println("done cms="+done);
String loginUrl = SecurityUtil.getAuthService().getLoginUrl();
helper.sendRedirect(helper.getBaseURL() + loginUrl + "?done="
+ done);
}
return null;
}
/**
* 显示后台登录界面
*/
public ModelAndView perform(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model)
throws Exception {
ModelAndView mv = new ModelAndView(loginViewName);
// 登录成功后返回地址
Workbench workbench = getWorkbench();
model.put("workbench", workbench);
String done = helper.getString("done", "");
if (done != null) {
done = helper.decodeURL(done);
}
//
IUserSession userSession = this.getUserSession();
model.put("userSession", userSession);
model.put("done",done);
//
String code = StringUtil.randomInt(4) + "";
String key = StringUtil.encrypt(code);
helper.getCookies().addTemporaryData("code", code).addTemporaryData(
"time", DateUtil.currentTimeSeconds() + "")
.setTemporaryCookie();
model.put("key", key);
return mv;
}
/**
* 执行登录
*
* @param request
* @param response
* @param helper
* @param model
* @return
*/
public ModelAndView doLogin(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, Map model) {
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();
// 后台强制校验码
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 {
SecurityUtil.getAuthService().createAdminAuthToken(username,
password);
if (userConfig.isEnablePassport()) {
SecurityUtil.getAuthService().loginAdmin(request, response,
username, encodedUserName, password, passportDomain,
autoLoginAge);
} else {
SecurityUtil.getAuthService()
.loginAdmin(request, response, username,
encodedUserName, password, null, autoLoginAge);
}
helper.getCookies().removeTemporaryData("code")
.removeTemporaryData("time").setTemporaryCookie();
String done = helper.getString("done", helper.getBaseURL());
helper.sendRedirect(done);
return null;
} catch (UnauthorizedException e) {
return errorPage(request, response, helper, e.getMessage(), model);
}
}
/**
* 重写错误页面
*/
public ModelAndView errorPage(HttpServletRequest request,
HttpServletResponse response, ControllerHelper helper, String code,
Map model) {
try {
// String errorMsg=this.getLang(model).get(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);
}
}
/**
* 检查安全验证码
*
* @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");
UserConfig userConfig = UserConfig.getInstance();
int time = Integer.parseInt(helper.getCookies()
.getTemporaryData("time"));
if (!code.equals(validCode)) {
success = false;
} else if (time < DateUtil.currentTimeSeconds()
- userConfig.getSecureLoginDuration()) {
success = false;
} else {
success = true;
}
PrintWriter writer = response.getWriter();
if (success) {
writer.print("1");
} else {
writer.print("0");
}
writer.flush();
writer.close();
return null;
}
/**
* 获得Workbench对象
* @return
*/
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;
}
public void setLoginViewName(String loginViewName) {
this.loginViewName = loginViewName;
}
}