Auth handling middleware determines which user is currently signed in and provides a User object which has information about that user. Auth sign in functionality is left to the application but is made extremely easy through the use of an sign in handler class.
The web.wsgi.auth module provides one class Auth which adds the following information to the environ dictionary based on the parameters specified in the class constructor.
environ['web.auth.username'] and environ['REMOTE_USER']
environ['web.auth.session'] AuthSession object as returned by web.auth.session() used to manage whether a user is currently signed in or not.
environ['web.auth.manager'] UserManager object as returned by web.auth.manager() used to manage applications and users.
The example below demonstrates how to check if a user is signed in and if they are not signed in, provide them with a sign in form and handle the submissions until they are signed in.
import sys; sys.path.append('../')
from web.wsgi import *
# Sign In Application
class simpleApp(base.BaseApplication):
def start(self):
# Create some sample data
if not self.environ['web.auth.manager'].applicationExists('app'):
self.environ['web.auth.manager'].addApplication('app')
self.environ['web.auth.manager'].addUser(
'john',
'bananas',
'John',
'Smith',
'johnsmith@example.com',
)
self.environ['web.auth.manager'].addUser(
'norights',
'123',
)
self.environ['web.auth.manager'].setAccessLevel('john', 'app', 1)
valid = False
if self.environ.has_key('web.auth.username') and \
self.environ['web.auth.manager'].userExists(self.environ['web.auth.username']):
user = self.environ['web.auth.manager'].getUser(self.environ['web.auth.username'])
if user.level.has_key('app') and user.level['app'] > 0:
self.output('Username %s is signed in'%user.username)
valid = True
if not valid:
self.environ['web.auth.session'].signOut()
# Try to login
import web.auth.handler.signIn
signInHandler = web.auth.handler.signIn.SignInHandler(
session = self.environ['web.auth.session'],
manager = self.environ['web.auth.manager'],
cgi = self.environ['web.cgi'],
)
form = signInHandler.handle()
if form:
# Display the error form
self.output('<html><body><h1>Please Sign In</h1>%s</body></html>'%form)
else:
# We have just signed in
username = self.environ['web.auth.session'].username()
valid = False
if username and self.environ['web.auth.manager'].userExists(username):
user = self.environ['web.auth.manager'].getUser(username)
if user.level.has_key('app') and user.level['app'] > 0:
self.output('Signed in successfully')
valid = True
if not valid:
self.output("You do not have suitable access rights to use this application")
self.environ['web.database.connection'].commit()
# Middleware Setup
application = error.Error(
database.Database(
environment.Environment(
session.Session(
cgi.CGI(
auth.Auth(
simpleApp(),
setupEnvironment=1,
expire=30,
idle=10,
),
),
expire = 1000,
setupEnvironment = 1,
),
name = 'testEnv',
storage = 'database',
),
adapter = 'snakesql',
database = 'wsgi-auth',
autoCreate = 1,
),
)
You can test this example by running the WSGI server scripts/WSGIServer.py and visiting http://localhost:8000/auth