abstractlogin.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 244 行
JAVA
244 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * * Free Software Foundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Scott Ferguson */package com.caucho.server.security;import com.caucho.webbeans.component.*;import com.caucho.webbeans.manager.*;import javax.annotation.PostConstruct;import javax.naming.Context;import javax.naming.InitialContext;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.webbeans.*;import java.io.IOException;import java.security.Principal;import java.util.logging.Level;import java.util.logging.Logger;/** * Used to authenticate users in a servlet request. AbstractLogin handles * the different login types like "basic" or "form". Normally, a Login * will delegate the actual authentication to a ServletAuthenticator. * * <p>The Login is primarily responsible for extracting the credentials * from the request (typically username and password) and passing those * to the ServletAuthenticator. * * <p>The Servlet API calls the Login in two contexts: directly from * <code>ServletRequest.getUserPrincipal()</code>, and during * security checking. When called from the Servlet API, the login class * can't change the response. In other words, if an application * calls getUserPrincipal(), the Login class can't return a forbidden * error page. When the servlet engine calls authenticate(), the login class * can return an error page (or forward internally.) * * <p>Normally, Login implementations will defer the actual authentication * to a ServletAuthenticator class. That way, both "basic" and "form" login * can use the same JdbcAuthenticator. Some applications, like SSL * client certificate login, may want to combine the Login and authentication * into one class. * * <p>Login instances are configured through bean introspection. Adding * a public <code>setFoo(String foo)</code> method will be configured with * the following login-config: * * <code><pre> * <login-config> * <class-name>test.CustomLogin</class-name> * <foo>bar</bar> * </login-config> * </pre></code> * * @since Resin 2.0.2 */public abstract class AbstractLogin implements LoginFilter { protected final static Logger log = Logger.getLogger(AbstractLogin.class.getName()); /** * The configured authenticator for the login. Implementing classes will * typically delegate calls to the authenticator after extracting the * username and password. */ protected ServletAuthenticator _auth; /** * Sets the authenticator. */ public void setAuthenticator(ServletAuthenticator auth) { _auth = auth; } /** * Gets the authenticator. */ public ServletAuthenticator getAuthenticator() { if (_auth == null) { try { WebBeansContainer webBeans = WebBeansContainer.create(); ComponentFactory factory = webBeans.resolveByType(ServletAuthenticator.class); if (factory != null) _auth = (ServletAuthenticator) factory.get(); } catch (Exception e) { log.log(Level.FINER, e.toString(), e); } if (_auth == null) _auth = new NullAuthenticator(); if (log.isLoggable(Level.FINE)) log.fine(toString() + " using " + _auth); } return _auth; } /** * Initialize the login. <code>init()</code> will be called after all * the bean parameters have been set. */ @PostConstruct public void init() throws ServletException { } /** * Returns the authentication type. <code>getAuthType</code> is called * by <code>HttpServletRequest.getAuthType</code>. */ public String getAuthType() { return "none"; } /** * Logs a user in. The authenticate method is called during the * security check. If the user does not exist, <code>authenticate</code> * sets the reponse error page and returns null. * * @param request servlet request * @param response servlet response for a failed authentication. * @param application servlet application * * @return the logged in principal on success, null on failure. */ public Principal authenticate(HttpServletRequest request, HttpServletResponse response, ServletContext application) throws ServletException, IOException { // Most login classes will extract the user and password (or some other // credentials) from the request and call auth.login. Principal user = getUserPrincipal(request, response, application); if (user == null) response.sendError(HttpServletResponse.SC_FORBIDDEN); return user; } /** * Returns the Principal associated with the current request. * getUserPrincipal is called in response to the Request.getUserPrincipal * call. Login.getUserPrincipal can't modify the response or return * an error page. * * <p/>authenticate is used for the security checks. * * @param request servlet request * @param application servlet application * * @return the logged in principal on success, null on failure. */ public Principal getUserPrincipal(HttpServletRequest request, HttpServletResponse response, ServletContext application) throws ServletException { return getAuthenticator().getUserPrincipal(request, response, application); } /** * Returns true if the current user plays the named role. * <code>isUserInRole</code> is called in response to the * <code>HttpServletRequest.isUserInRole</code> call. * * @param request servlet request * @param application servlet application * * @return the logged in principal on success, null on failure. */ public boolean isUserInRole(HttpServletRequest request, HttpServletResponse response, ServletContext application, Principal user, String role) throws ServletException { return getAuthenticator().isUserInRole(request, response, application, user, role); } /** * Logs the user out from the given request. * * <p>Since there is no servlet API for logout, this must be called * directly from user code. Resin stores the web-app's login object * in the ServletContext attribute "caucho.login". */ public void logout(HttpServletRequest request, HttpServletResponse response, ServletContext application) throws ServletException { Principal principal = getUserPrincipal(request, response, application); if (principal != null) getAuthenticator().logout(application, null, request.getRequestedSessionId(), principal); } @Override public String toString() { return getClass().getSimpleName() + "[]"; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?