|
What this is
Other links
The source code
/*
* Copyright 1999-2004 The Apache Sofware Foundation.
*
* 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.apache.tomcat.modules.aaa;
import org.apache.tomcat.core.BaseInterceptor;
import org.apache.tomcat.core.Context;
import org.apache.tomcat.core.ContextManager;
import org.apache.tomcat.core.Request;
import org.apache.tomcat.core.Response;
import org.apache.tomcat.core.ServerSession;
import org.apache.tomcat.core.TomcatException;
import org.apache.tomcat.util.buf.Base64;
/**
* Extract user/password credentials from a request.
* This module is specialized in detecting BASIC and FORM authentication, and
* will set 2 notes in the request: "credentials.user" and
* "credentials.password".
*
* A "Realm" module may use the 2 notes in authenticating the user.
*
* This module must will act on the "authenticate" callback - the action
* will happen _only_ for requests requiring authentication, not for
* every request.
*
* It must be configured before the Realm module.
*/
public class CredentialsInterceptor extends BaseInterceptor
{
int userNote;
int passwordNote;
/** The module will set a note with this name on the request for
the extracted user, if Basic or Form authentication is used
*/
public static final String USER_NOTE="credentials.user";
/** The module will set a note with this name on the request for
the extracted password, if Basic or Form authentication is used
*/
public static final String PASSWORD_NOTE="credentials.password";
public CredentialsInterceptor() {
}
public void engineInit( ContextManager cm )
throws TomcatException
{
userNote=cm.getNoteId( ContextManager.REQUEST_NOTE, USER_NOTE);
passwordNote=cm.getNoteId( ContextManager.REQUEST_NOTE, PASSWORD_NOTE);
}
/** Extract the credentails from req
*/
public int authenticate( Request req , Response res ) {
Context ctx=req.getContext();
String login_type=ctx.getAuthMethod();
if( "BASIC".equals( login_type )) {
basicCredentials( req );
}
if( "FORM".equals( login_type )) {
formCredentials( req );
}
return DECLINED;
}
/** Extract userName and password from a request using basic
* authentication.
*/
private void basicCredentials( Request req )
{
String authorization = req.getHeader("Authorization");
if (authorization == null )
return; // no credentials
if( ! authorization.startsWith("Basic ")) {
log( "Wrong syntax for basic authentication " + req + " " +
authorization);
return; // wrong syntax
}
authorization = authorization.substring(6).trim();
String unencoded=Base64.base64Decode( authorization );
int colon = unencoded.indexOf(':');
if (colon < 0) {
log( "Wrong syntax for basic authentication " + req + " " +
authorization);
return;
}
req.setNote( userNote, unencoded.substring(0, colon));
req.setNote( passwordNote , unencoded.substring(colon + 1));
}
private void formCredentials( Request req ) {
ServerSession session=(ServerSession)req.getSession( false );
if( session == null )
return; // not authenticated
// XXX The attributes are set on the first access.
// It is possible for a servlet to set the attributes and
// bypass the security checking - but that's ok, since
// everything happens inside a web application and all servlets
// are in the same domain.
String username=(String)session.getAttribute("j_username");
String password=(String)session.getAttribute("j_password");
if( username!=null && password!=null) {
req.setNote( userNote , username );
req.setNote( passwordNote, password);
}
}
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.