Prezados leitores,

Há alguns posts atrás falei sobre a utilização do GeoFence, que é um plugin que nos permite subir ao nível da camada e definir a permissão conforme nossa necessidade, utilizando as configurações através da interface gráfica. Hoje irei mostrar como realizar as configurações de acesso/restrição através da API REST.

1. Criar regra para restringir acesso a qualquer layer e usuário

Para isso vou criar um arquivo XML que irei dar o nome de geofence_restrict_all_access.xml, e ele irá conter o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<Rule>
      <access>DENY</access>
</Rule>

Após criar esse arquivo, basta executar o comando abaixo:

curl.exe -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d @geofence_restrict_all_access.xml http://localhost:8080/geoserver/rest/geofence/rules

2. Criar regra para permitir acesso do ROLE ADMIN as camadas

Como no passo 1 eu restringi o acesso a todo e qualquer usuário, agora estou permitindo o acesso a camadas para o ROLE ADMIN, através das informações contidas no arquivo geofence_restrict_admin.xml detalhado abaixo:

<?xml version="1.0" encoding="UTF-8"?>
<Rule>
      <userName>ADMIN</userName>
      <access>ALLOW</access>
</Rule>

Após a criação do arquivo, é necessário executar no console o comando abaixo:

curl.exe -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d @geofence_restrict_admin.xml http://localhost:8080/geoserver/rest/geofence/rules

3. Adicionar usuário geocursos

Agora vamos adicionar um usuário chamado geocursos, e partir dele vamos criar nossas regras de acesso. Neste caso não criamos um arquivo XML, pois o comando está direto na requisição, veja:

curl.exe -v -u admin:geoserver -X POST http://localhost:8080/geoserver/rest/security/usergroup/users/ -H "accept: application/json" -H  "content-type: application/xml" -d "<?xml version=\"1.0\" encoding=\"UTF-8\"?><user>\t<userName>geocursos</userName>\t<password>geocursos</password>\t<enabled>true</enabled></user>"

4. Adicionar regras para o usuário geocursos

Agora vamos adicionar regras de acesso para o nosso novo usuário (geocursos), e na regra que segue abaixo estamos dando acesso ao método GetMap da camada topp:states (através do serviço WMS). Vamos colocar essas regra dentro do arquivo geofence_restrict_geocursos.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Rule>
      <userName>geocursos</userName>
      <workspace>topp</workspace>
      <layer>states</layer>
      <service>WMS</service>
      <request>GetMap</request>
      <access>ALLOW</access>
</Rule>

Após criado o aquivo XML, basta executar o comando abaixo no console::

curl.exe -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d @geofence_restrict_geocursos.xml http://localhost:8080/geoserver/rest/geofence/rules

5. Adicionar o usuário fernandoquadro

Nesse passo, estamos adicionando um novo usuário, nesse caso o fernandoquadro, conforme demonstra o comando abaixo:

curl.exe -v -u admin:geoserver -X POST http://localhost:8080/geoserver/rest/security/usergroup/users/ -H "accept: application/json" -H  "content-type: application/xml" -d "<?xml version=\"1.0\" encoding=\"UTF-8\"?><user>\t<userName>fernandoquadro</userName>\t<password>fernando</password>\t<enabled>true</enabled></user>"

6. Adicionar regra para o usuário fernandoquadro

Diferente do que configuramos para o usuário geocursos, para o usuário fernandoquadro estamos dando acesso a camada topp:states porém apenas quando o atributo STATE_ABBR for igual a FL. Qualquer outra informação que esteja nessa camada não será exibida para o usuário fernandoquadro. Para isso, vamos criar o arquivo geofence_restrict_fernandoquadro.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<Rule>
      <userName>fernandoquadro</userName>
      <workspace>topp</workspace>
      <layer>states</layer>
      <access>ALLOW</access>
      <layerDetails>
                <layerType>VECTOR</layerType>
                <cqlFilterRead>STATE_ABBR = 'FL'</cqlFilterRead>
                <cqlFilterWrite>STATE_ABBR = 'FL'</cqlFilterWrite>
                <attribute>
                        <name>STATE_NAME</name>
                        <datatype>String</datatype>
                        <accessType>READWRITE</accessType>
                </attribute>
                <attribute>
                        <name>STATE_ABBR</name>
                        <datatype>String</datatype>
                        <accessType>READWRITE </accessType>
                </attribute>
		<attribute>
                        <name>the_geom</name>
                        <datatype>MultiPolygon</datatype>
                        <accessType>READWRITE</accessType>
                </attribute>
        </layerDetails>
</Rule>

Feito isso, basta executar o comando abaixo:

curl.exe -v -u admin:geoserver -XPOST -H "Content-type: text/xml" -d @geofence_restrict_fernandoquadro.xml http://localhost:8080/geoserver/rest/geofence/rules

PS: Se você perceber acima, dentro da tag LayerDetails, tem algumas informações dentro das tags attribute. Essa configuração, segundo a documentação oficial é pra restringir o acesso a coluna do banco (apresentar apenas as que estivem listadas no arquivo de configuração), porém até a versão atual (2.21.0) ela ainda não funciona via REST, apenas se você realizar a configuração pela interface gráfica do GeoServer. Esse erro já foi reportado a equipe de desenvolvimento do GeoServer, porém, ainda não foi solucionada.

Esse foi apenas um exemplo de como realizar suas restrições de acesso utilizando o GeoFence pela API REST, mas claro que as possibilidade são enormes e tudo vai depender da sua necessidade. Espero que o post tenha sido útil.