In http://web2py.com/book/default/chapter/08#Authentication and Customizing Auth
Example: # after # auth = Auth(globals(),db) db.define_table( auth.settings.table_user_name, Field('first_name', length=128, default=''), Field('last_name', length=128, default=''), Field('email', length=128, default='', unique=True), Field('password', 'password', length=512, readable=False, label='Password'), Field('registration_key', length=512, writable=False, readable=False, default=''), Field('reset_password_key', length=512, writable=False, readable=False, default=''), Field('registration_id', length=512, writable=False, readable=False, default='')) auth_table.first_name.requires = \ IS_NOT_EMPTY(error_message=auth.messages.is_empty) auth_table.last_name.requires = \ IS_NOT_EMPTY(error_message=auth.messages.is_empty) auth_table.password.requires = [IS_STRONG(), CRYPT()] auth_table.email.requires = [ IS_EMAIL(error_message=auth.messages.invalid_email), IS_NOT_IN_DB(db, auth_table.email)] auth.settings.table_user = auth_table # before # auth.define_tables() It didn't work. I followed a discussion and if I want that work, We need this: auth_table = db.define_table( auth.settings.table_user_name, Field('created', 'datetime', default=request.now, writable=False, readable=False), Field('first_name', length=128, default='', label='Nombre(s)'), Field('last_name', length=128, default='', label='Apellido Paterno'), Field('end_name', length=128, default='', label='Apellido Materno'), Field('email', length=128, default='', unique=True, label='Correo electronico'), Field('password', 'password', length=512, readable=False, label='Contraseña'), Field('registration_key', length=512, writable=False, readable=False, default=''), Field('reset_password_key', length=512, writable=False, readable=False, default=''), Field('registration_id', length=512, writable=False, readable=False, default=''), Field('rfc', 'string', label='RFC'), Field('domicilio','string', label='Calle y Num.Ext., Num.Int.'), Field('colonia','string'), Field('municipio','string', label='Municipio ó Delegación'), Field('estado','string', label='Estado'), Field('cp','integer', label='C.P.'), Field('tel', 'double', label='Tel. Casa'), Field('cel', 'double', label='Tel. Celular', comment='Sin el 044'), Field('sexo','string', requires=IS_IN_SET(['Masculuno','Femenino'])), Field('last_login','datetime',default=request.now,writable=False,readable=False), Field('last_ip',default=request.env.remote_addr,writable=False,readable=False)) auth_table.first_name.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), IS_UPPER()] auth_table.last_name.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), IS_UPPER()] auth_table.end_name.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), IS_UPPER()] auth_table.email.requires = [IS_EMAIL(error_message=auth.messages.invalid_email), IS_NOT_IN_DB(db, auth_table.email)] auth_table.password.requires = [IS_STRONG(), CRYPT()] auth_table.rfc.requires = [IS_UPPER(), IS_NOT_EMPTY(error_message=auth.messages.is_empty), \ IS_LENGTH(minsize=13,error_message='El tamaño debe ser de 13 caracteres'), \ IS_NOT_IN_DB(db,auth_table.rfc,error_message='El RFC ya existe')] auth_table.domicilio.requires = [IS_NOT_EMPTY(error_message='No puede estar vacio'),IS_UPPER()] auth_table.colonia.requires=[IS_NOT_EMPTY(error_message='No puede estar vacio'),IS_UPPER()] auth_table.municipio.requires=[IS_NOT_EMPTY(error_message='No puede estar vacio'),IS_UPPER()] auth_table.estado.requires=[IS_NOT_EMPTY(error_message='No puede estar vacio'),IS_UPPER()] auth_table.cp.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), \ IS_INT_IN_RANGE(0,1e100,error_message='Debe ser Numero positivo')] auth_table.tel.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), \ IS_FLOAT_IN_RANGE(0,1e1000,error_message='Debe ser Numero positivo')] auth_table.cel.requires = [IS_NOT_EMPTY(error_message=auth.messages.is_empty), \ IS_FLOAT_IN_RANGE(0,1e1000,error_message='Debe ser Numero positivo')] auth_table.sexo.requires = IS_IN_SET(['femenino','masculino']) auth.settings.table_user = auth_table It's only a litle typo. Well I show my customizing.