webPy Sessions - Concurrent users use same session and session timeout

2024/10/15 13:15:32

I have a webPy app using sessions for user authentication. Sessions are initiated like so:

web.config.debug=Falsestore = web.session.DiskStore('/path_to_app/sessions')
if web.config.get('_session') is None:web.config.session_parameters['ignore_expiry'] = Falseweb.config.session_parameters['timeout'] = 600web.config.session_parameters['max_age'] = 600web.config.session_parameters['ignore_change_ip'] = Falseweb.config.session_parameters['expired_message'] = 'Session Expired... Please reload the page and login in again.'web.config.session_parameters['cookie_name'] = 'my_session_id'session_init = web.session.Session(app, store, initializer={'login':0, 'privilege':0, 'user':'none'})session = session_init._initializerweb.config._session = session
else:session = web.config._session

Here is the login class:

class Login:def GET(self):if logged() == True:return render.index()else:render = create_render(session['privilege'])return render.login()def POST(self):data= web.input()name = data['user']passwd = data['passwd']ident = model.get_users(m, name)try:if passwd == ident.password.strip():session['login'] = 1session['privilege'] = ident['privilege']session['user'] = namerender = create_render(session['privilege'])return render.index()else:session.login = 0session.privilege = 0session.user = 'none'render = create_render(session['privilege'])return render.login()except:session['login'] = 0session['privilege'] = 0render = create_render(session['privilege'])return render.login()

and here is the logged check:

def logged():if session['login']==1:return Trueelse:return False

I have two issues which I cannot figure out:

  1. When there are concurrent connections to the web server, they use the same session so if some one is logged in already, another used connecting to the site jumps straight in without authentication.

UPDATE:

A new session is in fact created in the disk store for each user but the details apart from the ID are the same - The issue still stands that a new user does not need to authenticate:

>>> x = base64.b64decode(open("/path_to_app/sessions/71b598e8a40c62cc6b5a1bf7a380d67886e87859").read())
>>> pickle.loads(x)
{'privilege': 2, 'ip': u'137.237.225.56', 'login': 1, 'user': u'admin', 'session_id': '71b598e8a40c62cc6b5a1bf7a380d67886e87859'}
>>> 
>>> y = base64.b64decode(open("/path_to_app/sessions/5a7364dc2a23ea69c61212bc496500cbb15f89bd").read()) 
>>> pickle.loads(y)
{'privilege': 2, 'ip': u'137.237.225.133', 'login': 1, 'user': u'admin', 'session_id': '5a7364dc2a23ea69c61212bc496500cbb15f89bd'}
  1. When the session expires, it is not deleted. I can see the session expiring and producing the message as defined but if the user refreshes the page, they are straight back in again. Is there a way to kill the session when it expires?

Thanks!

Answer

I don't like to leave this hanging in case someone from the future discovers this and wants to know what I learned...

I ended up ditching the sessions in web.py and moved to Beaker Session Middleware using client side cookies only.

A quick example:

import web
from beaker.middleware import SessionMiddlewareurls = ('/', 'index','/login', 'Login','/logout', 'Logout')t_globals = {'datestr': web.datestr,'str': str,'datetime': datetime}# beaker options are optional.... but it's good to see 
# where they are calledsession_opts = {'session.cookie_expires': True,'session.timeout' : 600,'session.secure' : True,
}# define webPy app
app = web.application(urls, globals())# smash it all together and define name for cookie key (sid)
def session_mw(app):return SessionMiddleware(app, config = session_opts, key = "sid")# function to check if we are logged in
def logged(session):if 'login' in session:if session['login']==1:return Trueelse:return Falseelse:return False# create different renders based on log in privilege
def create_render(privilege):session = web.ctx.environ['beaker.session']if logged(session) == True:if privilege == 0:render = web.template.render('/templates/user/', base='user_base', globals=t_globals)elif privilege == 1:render = web.template.render('/templates/user/', base='user_base', globals=t_globals)elif privilege == 2:render = web.template.render('/templates/admin/', base='base', globals=t_globals)else:render = web.template.render('/templates/viewer/', base='base', globals=t_globals)else:render = web.template.render('templates/', globals=t_globals)return renderclass Login:def GET(self):session = web.ctx.environ['beaker.session']if logged(session) == True:render = create_render(session['privilege'])return render.index()else:render = create_render(0)return render.login()# I get user credentials from a database (called in model.get_users) def POST(self):session = web.ctx.environ['beaker.session']data= web.input()name = data['user']passwd = data['passwd']ident = model.get_users(m, name)try:if passwd == ident.password.strip():session['login'] = 1session['privilege'] = ident['privilege']session['user'] = namesession.save()render = create_render(session['privilege'])return render.index()else:session.login = 0session.privilege = 0session.user = 'none'render = create_render(session['privilege'])return render.login()except:session['login'] = 0session['privilege'] = 0render = create_render(session['privilege'])return render.login()class Logout:def GET(self):session = web.ctx.environ['beaker.session']try:render = create_render(0)session.invalidate()session.delete()return render.logout()except:session.invalidate()session.delete()render = create_render(0)return render.logout()class index:def GET(self):session = web.ctx.environ['beaker.session']if logged(session) == False:raise web.seeother('/login')else:render = create_render(0)return render.index()if __name__ == "__main__":app.run(session_mw)
https://en.xdnf.cn/q/117828.html

Related Q&A

get text content from p tag

I am trying to get description text content of each block on this page https://twitter.com/search?q=data%20mining&src=typd&vertical=default&f=users. html for p tag looks like<p class=&q…

Python - making a function that would add - between letters

Im trying to make a function, f(x), that would add a "-" between each letter:For example:f("James")should output as:J-a-m-e-s-I would love it if you could use simple python function…

python script keeps converting dates to utc

I have the following:import psycopg2 from openpyxl import Workbook wb = Workbook() wb.active =0 ws = wb.active ws.title = "Repair" ws.sheet_properties.tabColor = "CCFFCC"print(wb.sh…

sklearn tsne with sparse matrix

Im trying to display tsne on a very sparse matrix with precomputed distances values but Im having trouble with it.It boils down to this:row = np.array([0, 2, 2, 0, 1, 2]) col = np.array([0, 0, 1, 2, 2,…

Removing a sublist from a list

I have a list e.g. l1 = [1,2,3,4] and another list: l2 = [1,2,3,4,5,6,7,1,2,3,4]. I would like to check if l1 is a subset in l2 and if it is, then I want to delete these elements from l2 such that l2 …

Python double FOR loops without threading

Basically, I want to make a grid with school subjects and all the test results I got from it, and I want to display about 10 results for every subject.Like this:... ------------------------------------…

Challenging way of counting entries of a file dynamically

I am facing a strange question, which despite of trying many times, i am not able to find the logic and proper code to the problem. I have a file in the format below: aa:bb:cc dd:ee:ff 100 ---------…

NSException on import of matplotlib, kivy in OSX

Im working on some kivy code thats working fine on windows 10, but crashes on osx sierra, Ive isolated that the crash happens when I import kivy.core.window along side matplotlib: import matplotlib mat…

strange behavior with lamba: getattr(obj, x) inside a list [duplicate]

This question already has answers here:Creating functions (or lambdas) in a loop (or comprehension)(9 answers)Closed 11 years ago.In the following example:class A(object):passprop1 = 1prop2 = 2prop3 = …

Detect or Generate Regular Expression from String

I was wondering if there were any Python packages out there that detects a regular expression from a string. Conceptually this is easy enough to do but I wanted to see if there was anyone else who has …