Idea of authentication
public interface IAuthentication
{
public boolean verifyPassword(final String userid, final String passwd )
throws AuthorizationException;
public boolean isAccessAllowed(final String userid, final String resource )
throws AuthorizationException;
}
Resource is not always a good idea.
Refactor authentication
public interface IAuthentication1 extends IAuthentication
{
public boolean isAccessAllowed(final String userid
, HttpServletRequest request
,HttpServletResponse response)
throws AuthorizationException;
}
See how the resource is replaced with request and response.
Userid is not available for public urls
public interface IAuthentication2 extends IAuthentication1
{
public boolean isAPublicURL(HttpServletRequest request
,HttpServletResponse response)
throws AuthorizationException;
}
Each interface gets increasingly capable and sophisticated.
A dummy implementation
public class DefaultAuthentication implements IAuthentication1,ICreator
{
public Object executeRequest(String requestName, Object args)
throws RequestExecutionException
{
return this;
}
public DefaultAuthentication()
{
}
public boolean verifyPassword(String userid, final String passwd )
throws AuthorizationException
{
return true;
}
public boolean isAccessAllowed(String userid, final String resource )
throws AuthorizationException
{
return true;
}
public boolean isAccessAllowed(final String userid
, HttpServletRequest request
,HttpServletResponse response)
throws AuthorizationException
{
return true;
}
}
A trivial implemenation
public class TrivialAccess implements DefaultAuthentication
{
pricate String cachePassword = null;
//Read the static password from a file
public void initialize(String requestName)
{
cachePassword = Config.getValue(requestName + ".password");
}
public boolean verifyPassword(String userid, String passwd )
throws AuthorizationException
{
return (password.equals(passwd, cachePassword));
}
}
A bit sophisticated public access authentication
public class PublicAccessAuthentication
extends DefaultAuthentication
implements IAuthentication2, IInitializable
{
private String m_publicURLs = null;
private String m_publicRequestNames = null;
private Map m_publicURLMap;
private Map m_publicRNMap;
public PublicAccessAuthentication()
{
}
public void initialize(String requestName)
{
m_publicURLs =
AppObjects.getValue(requestName + ".publicURLs","");
m_publicRequestNames =
AppObjects.getValue(requestName + ".publicRequestNames","");
m_publicURLMap =
Tokenizer.tokenizeAsAHashtable(m_publicURLs.toLowerCase(),",");
m_publicRNMap =
Tokenizer.tokenizeAsAHashtable(
m_publicRequestNames.toLowerCase(),",");
AppObjects.log("Info: Public URLs:" + m_publicURLs);
}
public boolean isAPublicURL(HttpServletRequest request
,HttpServletResponse response)
throws AuthorizationException
{
/*
*
* By default things are private
*/
String aspireURL= request.getParameter("url");
AppObjects.log("Info: aspireURL: " + aspireURL);
String aspireRequestName = request.getParameter("request_name");
if (aspireURL != null)
{
if (m_publicURLMap.get(aspireURL.toLowerCase()) != null)
{
return true;
}
}
if (aspireRequestName != null)
{
if (m_publicRNMap.get(aspireRequestName.toLowerCase()) != null)
{
return true;
}
}
return false;
}
}
Using a database for authentication
public class SimpleDBAuthentication1
extends PublicAccessAuthentication
{
public SimpleDBAuthentication1()
{
}
public boolean verifyPassword(String userid, String passwd )
throws AuthorizationException
{
try
{
Hashtable args = new Hashtable();
args.put("userid",userid);
args.put("password",passwd);
Object reply =
AppObjects
.getIFactory()
.getObject(AspireConstants.AUTHENTICATE_USER,args);
return FilterUtils.convertToBoolean(reply);
}
catch(com.ai.application.interfaces.RequestExecutionException x)
{
throw new AuthorizationException(
AuthorizationException.CANNOT_ACCESS_AUTHORIZATION_SERVERS,x);
}
catch(com.ai.common.UnexpectedTypeException x)
{
throw new AuthorizationException(
"auth: Authorization service returned a wrong object" ,x);
}
}
}
Specification
<request name="IAuthentication">
<classname>SimpleDBAuthentication1</classname>
<databaseRequest>AuthenticationDBRequest<databaseRequest>
</request>
<request name="AuthenticationDBRequest">
<classname>com.ai.db.DBRequestExecutor2</classname>
<db>my-database</db>
<stmt>
select 'true' as result
from users
where user_id = '{userid}'
and password = '{password}'
</stmt>
</request>
Revisiting Trivial Authentication
public class TrivialAuthentication
extends PublicAccessAuthentication
implements IAuthentication2, ICreator, IInitializable
{
public boolean verifyPassword(String userid, String passwd )
throws AuthorizationException
{
String password =
AppObjects.getIConfig().getValue(AspireConstants.PASSWORD,null);
if (password == null) {return true;}
// password has been mentioned
return passwd.equals(password);
}
}
References
1. General Introduction to other Server side Patterns in this series