📄 loginservlet.java
字号:
/** * Copyright � 2001 The JA-SIG Collaborative. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Redistributions of any form whatsoever must retain the following * acknowledgment: * "This product includes software developed by the JA-SIG Collaborative * (http://www.jasig.org/)." * * THIS SOFTWARE IS PROVIDED BY THE JA-SIG COLLABORATIVE "AS IS" AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JA-SIG COLLABORATIVE OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * */package org.jasig.portal;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.Enumeration;import java.util.HashMap;import java.util.Iterator;import java.util.Properties;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.jasig.portal.security.IPerson;import org.jasig.portal.security.PersonManagerFactory;import org.jasig.portal.services.Authentication;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.jasig.portal.utils.ResourceLoader;import org.jasig.portal.utils.CommonUtils;/** * Receives the username and password and tries to authenticate the user. * The form presented by org.jasig.portal.channels.CLogin is typically used * to generate the post to this servlet. * @author Bernie Durfee (bdurfee@interactivebusiness.com) * @version $Revision: 1.9.2.2 $ * @author Don Fracapane (df7@columbia.edu) * Added properties in the security properties file that hold the tokens used to * represent the principal and credential for each security context. */public class LoginServlet extends HttpServlet { private static final Log log = LogFactory.getLog(LoginServlet.class); private static final String redirectString; private static HashMap credentialTokens; private static HashMap principalTokens; private Authentication m_authenticationService = null; static { String upFile=UPFileSpec.RENDER_URL_ELEMENT+UPFileSpec.PORTAL_URL_SEPARATOR+UserInstance.USER_LAYOUT_ROOT_NODE+UPFileSpec.PORTAL_URL_SEPARATOR+UPFileSpec.PORTAL_URL_SUFFIX; HashMap cHash = new HashMap(1); HashMap pHash = new HashMap(1); try { upFile = UPFileSpec.buildUPFile(null,UPFileSpec.RENDER_METHOD,UserInstance.USER_LAYOUT_ROOT_NODE,null,null); String key; // We retrieve the tokens representing the credential and principal // parameters from the security properties file. Properties props = ResourceLoader.getResourceAsProperties(LoginServlet.class, "/properties/security.properties"); Enumeration propNames = props.propertyNames(); while (propNames.hasMoreElements()) { String propName = (String)propNames.nextElement(); String propValue = props.getProperty(propName); if (propName.startsWith("credentialToken.")) { key = propName.substring(16); cHash.put(key, propValue); } if (propName.startsWith("principalToken.")) { key = propName.substring(15); pHash.put(key, propValue); } } } catch(PortalException pe) { log.error("LoginServlet::static ", pe); } catch(IOException ioe) { log.error("LoginServlet::static ", ioe); } redirectString=upFile; credentialTokens=cHash; principalTokens=pHash; } /** * Initializes the servlet * @exception ServletException */ public void init () throws ServletException { m_authenticationService = new Authentication(); } /** * Process the incoming HttpServletRequest * @param request * @param response * @exception ServletException * @exception IOException */ public void service (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { CommonUtils.setNoCache(response); // Call to setCharacterEncoding method should be done before any call to req.getParameter() method. try { request.setCharacterEncoding("UTF-8"); } catch (UnsupportedEncodingException uee) { log.error("Unable to set UTF-8 character encoding!", uee); } /* Grab the target functional name, if any, off the login request. * Also any arguments for the target * We will pass them along after authentication. */ String targetFname = request.getParameter("uP_fname"); String targetArgs = request.getParameter("uP_args"); // Clear out the existing session for the user if they have one final HttpSession s = request.getSession(false); if (s != null) { s.invalidate(); } // Create the user's session request.getSession(true); IPerson person = null; try { // Get the person object associated with the request person = PersonManagerFactory.getPersonManagerInstance().getPerson(request); // WE grab all of the principals and credentials from the request and load // them into their respective HashMaps. HashMap principals = getPropertyFromRequest (principalTokens, request); HashMap credentials = getPropertyFromRequest (credentialTokens, request); // Attempt to authenticate using the incoming request m_authenticationService.authenticate(principals, credentials, person); } catch (Exception e) { // Log the exception log.error("Exception authenticating the request", e); // Reset everything request.getSession(false).invalidate(); // Add the authentication failure request.getSession(true).setAttribute("up_authenticationError", "true"); person = null; } // Check to see if the person has been authenticated if (person != null && person.getSecurityContext().isAuthenticated()) { // Send the now authenticated user back to the PortalSessionManager servlet String redirectTarget = null; if (targetFname == null){ redirectTarget = request.getContextPath() + "/" + redirectString; } else { redirectTarget = request.getContextPath() + "/" + "tag.idempotent." + redirectString + "?uP_fname=" + targetFname; if (targetArgs != null) { redirectTarget = redirectTarget + "&uP_args=" + targetArgs; } } response.sendRedirect(redirectTarget); } else { if ( request.getMethod().equals("POST") ) request.getSession(false).setAttribute("up_authenticationAttempted", "true"); // Preserve the attempted username so it can be redisplayed to the user by CLogin String attemptedUserName = request.getParameter("userName"); if (attemptedUserName != null) request.getSession(false).setAttribute("up_attemptedUserName", request.getParameter("userName")); // Send the unauthenticated user back to the PortalSessionManager servlet response.sendRedirect(request.getContextPath() + '/' + redirectString); } } /** * Get the values represented by each token from the request and load them into a * HashMap that is returned. * @param tokens * @param request * @return HashMap of properties */ private HashMap getPropertyFromRequest (HashMap tokens, HttpServletRequest request) { // Iterate through all of the other property keys looking for the first property // named like propname that has a value in the request HashMap retHash = new HashMap(1); Iterator tokenItr = tokens.keySet().iterator(); while (tokenItr.hasNext()) { String ctxName = (String)tokenItr.next(); String parmName = (String)tokens.get(ctxName); String parmValue = request.getParameter(parmName); // null value causes exception in context.authentication // alternately we could just not set parm if value is null parmValue = (parmValue == null ? "" : parmValue).trim(); // The relationship between the way the properties are stored and the way // the subcontexts are named has to be closely looked at to make this work. // The keys are either "root" or the subcontext name that follows "root.". As // as example, the contexts ["root", "root.simple", "root.cas"] are represented // as ["root", "simple", "cas"]. String key = (ctxName.startsWith("root.") ? ctxName.substring(5) : ctxName); retHash.put(key, parmValue); } return (retHash); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -