Anexo A : Código Fonte da Implementação da Base de
Segurança
Pacote : secruritylmpl
Classe : BasicSecuritylmpl.java
Objetivo : Implementar a interface da base de segurança Implementaçao :
Declarar duas tabelas Hash uma contendo os dados do usuário e a outra para a lista de controle de acesso.
Ler um arquivo texto contendo as informações de segurança e preencher as duas tabelas Hash com as informações lidas. authenticate():procurar o password do userID na tabela Hash de usuários
se encontrar então criar o Ticket e retornar o Ticket para o cliente.
criar o Ticket criptografando o userID
e r e t o m a r userID na forma de uma sequência bytes cifrados. decriptografa o Ticket transformando o byte em string
usar tabela Hash de controle de acesso para obter os objetos que UserID pode ter acesso. Se o nome do objeto invocado pelo userID estiver dentro da lista desses objetos a invocação é autorizada. ***************************************************************************** */ package securitylmpl; import j a v a .u t i l .*; import j a v a .i o .*; import o r g .o m g .CORBA.*; import segurança.*;
public class BasicSecuritylmpl extends _sk_BasicSecurity {
private Hashtable userTable;
private Hashtable accessControlList; private String star;
BasicSecuritylmpl ( String nane, String fileName ) { s u p e r ( name );
// criar a tabela hash de usuários userTable = new Hashtable( 50 ) ;
// criar a tabela hash da lista de controle de acesso accessControlList = new Hashtable ( 100 ) ;
star = new St r i n g ("*"); try {
RandomAccessFile file;
String line;
String user, passwd, acDesc;
int userlndex, passwdlndex, acDescIndex;
file = new RandomAccessFile ( fileName, "r" );
encrypt()
decr y p t () authorize()
Anexos
w h i l e ( ( line = fil e .readLine() ) != null ) { userlndex = line.indexOf(' : ' , 0);
i f ( userlndex > -1 ) {
user = line.substring( 0, userlndex );
passwdlndex = line.i n d e x O f , userlndex+l); i f ( passwdlndex > -1 ) {
passwd = line.substring( userlndex+l, passwdlndex ); userTable.p u t ( user, passwd );
acDesc = line.substring( passwdlndex+l ); i f ( acDesc !=null ) {
accessControlList.p u t ( u s e r , acDesc );
>
else {
System.err.printin( "usuário" + user + " não tem acesso" );
} }
else {
System.err.println( "usuário " + user +
" não tem senha - erro no formato do arquivo?" );
> >
else {
System.err.printin( "linha " +• line +
" não tem usuário - erro no formato do arquivo?" );
} } >
catch ( IOException ioex ) {
System.err.println( "arquivo " + filename + " não encontrado" ); System.e x i t ( 1 );
} }
// metodo para criptografar o userID
public byte[] encrypt( String userid ) { return userid.getBytes() ;
}
// metodo para decriptografar o ticket
public String decrypt( byte[] ticket ) { return new String( ticket ) ;
}
// metodo para autenticar userID en Ticket
public byte[] authenticate( String userid, String password ) throws NatAuthenticated {
i f ( userTable.containsKey( userid ) &&
userTable.g e t ( userid ).equals( password ) ) { // create a simple ticket
return encrypt( userid );
}
else {
Anexos
> }
/ / método para autorizar o userlD a invocar a operacao
public void authorize( byte[] ticket, org.omg.CORBA.Object object, String operationName )
throws NotAuthorized {
String userid = decrypt( ticket ) ;
System.err.printin( "Tentou uma Autorizacao: " + userid ); String objectld = object._object_name() ;
i f ( objectld — null ) {
System.err.printin( "Tentou a tima Autorizacao: non-name object" ) ; r eturn;
>
if ( accessControlList.containsKey( userid )) { String allowedObjects =
(String) accessControlList.get( userid ) ;
i f ( allowedObjects.regionMatches( 0, "*", 0, 1 ) ) { return;
}
i f ( allowedObjects.
regionMatches( 0, objectld, 0, objectld.length() ) ) { return;
} }
throw new NotAuthorized () ;
> >
Anexos
Anexo B : Código Fonte da Implementação do Servidor
Pacote : securitylmpl Classe : server.java
Objetivo : Inicializar a OKB e Criar o objeto da Base de Segurança BasicSecuritylmpl e aguardar
solicitações
*/
package securityImpl; import o r g .o m g .CORBA. * ; public class Server {
public static void main(String[] args) { i f ( a r g s .length != 2 ) {
System.o u t .println(
"Eh necessário digitar dois argumentos " + "<name>, <Arquivo da lista de controle"); System.e x i t ( 1 );
try {
//init ORB
ORB orb = ORB.init( args, null ); BOA boa = o r b .BOA_init();
// cria o objeto BasicSecurity que o objeto da base // de segurança
BasicSecuritylmpl basicSecuritylmpl =
new BasicSecuritylmpl( args[0], args[l] ); // Exporta a referencia do objeto
b o a .obj_is_ready( basicSecuritylmpl );
// inprime a referencia na forma de um string
//System.out.println( orb.object_to_string( basicSecuritylmpl ) ); // aguarda requisições b o a . impl_is_ready () ; } catch(SystemException e) { System.err.println(e); } } // Fim * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Anexos
Anexo C : Código Fonte da Implementação do Interceptador
no Lado do Servidor
/*
*
Pacote: securityInterceptor
Cl a s s e : SecurityServerInterceptor.j ava
Objetivo: Interceptar o IIOP reguest e extrair os dados contidos nele Implementação:
Obter a referencia do objecto base de segurança através do método b i n d ()
com o método receive_request obter a partir do IIOP request os dados necessários para o serviço de autorização. (principal, operação invocada, referência do objeto destino)
0 principal e o nome dá operação invocada são obtidos a partir do requestHeader e a referência do objeto destino a partir do
holderObjet
+** + */
package securityInterceptor;
import c o m .visigenic.vbro k e r .interceptor.*; import c o m .visigenic.vbroker.IO P .*; import c o m .visigenic.vbroker.GIO P .*; import o r g .o m g .C O R B A .*; import o r g .o m g .CORBA..portable.*; import security.*; //import j a v a .u t i l .* ; //import java.io.*;
public class SecurityServerlnterceptor implements Serverlnterceptor { private BasicSecurity basicSecurity;
private String literal;
public SecurityServerlnterceptor() { // inicializar a ORB
ORB orb = O R B . i n i t O ; try {
// obter a referncia do objeto base de segurança basicSecurity = BasicSecurityHelper.bind( orb );
>
catch(Exception e) { System.e r r .println(
" r e f e r e n d a da base de segurança nao obtida") ; System.e r r .prin t l n (
"Abortando a execucao ... "); System.exit(-l);
} >
// métodos invocados para localizar um objeto public IOR locate(int req_id,
b y t e [] obj ect_key, Closure closure) { return n u l l ;
Anexos
public void locate_succeeded(int req_id, Closure closure) {}
public void locate_forwarded(int req_id, IORHolder forward_ior,
Closure closure) {}
public IOR locate_failed(int req_id, byte[] object_key,
Closure closure) { return null;
}
// obter a patir do IX0P request o principal, objeto de destino e a operacao // invocada
public InputStream receive_request(RequestHeader hdr, org.omg.CORBA.ObjectHolder target, InputStream buf, Closure closure)
{ try { basicSecurity.authorize( h d r .requesting_principal, target.v a l u e , h d r .operation ); return null; } catch ( NotAuthorized na ) {
/* ***Pode-se criar um arquivo log dos dados do principais nao autorizados tentando acessar o objeto servidor ★★★**+*★★★★**
*/
//literal = String( h d r .requesting_principal ); System.err.println(" Nao autorizado");
throw new NO_PERMISSION() ;
} } /* #
Métodos invocados durante um IIOP response prepare_reply : disparado quando uma resposta é preparada send_reply : disparada quando uma resposta é enviada send_reply_failed : disparada quando a resposta é enviada
sem sucesso
send_reply_request: disparada quando a resposta é enviada com sucesso
*/
public void prepare_reply(RequestHeader hdr, ReplyHeaderHolder reply, org.omg.CORBA.Object target, Closure closure)
{ }
Anexos
ReplyHeader h d r ,
or g .o m g .C O R B A .Obj ect target, OutputStream b u f , org.omg.CORBA.Environment env, Closure closure) { return null; }
public void send_reply_failed(RequestHeader reqHdr, ReplyHeader replyHdr,
o r g .o m g .C O R B A .Obj ect target, o r g .o m g .C O R B A .Environment env, Closure closure) {}
public void request_completed(RequestHeader reqHdr, or g .o m g .C O R B A .Object
target, Closure closure) {) // invocado quando a conexão e terminada public void shutdown(
c o m .visigenic.vbroker.interceptor.ServerInterceptorPackage.ShutdownReason reason) {}
// invocado quando ocorre uma falha na conexão
public void exception_occurred(RequestHeader reqHdr, org.omg.CORBA.Environment env,
Closure closure) (}
Anexos
Anexo D : Códigos fonte da Implementação que cria a Fábrica de
Interceptadores
/**************************************•************************************
Pacote: securitylnterceptor
Nome : SecurityServerlnterceptorFactory. java
Objetivo: criar uma instancia do Serverlnterceptor quando ela nao existe
package securitylnterceptor;
import c o m .visigenic.vbroker.interceptor.* ; public class SecurityServerlnterceptorFactory
implements ServerlnterceptorFactory {
private SecurityServerInterceptor _server = null; // cria nma nova intancia do Securitylnterceptor public Serverlnterceptor create(
c o m . visigenic.vbroker.IO P .TaggedProfile profile) { if (_server = null)
{
_server = new SecurityServerInterceptor() ;
}
return _server;
} >