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