Esfinge Guardian - Framework para Controle de Acesso

Visão geral
Configuração
Como regra geral, é necessária a edição dos arquivos
JAR do Esfinge Guardian com as seguintes dependências

- aopalliance-1.0.jar
- asm-3.3.1.jar
- aspectjrt-1.6.2.jar
- aspectjweaver-1.6.2.jar
- cglib-2.2.2.jar
- commons-logging-1.1.1.jar
- el-api-2.2.jar
- javassist-3.6.0.GA.jar
- jboss-el.jar
- jboss-el-api_2.2_spec-1.0.1.Final.jar
- org.hamcrest.core_1.1.0.v20090501071000.jar
- scannotation-1.0.2.jar
- spring-aop-3.0.5.RELEASE.jar
- spring-asm-3.0.5.RELEASE.jarspring-beans-3.0.5.RELEASE.jar
- spring-context-3.0.5.RELEASE.jar
- spring-core-3.0.5.RELEASE.jar
- spring-expression-3.0.5.RELEASE.jar
Arquitetura
A arquitetura do Esfinge Guardian é descrita por 8
elementos:

AuthorizationContext
GuardianInterceptor
Invoker
Populator
PopulatorProcessor
Authorizer
AuthorizerProcessor
AuthorizationMetadata
Visão estática e dinâmica da Arquitetura do Esfinge Guardian
As entidades de arquitetura apresentadas na seção
anterior podem ser representadas em um diagrama de
classe como na Figura 1, mostrando suas relações e
responsabilidades.


Figura 1. Relacionamento entre os elementos de arquitetura do Esfinge Guardian.

Figura 2. Diagrama de Sequencia da perpectiva de arquitetura do Esfinge Guardian.
Proteção de Métodos
Para exemplificar o uso do framework, considere a classe abaixo que precisa ter seus métodos protegidos:
class BankManager {
public void creditLimitIncreaseRequest(Client c) {
// request credit limit logic
}
}
Utilizando Anotações Pré-definidas
@Role(“Manager”)
public void creditLimitIncreaseRequest(Client c) {
// request credit limit increase logic
}

@Rule(“environment.currentTime >= ‘8:00:00’&& environment.currentTime
Encapsulando Regras em Anotações de Domínio
@ManagersDuringWorkingHours
public void creditLimitIncreaseRequest(Client c) {
// request credit limit increase logic
}
Nesse caso, a anotação de domínio deve ser anotada com as anotações do framework:
// Retention and ElementType annotations suprressed
@Rule(“environment.currentTime >= ‘8:00:00’
&& environment.currentTime
Protegendo objetos com o EsfingeGuardian
BankManager bManager = AuthorizationContext.guard( new BankManager() );

WrappedObj wCTime = AuthorizationContext.wrapAsEnvironmentProp(“currentTime”, new Date()); WrappedObj wManager = AuthorizationContext.wrapAsSubjectProp(“Manager”, new Manager()); WrappedObj wClient = AuthorizationContext.wrapAsResourceProp(“Client”, new Client()); BankManager bManager = AuthorizationContext.guard( new BankManager(), wCTime, wManager, wClient );
Estendendo o Framework
Criando Novas Anotações de Autorização
// Retention and ElementType suppressed
@AuthorizerClass(MyAuthorizerClass.class)
public @interface MyAuthorizationAnnotation {
}
A classe a seguir mostra como seria a implementação da classe de autorização:
public class MyAuthorizerClass implements Authorizer {
public Boolean authorize(AuthorizationContext ctx, MyAuthorizationAnnotation maa) {
//acessar as variáveis do contexto e executar regra de autorização
return true;
}
}
Adicionando Informações de Autorização
public class MyDatabasePopulator implements Populator {
public void populate(AuthorizationContext context){
// extraction logic of the data and put these data into the
// appropriate scope (subject, environment, resource)
// ex: context.getSubject().put(“myDataObjKey”, myDataObj);
}
}
Configurando Populators
package.MyDatabasePopulator package.MyWebSessionPopulator
Apoio

