##master-page:Unknown-Page
##master-date:Unknown-Date
#acl -All:write Default
#format wiki
#language es
#pragma section-numbers 2

= Listas de Control de Acceso =

Cuando activas las listas de control de acceso(ACL), es posible controlar qué puede hacer quién en cada página del wiki.

== Contenidos ==
<<TableOfContents>>

== Lo básico ==
En cada nueva instalación las acl están activas por defecto.  Para saber cómo desactivarlas Ve a [[#Configuración|Configuración]].

El uso de ACLs en moin es tan sencillo como colocar una línea de control de acceso en la parte superior de la página que estás editando, como por ejemplo:
{{{
#acl CiertoUsuario:read,write All:read
}}}
/!\ Requieres derechos de `admin` para poder adicionar o modificar tal línea

Esto le permitirá a `CiertoUsuario` leer y escribir en tal página, mientras que todo el resto podrá leer pero no editarla (a menos que se haya hecho una configuración especial en el sitio).

Los adjuntos también se protegen con las ACLs de la página a la cual están vinculados cuando se ofrecen a través de los mecanismos de moin.

/!\ Los adjuntos ''no'' están protegidos cuando el servidor está configurado con acceso directo para ellos (esto es, cuando se usa la opción {{{attachments}}} en wikiconfig.py).

<<Anchor(Configuración)>>
== Configuración ==
Estos son los elementos que se pueden configurar en las ACLs de un sitio moin.

||'''Atributo'''||'''Default'''(Valor inicial)||'''Descripción'''||
||acl_enabled||{{{0}}}||Habilita ACL cuando es verdadero||
||acl_rights_before||{{{""}}}||se aplica '''antes''' que los de la página o los valores por defecto||
||acl_rights_after||{{{""}}}||se aplica '''después''' que los de la página o los valores por defecto||
||acl_rights_default||{{{"Trusted:read,write,delete,revert \}}}<<BR>>{{{Known:read,write,delete,revert \}}}<<BR>>{{{All:read,write"}}}||Se usan'''únicamente''' si no se ha establecido'''ningún otro''' ACL a la página||
||acl_rights_valid||`["read", ` `"write", ` `"delete", ` `"revert", ` `"admin"]`||Estos son los derechos válidos (conocidos) (y el lugar para extenderlos, en caso de ser necesario).||

Ahora que ya sabes lo que ''es'', pero  ''qué significa''?
 * "antes" significa '''forzar''' (esto debido al algoritmo de elección)  Úsalo para tu página de administradores del sitio o páginas de editores.
 * "Default" significa '''lo que se hace en caso de que no haya ACLs establecidos para la página'''. Es equivalente a haber escrito estos ACLs en una página. Son los que también se mezclan en caso de que haya un '''Default''' dentro de los ACL de la página.
 * "después" significa '''sin olvidar algo''' accidentalmente (como por ejemplo dar permiso de lectura para todos.)

Ayuda mucho pensar en el procesamiento de las ACLs en las etapas : antes, durante y después.

== Sintaxis ==
La sintaxis para cada línea es de la siguiente forma:
{{{
#acl [+-]User[,SomeGroup,...]:[right[,right,...]] [[+-]OtherUser:...] [[+-]Trusted:...] [[+-]Known:...] [[+-]All:...] [Default]
}}}

Donde:

 * '''User''' es un nombre de usuario y se procesa solamente si coincide el usuario. 
 * '''Some``Grupo''' es un nombre de página que concuerda {{{page_group_regex}}} con algunas línea de la forma " * Member" (ver [[#Grupos|Grupos]]).
 * '''Trusted''' es un grupo especial que contiene todos los usuarios autenticados que han usado la autenticación-Básica.
 * '''Known''' es un grupo especial que contiene todos los usuarios válidos (como cuando se usan las cookie).
 * '''All''' es un grupo especial que incluye a todos los usuarios (los usuarios conocidos y anónimos).
 * '''Default''' Es una opción especial que inserta en el sitio especificado las entradas de {{{acl_rights_default}}} (ver [[#Default|Por defecto]]).
 * '''right''' puede ser cualquier palabra de las siguientes : read, write, delete, revert, admin.
 Solamente se aceptan las palabras de {{{acl_rights_valid}}}, se ignora cualquier otra. Puede no especificarse nada, que significa que no se otorga ningún derecho.

/!\ No coloques espacios en blanco entre el nombre y los derechos - `All: write,read` '''no''' es una línea ACL válida.

== Derechos posibles ==
Estos son todos los derechos disponibles que puedes usar en las ACLs. Ten en cuenta que no se permite Delete''''''Page ni Rename''''''Page si el usuario no es `Conocido`, incluso si se otorga un derecho `delete`.

 read::
 Se otorga a los usuarios para permitir el derecho a leer la página.

 write::
 Se otorga a los usuarios que van a escribir (editar) textos en la página.

 delete::
 Se otorga a los usuarios que pueden borrar la página y sus adjuntos.

 revert::
 Se otorga a los usuarios que pueden revertir la página a una versión anterior.

 admin::
 Se otorga a los usuarios que tienen derechos de administración para la página. Significa aquellos que pueden cambiar los ACL de una página, incluso dando "admin" a otros o eliminando "admin" de los que sea.

/!\ No hay un derecho '''rename''' separado: para renombrar una página se requiere que el usuario tenga derechos read, write y delete.

== Lógica de procesamiento ==
Cuando un usuario trata de acceder a un recurso protegido por ACLs, estas se procesan en el orden en que aparecen. la '''primera ACL que coincide con el usuario''' determinará si puede acceder o no al recurso y terminará el procesamiento una vez que haya coincidencia con una entrada las ACL.

(!) Debido a este algoritmo de ''la primera coincidencia'' es indispensable que ordenes tus ACLs: primero los usuarios, después los grupos especiales, a continuación los grupos más generales, siguiendo los `Known`(conocidos) y finalmente `All` (todos).

Por ejemplo, la siguiente ACL dice que `CiertoUsuario` puede leer y escribir en los recursos protegidos por tal ACL, miemtras que cualquier miembro de `CiertoGrupo` (excepto `CiertoUsuario`, si es parte del grupo) puede además administrarlo, y cualquier otro puede leerlo.
{{{
#acl CiertoUsuario:read,write CiertoGrupo:read,write,admin All:read
}}}

Hay dos modificadores adicionales para hacer el sistema más flexible: los prefijos '+' y '-'. Cuando los usas, el procesamiento se detiene si y solo si un usuario específico coincide, asignándole los permisos dados por la ACL, pero continuará si está buscando otro permiso (u otro usuario).
Con '+' se otorga el permiso, con '-' se niega (en caso de que se detenga).

Por ejemplo, si `CiertoUsuario` es miembro de `CiertoGrupo`, la ACL anterior se habría escrito como:
{{{
#acl -CiertoUsuario:admin CiertoGrupo:read,write,admin All:read
}}}

Este ejemplo es solamente especial para `CiertoUsuario`, porque cuando se busca el permiso admin para `CiertoUsuario`, se le negará y se detiene el procesamiento. En cualquier otro caso, continua.

O incluso:
{{{
#acl +All:read -CiertoUsuario:admin CiertoGrupo:read,write,admin
}}}

`+All:read` significa que cuando cualquier usuario solicita el permiso de lectura, le será otorgado y termina el procesamiento. En cualquier otro caso, el procesamiento continuará. Si el permiso de admin se solicita para `CiertoUsuario`, se negará y termina el procesamiento. En cualquier otro caso, el procesamiento continuará. Finalmente si un miembro de `CiertoGrupo` solicita algún permiso le será concedido si se epecificó, y le será negado si no. Todos los demás usuarios no tienen permisos, excepto los dados por la configuración.


Probablemente no desearías usar el segundo o tercer ejemplo de las ACL para alguna página. Aunque son muy útiles en la configuración global.

<<Anchor(Default)>>
== Herencia de permisos predeterminados ==
En ciertas ocasiones es adecuado dar permisos a alguien sin afectar en gran medida los valores predeterminados. Por ejemplo, supongamos que tienes las siguientes líneas en tu configuración:
{{{

acl_rights_default = "ConfiableGrupo:read,write,delete,revert All:read"
acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"
}}}

Además deseas darele permiso de escritura "write" a `CiertoUsuario` en alguna página, pero deseas mantener el comportamiente inicial para todos y el grupo `ConfiableGrupo`.  Lo puedes hacer fácilmente usando la entrada '''Predeterminada''':
{{{
#acl CiertoUsuario:read,write Default
}}}

Tal acción insertará las líneas de {{{acl_rights_default}}} en el sitio exacto en el cual la palabra Default se haya colocado. En otras palabras, la entrada anterior, con la configuración dada, es equivalente a la siguiente línea:
{{{
#acl CiertoUsuario:read,write ConfiableGrupo:read,write,delete,revert All:read
}}}

Estudiemos el primer ejemplo de esta sección:
{{{acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"}}}

Las ACL se procesan en el orden "before" después "page/default" y después "after", "de izquierda a derecha".

Así comienza a la izquierda de "before" con `AdminGrupo:...` - coincide si
eres miembro del grupo admin.
Si coincide, obtienes tales derechos (arwdr) y el procesamiento de las ACL termina.

Si no coincide, el procesamiento de ACL continua con `+ConfiableGrupo:admin`
- que coincide si eres miembro del grupo `ConfiableGrupo`.

Si coincide, obtendrás los derechos (a) y - ahora la diferencia debido al modificador,
- El procesamiento de ACL CONTINÚA! De tal forma que si hay otra coincidencia para
un grupo o tu usuario o `Known:` o `All:` obtendrás esos derechos también.

Si no coincide, el procesamiento ACL continúa - con la página de ACLs (si
hay alguna) o con las ACLs si hay otras (en caso de que no haya páginas ACL) y
finalmente con las ACL "after".

A pesar de representar lo mismo, la herencia de los valores predeterminados la ventaja es que mantiene cualquier otro cambio que se haga a los valores predeterminados.

<<Anchor(Grupos)>>
== Grupos ==
Los grupos de usuarios facilitan especifica derechos para grupos más grandes. Normalmente el nombre de la página del grupo debe terminar con `Grupo`, por ejemplo, AmigosGrupo. Esto le permite a MoinMoin reconocerlo como una lista de usuarios. Este patrón predeterminado se puede cambiar(p.e. para otros idiomas, etc.), mira AyudaSobreConfiguración.

Solamente los amigos de `CiertoUsuario` pueden leer y editar esta página:
{{{
#acl CiertoUsuario:read,write CiertoUsuario/AmigosGrupo:read,write
}}}

`CiertoUsuario/AmigosGrupo` sería una página en la cuál los elementos de la lista de primer nivel representarían un nombre de usuario en tal grupo:
{{{
#acl CiertoUsuario:read,write,admin,delete,revert
 * PepitoPérez
 * SutanoApellido
 * MenganoMartínez
}}}

Una página llamada `AdminGrupo` podría definir un grupo con tal nombre y podría estar protegida por ACLs:
{{{
#acl AdminGrupo:admin,read,write All:read
 * CiertoUsuario
 * OtroUsuario
   * Esto no correspondería a un usuario
Cualquier otro texto en el primer nivel no es tenido en cuenta.
}}}

/!\ Una lista de primer nivel es aquella con solamente un espacio antes del asterisco (y debe haber otro espacio después del asterisco). Lo siguiente '''no''' funcionará:
{{{
  * cierto usuario
-- dos espacios, por lo tanto no funciona.
}}}

Puedes configurar qué páginas se consideran como páginas de definición de grupos (p.e. para wikis en otro idioma):
{{{
page_group_regex =  '[a-z]Group$'    # este es el valor predeterminado
}}}

/!\ Si los cambios en la página del grupo no surten efecto, espera a que MoinMoin reconstruya el caché removiendo todos los archivos en el directorio {{{ruta_a_tu_instancia_de_wiki/data/cache/wikidicts/}}}


== Casos de uso ==

=== Wiki de una comunidad pública en Internet ===
El punto más importante es usar las ACLs solamente en aquellos casos en los que sean necesarias. Los wikis dependen de la apertura de la información y la libertad de edición. Usan seguridad suave para limpiar contenidos no deseados. Por lo que en general no se necesitan ACLs. Sí las usas demasiado, puedes destruir la forma en que el wiki funciona.

Esta es la razón por la cual las ACLs no deberían usarse (predeterminadamente) o, en caso de que se usen, el archivo wikiconfig.py debería lucir como:
{{{
acl_rights_before = 'NombreEditorWiki:read,write,admin,delete,revert +AdminGrupo:admin ChicoMalo:' 
}}}

Los parámetros iniciales de {{{acl_rights_default}}} deberían funcionar para tí:
{{{
acl_rights_default = 'Known:read,write,delete,revert All:read,write' 
}}}

Un buen consejo es tener un grupo selecto de administradores confiables en `AdminGrupo` (Deberían entender claramente como funciona un wiki y podrían destruir accidentalemente la forma en que un wiki funciona: gracias a su apertura, no a ser cerrado y protegido!).

Si usas `AdminGrupo`, deberías crear una página llamada `AdminGrupo` y usarla para definir las personas que tienen derechos de administración.

Especificar a `ChicoMalo` como se mostró, básicamente lo segrega - no puede leer o editar nada con tal cuenta. Sólo tiene sentido si se hace temporalmente, de otra forma, mejor borra esa cuenta. Por supuesto, este `ChicoMalo` puede trabajar anónimamente, así que no es una protección real (Aquí es donde se aplica la seguridad suave).

=== Wiki como un CMS sencillo ===
Si quieres usar un wiki para crear contenido web de forma rápida, pero no quieres ediciones hecas por el público (solamente por ciertos webmasters), podrías querer usar algo como lo siguiente en wikiconfig.py:
{{{
acl_rights_default = 'All:read' 
acl_rights_before  = 'WebMaster,OtherWebMaster:read,write,admin,delete,revert' 
}}}

Todos pueden leer, pero solamente los webmaster pueden hacer de todo. Siempre que ellos puedan trabajar en una nueva página, pueden colocar
{{{
#acl All: 
}}}
para que nadie más pueda ver una página que no está lista. Cuando esté terminada, no olvides eliminar esta línea de nuevo, para usar
los {{{acl_rights_default}}}.

Algunas páginas podrían aceptar también comentarios del público(Por ejemplo `ComentariosVarios`), podrías dar más derechos sobre esa página:
{{{
#acl All:read,write 
}}}

=== Wiki en una Intranet ===
Si quieres usar un wiki en tu intranet y confías en tus usuarios (no hacen acciones hostiles, como por ejemplo, bloquear a otros usuarios o secuestro de páginas) para usar la funcionalidad de administración de forma razonable, podrías usar:
{{{
acl_rights_default = 'Known:admin,read,write,delete,revert All:read,write'
acl_rights_before  = 'WikiAdmin,GranJefe:read,write,admin,delete,revert' 
}}}

De forma que todos podrían leer, escribir cambiar derechos de ACLs, `WikiAdmin` y el `GranJefe` podrían hacer cualquier cosa, los usuarios registrados podrían tener derechos de administración gracias a acl_rights_default (obteniéndolas, a menos que se haya especificado otra ACL para cierta página).

Consecuencias:
 * En una página neuve, el creador puede colocar las ACLs que le plazca.
 * En páginas existentes, que no tengan ACLs, cualquier usuario registrado puede colocar las ACLs que desee.
 * Todos (excepto `WikiAdmin` y el `GranJefe`) pueden ser bloqueados por cualquier otro registrado ("known") en páginas sin ACLs.

=== Wiki como una página pública de una compañía ===
Si deseas usar un wiki como la página de la compañía, y no deseas que cualquier individuo pueda cambiar los contenidos, podría interesarte
algo como esto :
{{{
acl_rights_default = "ConfiableGrupo:admin,read,write,delete,revert All:read"
acl_rights_before  = "AdminGrupo:admin,read,write,delete,revert +ConfiableGrupo:admin"
}}}

Que significa:
 * Inicialmente los usuarios anónimos y registrados solamente pueden leer páginas
 * en una página nueva, los usuarios en `ConfiableGrupo` pueden colocar cualquier ACL.
 * en las páginas existentes, aquellas que no tienen ACLs todavía, cualquier usuario de `ConfiableGrupo` puede colocar la ACL que quiera
 * todos, excepto los que están en `AdminGrupo`, pueden ser bloqueados por cualquiera en Admin o en Confiable
 * aquellos en `ConfiableGrupo` pueden tener derechos de administración sobre todas las páginas que pueden escribir, a pesar de haber ACLs.

=== Comentarios en páginas de sólo-lectura ===
Puedes adicionar comentarios de forma sencilla a la página de sólo-lectura usando una subpágina con permisos de escritura, para permitir a otros escribir en ella. Por ejemplo, puedes
definir `CiertaPágina` así:
{{{
#acl CiertoUsuario:read,write All:read
'''Contenido de sólo-lectura'''

...

''' Comentarios de Usuarios '''
<<Include(CiertaPágina/Comentarios)>>
}}}

en dónde  `CiertaPágina/Comentarios` luce así:
{{{
#acl All:read,write
Añade tus comentarios acerca de CiertaPágina
}}}
