Web2py - Control de acceso

Autenticación

Casi todas las aplicaciones deben poder autenticar usuarios y establecer permisos. web2py viene con un control de acceso basado en roles extenso y personalizablemechanism.web2py. También es compatible con los protocolos, como CAS, OpenID, OAuth 1.0, LDAP, PAM, X509 y muchos más.

web2py incluye un mecanismo conocido como mecanismo de control de acceso basado en roles (RBAC), que es un enfoque para restringir el acceso al sistema a usuarios autorizados. La clase web2py que implementa RBAC se llama Auth.

Mira el esquema que se muestra a continuación.

Auth define las siguientes tablas -

No Señor Nombre y descripción de la tabla
1

auth_user

almacena el nombre, la dirección de correo electrónico, la contraseña y el estado de los usuarios.

2

auth_group

almacena grupos o roles para usuarios en una estructura de muchos a muchos

3

auth_membership

Almacena la información de los enlaces de usuarios y grupos en una estructura de varios a varios

4

auth_permission

La tabla vincula grupos y permisos.

5

auth_event

registra cambios en las otras tablas y acceso exitoso

6

auth_cas

Se utiliza para el servicio de autenticación central.

Personalización de la autenticación

Hay dos formas de personalizar Auth.

  • Para definir una costumbre db.auth_user mesa desde cero.

  • Deje que web2py defina el auth mesa.

Veamos el último método para definir el authmesa. En eldb.py modelo, reemplace la siguiente línea -

auth.define_tables()

Reemplácelo con el siguiente código:

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}')),
   Field('address','text')
]

auth.define_tables(username = True)

Se supone que cada usuario consta de un número de teléfono, un nombre de usuario y una dirección.

auth.settings.extra_fieldses un diccionario de campos adicionales. La clave es el nombre de la tabla de autenticación a la que agregar los campos adicionales. El valor es una lista de campos adicionales. Aquí, hemos agregado dos campos adicionales,phone_number and address.

usernametiene que tratarse de una manera especial, porque está involucrado en el proceso de autenticación, que normalmente se basa en el campo de correo electrónico. Al pasar el argumento de nombre de usuario a la siguiente línea, se informa a web2py que queremos el campo de nombre de usuario y queremos usarlo para iniciar sesión en lugar del campo de correo electrónico. Actúa como una clave principal.

auth.define_tables(username = True)

El nombre de usuario se trata como un valor único. Puede haber casos en los que el registro se realice fuera del formulario de registro normal. También sucede así, que el nuevo usuario se ve obligado a iniciar sesión, para completar su registro.

Esto se puede hacer usando un campo ficticio, complete_registration que está configurado para False de forma predeterminada, y se establece en True cuando actualizan su perfil.

auth.settings.extra_fields['auth_user'] = [
   Field('phone_number',requires = IS_MATCH('\d{3}\-\d{3}\-\d{4}'),
   comment = "i.e. 123-123-1234"),
   Field('address','text'),
   Field('complete_registration',default = False,update = True,
   writable = False, readable = False)
]

auth.define_tables(username = True)

Este escenario puede tener la intención de que los nuevos usuarios, al iniciar sesión, completen su registro.

En db.py, en la carpeta de modelos, podemos agregar el siguiente código:

if auth.user and not auth.user.complete_registration:
if not (request.controller,request.function) == ('default','user'):
   redirect(URL('default','user/profile'))

Esto obligará a los nuevos usuarios a editar su perfil según los requisitos.

Autorización

Es el proceso de conceder algún acceso o dar permiso de algo a los usuarios.

En web2py, una vez que se crea o se registra el nuevo usuario, se crea un nuevo grupo para contener al usuario. El rol del nuevo usuario se denomina convencionalmente como“user_[id]” donde id es la identificación única del usuario.

El valor predeterminado para la creación del nuevo grupo es:

auth.settings.create_user_groups = "user_%(id)s"

La creación de grupos entre los usuarios se puede desactivar mediante:

auth.settings.create_user_groups = None

La creación, la concesión de acceso a miembros y permisos particulares se puede lograr mediante programación con la ayuda de appadmin también.

Algunas de las implementaciones se enumeran a continuación:

No Señor Comando y uso
1

auth.add_group('role', 'description')

devuelve el id del grupo recién creado.

2

auth.del_group(group_id)

Elimina el grupo con la identificación especificada

3

auth.del_group(auth.id_group('user_7'))

Elimina el grupo de usuarios con la identificación dada.

4

auth.user_group(user_id)

Devuelve el valor de id del grupo asociado de forma única para el usuario dado.

5

auth.add_membership(group_id, user_id)

Devuelve el valor de user_id para el group_id dado

6

auth.del_membership(group_id, user_id)

Revoca el acceso del member_id dado, es decir, user_id del grupo dado.

7

auth.has_membership(group_id, user_id, role)

Comprueba si user_id pertenece al grupo dado.

Servicio de autenticación central (CAS)

web2py proporciona un estándar de la industria, a saber, Servicio de autenticación de cliente - CAS para web2py integrado en el cliente y el servidor. Es una herramienta de autenticación de terceros.

Es un protocolo abierto para autenticación distribuida. El funcionamiento de CAS es el siguiente:

  • Si el usuario visita el sitio web, el protocolo verifica si el usuario está autenticado.

  • Si el usuario no está autenticado en la aplicación, el protocolo redirige a la página donde el usuario puede registrarse o iniciar sesión en la aplicación.

  • Si se completa el registro, el usuario recibe un correo electrónico. El registro no está completo hasta que el usuario verifique el correo electrónico.

  • Después del registro exitoso, el usuario se autentica con la clave, que es utilizada por el dispositivo CAS.

  • La clave se usa para obtener las credenciales del usuario a través de una solicitud HTTP, que se establece en segundo plano.