Ok thank you for your help. Does that mean I have to allow usernames for 
login for CAS to work? All of our users now use email addresses. I can get 
around the issue by manually creating a auth_user.username column in 
Postgres, but a cleaner fix would be as Anthony posted somewhere else: 
auth.settings.login_userfield 
= 'email'? This would allow a username so that the tables are created, but 
not used unless I expose that field?



On Friday, 5 April 2013 14:37:04 UTC-7, Massimo Di Pierro wrote:
>
> If you use CAS you must change:
>
> auth = Auth(db)
>
> into
>
> auth = Auth(db, username=True)
>
>
> CAS requires a username.
>
> On Friday, 5 April 2013 11:26:50 UTC-5, joe smith wrote:
>>
>> I am writing a number of Web2py applications. The base CAS application is 
>> an administration system to keep track of users, organizations, groups, 
>> etc. That part is working fine, but now I want to add additional 
>> applications that use this administration system as a CAS provider. I have 
>> been trying to get things to work properly for a week or so without having 
>> a "nice" solution. I am using a single Postgres database and trying to use 
>> the CAS to authenticate. It seems that when I try to use the CAS provider 
>> from one of the applications I get an error:
>>
>> <class 'gluon.contrib.pg8000.errors.ProgrammingError'> ('ERROR', '42703', 
>> 'column auth_user.username does not exist') Version  web2py™ (2, 3, 2, 
>> datetime.datetime(2012, 12, 17, 15, 3, 30), 'stable')  Python Python 
>> 2.7.3: C:\Python27\python.exe  Traceback 
>>
>> 1.
>> 2.
>> 3.
>> 4.
>> 5.
>> 6.
>> 7.
>> 8.
>> 9.
>> 10.
>> 11.
>> 12.
>> 13.
>> 14.
>> 15.
>> 16.
>> 17.
>> 18.
>> 19.
>> 20.
>> 21.
>> 22.
>> 23.
>> 24.
>> 25.
>> 26.
>> 27.
>> 28.
>> 29.
>> 30.
>> 31.
>> 32.
>> 33.
>> 34.
>> 35.
>> 36.
>> 37.
>> 38.
>> 39.
>> 40.
>> 41.
>> 42.
>> 43.
>> 44.
>>
>> Traceback (most recent call last):
>>   File "C:\wrk\PD\admingui\trunk\gluon\restricted.py", line 212, in 
>> restricted
>>     exec ccode in environment
>>   File "C:/wrk/PD/admingui/trunk/applications/app1/controllers/default.py" 
>> <http://127.0.0.1:8000/admin/default/edit/app1/controllers/default.py>, line 
>> 77, in <module>
>>   File "C:\wrk\PD\admingui\trunk\gluon\globals.py", line 193, in <lambda>
>>     self._caller = lambda f: f()
>>   File "C:/wrk/PD/admingui/trunk/applications/app1/controllers/default.py" 
>> <http://127.0.0.1:8000/admin/default/edit/app1/controllers/default.py>, line 
>> 39, in user
>>     return dict(form=auth())
>>   File "C:\wrk\PD\admingui\trunk\gluon\tools.py", line 1240, in __call__
>>     return getattr(self, args[0])()
>>   File "C:\wrk\PD\admingui\trunk\gluon\tools.py", line 2090, in login
>>     table_user._filter_fields(cas_user))
>>   File "C:\wrk\PD\admingui\trunk\gluon\tools.py", line 1714, in 
>> get_or_create_user
>>     user = table_user(**{fieldname: value})
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 7769, in __call__
>>     return self._db(query).select(limitby=(0,1),for_update=for_update, 
>> orderby=orderby).first()
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 8905, in select
>>     return adapter.select(self.query,fields,attributes)
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 1631, in select
>>     return self._select_aux(sql,fields,attributes)
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 1596, in _select_aux
>>     self.execute(sql)
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 1709, in execute
>>     return self.log_execute(*a, **b)
>>   File "C:\wrk\PD\admingui\trunk\gluon\dal.py", line 1703, in log_execute
>>     ret = self.cursor.execute(*a, **b)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\dbapi.py", line 246, 
>> in _fn
>>     return fn(self, *args, **kwargs)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\dbapi.py", line 317, 
>> in execute
>>     self._execute(operation, args)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\dbapi.py", line 322, 
>> in _execute
>>     self.cursor.execute(new_query, *new_args)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\interface.py", line 
>> 398, in execute
>>     self._stmt = PreparedStatement(self.connection, query, 
>> statement_name="", *[{"type": type(x), "value": x} for x in args])
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\interface.py", line 
>> 138, in __init__
>>     self._parse_row_desc = self.c.parse(self._statement_name, statement, 
>> types)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\protocol.py", line 
>> 943, in _fn
>>     return fn(self, *args, **kwargs)
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\protocol.py", line 
>> 1104, in parse
>>     return reader.handle_messages()
>>   File "C:\wrk\PD\admingui\trunk\gluon\contrib\pg8000\protocol.py", line 
>> 929, in handle_messages
>>     raise exc
>> ProgrammingError: ('ERROR', '42703', 'column auth_user.username does not 
>> exist')
>>
>> Can anyone tell me the correct way of integrating multiple applications 
>> to use a single CAS provider. I have been through all the forum posts and 
>> book examples. I am always getting table conflicts. In this case it is 
>> looking for auth.username. But in all applications including this one I 
>> have auth.define_tables(username=False), but it still looks for it.
>>
>> Here is my db.py file for cas_provider:
>>
>>
>> # -*- coding: utf-8 -*-
>>
>> #########################################################################
>> ## This scaffolding model makes your app work on Google App Engine too
>> ## File is released under public domain and you can use without 
>> limitations
>> #########################################################################
>>
>> if not request.env.web2py_runtime_gae:
>> ## if NOT running on Google App Engine use SQLite or other DB
>> #db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all'])
>> db = DAL('postgres://postgres:password@localhost/mydatabase', 
>> pool_size=1, check_reserved=['all'])
>> session.connect(request, response, db = db, masterapp = None) 
>> else:
>> ## connect to Google BigTable (optional 'google:datastore://namespace')
>> db = DAL('google:datastore')
>> ## store sessions and tickets there
>> session.connect(request, response, db=db)
>>
>> ## by default give a view/generic.extension to all actions from localhost
>> ## none otherwise. a pattern can be 'controller/function.extension'
>> response.generic_patterns = ['*'] if request.is_local else []
>>
>> _migrate=True
>> _fake_migrate=False
>>
>> from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
>> auth = Auth(db)
>> crud, service, plugins = Crud(db), Service(), PluginManager()
>>
>> # Object Types table
>> db.define_table('object_types',
>> Field('name', 'string', length=32),
>> format='%(name)s', migrate=_migrate)
>>
>> # Objects table
>> db.define_table('objects',
>> Field('name','string',length=64),
>> Field('object_type_id', 'reference object_types'),
>> format='%(name)s', migrate=_migrate)
>>
>> #Parent_id's must be existing object_id's
>> objects_table = db[db.object_types] # get the custom_auth_table
>> objects_table.name.requires = 
>> IS_NOT_EMPTY(error_message=auth.messages.is_empty)
>>
>> ####### Custom Auth Field Definitions: #######
>> auth.settings.extra_fields['auth_user']=[
>> Field('work_phone','string',length=32),
>> Field('home_phone','string',length=32),
>> Field('cell_phone','string',length=32),
>> Field('photo','upload',autodelete=True),
>> Field('object_id', 'reference objects')]
>>
>> ## create all tables needed by auth if not custom tables
>> auth.define_tables(migrate=_migrate, fake_migrate=_fake_migrate, 
>> username=False, signature=False)
>>
>> ## configure email
>> mail = auth.settings.mailer
>> mail.settings.server = 'logging' or 'smtp.gmail.com:587'
>> mail.settings.sender = '[email protected]'
>> mail.settings.login = 'username:password'
>>
>> ## configure auth policy
>> auth.settings.registration_requires_verification = False
>> auth.settings.registration_requires_approval = False
>> auth.settings.reset_password_requires_verification = True
>>
>> ## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc.
>> ## register with janrain.com, write your domain:api_key in 
>> private/janrain.key
>> from gluon.contrib.login_methods.rpx_account import use_janrain
>> use_janrain(auth, filename='private/janrain.key')
>>
>>
>> Here is the model db.py file for the cas consumer (app1):
>>
>>
>> # -*- coding: utf-8 -*-
>>
>> #########################################################################
>> ## This scaffolding model makes your app work on Google App Engine too
>> ## File is released under public domain and you can use without 
>> limitations
>> #########################################################################
>>
>> ## if SSL/HTTPS is properly configured and you want all HTTP requests to
>> ## be redirected to HTTPS, uncomment the line below:
>> # request.requires_https()
>> _migrate=False
>>
>> if not request.env.web2py_runtime_gae:
>> ## if NOT running on Google App Engine use SQLite or other DB
>> db = DAL('postgres://postgres:password@localhost/mydatabase', 
>> pool_size=1, check_reserved=['all'], auto_import=True)
>> session.connect(request, response, db = db, masterapp = 'cas_provider') 
>> else:
>> ## connect to Google BigTable (optional 'google:datastore://namespace')
>> db = DAL('google:datastore')
>> ## store sessions and tickets there
>> session.connect(request, response, db=db)
>> ## or store session in Memcache, Redis, etc.
>> ## from gluon.contrib.memdb import MEMDB
>> ## from google.appengine.api.memcache import Client
>> ## session.connect(request, response, db = MEMDB(Client()))
>>
>> ## by default give a view/generic.extension to all actions from localhost
>> ## none otherwise. a pattern can be 'controller/function.extension'
>> response.generic_patterns = ['*'] if request.is_local else []
>> ## (optional) optimize handling of static files
>> # response.optimize_css = 'concat,minify,inline'
>> # response.optimize_js = 'concat,minify,inline'
>>
>> #########################################################################
>> ## Here is sample code if you need for
>> ## - email capabilities
>> ## - authentication (registration, login, logout, ... )
>> ## - authorization (role based authorization)
>> ## - services (xml, csv, json, xmlrpc, jsonrpc, amf, rss)
>> ## - old style crud actions
>> ## (more options discussed in gluon/tools.py)
>> #########################################################################
>>
>> from gluon.tools import Auth, Crud, Service, PluginManager, prettydate
>> auth = Auth(db,cas_provider = '
>> http://127.0.0.1:8000/cas_provider/default/user/cas')
>> crud, service, plugins = Crud(db), Service(), PluginManager()
>>
>>
>> ## create all tables needed by auth if not custom tables
>> auth.define_tables(migrate=_migrate, fake_migrate=False, username=False)
>>
>> ## configure email
>> mail = auth.settings.mailer
>> mail.settings.server = 'logging' or 'smtp.gmail.com:587'
>> mail.settings.sender = '[email protected]'
>> mail.settings.login = 'username:password'
>>
>> ## configure auth policy
>> auth.settings.registration_requires_verification = False
>> auth.settings.registration_requires_approval = False
>> auth.settings.reset_password_requires_verification = True
>>
>> ## if you need to use OpenID, Facebook, MySpace, Twitter, Linkedin, etc.
>> ## register with janrain.com, write your domain:api_key in 
>> private/janrain.key
>> from gluon.contrib.login_methods.rpx_account import use_janrain
>> use_janrain(auth, filename='private/janrain.key')
>>
>> #########################################################################
>> ## Define your tables below (or better in another model file) for example
>> ##
>> ## >>> db.define_table('mytable',Field('myfield','string'))
>> ##
>> ## Fields can be 'string','text','password','integer','double','boolean'
>> ## 'date','time','datetime','blob','upload', 'reference TABLENAME'
>> ## There is an implicit 'id integer autoincrement' field
>> ## Consult manual for more options, validators, etc.
>> ##
>> ## More API examples for controllers:
>> ##
>> ## >>> db.mytable.insert(myfield='value')
>> ## >>> rows=db(db.mytable.myfield=='value').select(db.mytable.ALL)
>> ## >>> for row in rows: print row.id, row.myfield
>> #########################################################################
>>
>> ## after defining tables, uncomment below to enable auditing
>> # auth.enable_record_versioning(db)
>>
>>

-- 

--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to