Skip to content
Snippets Groups Projects
Commit 50c26fdc authored by sveseli's avatar sveseli
Browse files

login changes due to single sign on implementation

parent 0ec5eceb
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python #!/usr/bin/env python
import cherrypy import cherrypy
import datetime
import urllib import urllib
from cherrypy.lib import httpauth from cherrypy.lib import httpauth
...@@ -14,6 +15,7 @@ from dm.common.exceptions.invalidSession import InvalidSession ...@@ -14,6 +15,7 @@ from dm.common.exceptions.invalidSession import InvalidSession
from dm.common.utility.loggingManager import LoggingManager from dm.common.utility.loggingManager import LoggingManager
from dm.common.service.dmController import DmController from dm.common.service.dmController import DmController
from dm.common.service.auth.authorizationPrincipalManager import AuthorizationPrincipalManager from dm.common.service.auth.authorizationPrincipalManager import AuthorizationPrincipalManager
from dm.common.service.auth.singleSignOnManager import SingleSignOnManager
class LoginController(DmController): class LoginController(DmController):
""" Controller to provide login and logout actions. """ """ Controller to provide login and logout actions. """
...@@ -21,6 +23,7 @@ class LoginController(DmController): ...@@ -21,6 +23,7 @@ class LoginController(DmController):
SESSION_USERNAME_KEY = '_cp_username' SESSION_USERNAME_KEY = '_cp_username'
SESSION_USER_KEY = 'user' SESSION_USER_KEY = 'user'
SESSION_ROLE_KEY = 'role' SESSION_ROLE_KEY = 'role'
ORIGINAL_SESSION_ID_KEY = 'originalid'
INVALID_SESSION_KEY = 'invalidSession' INVALID_SESSION_KEY = 'invalidSession'
_cp_config = { _cp_config = {
...@@ -97,6 +100,14 @@ class LoginController(DmController): ...@@ -97,6 +100,14 @@ class LoginController(DmController):
if principal: if principal:
cherrypy.session[LoginController.SESSION_ROLE_KEY] = principal.getRole() cherrypy.session[LoginController.SESSION_ROLE_KEY] = principal.getRole()
logger.debug('Successful login from user: %s (role: %s)' % (username, principal.getRole())) logger.debug('Successful login from user: %s (role: %s)' % (username, principal.getRole()))
# Try adding to SingleSignOnManager
sessionId = cherrypy.serving.session.id
sessionCache = cherrypy.session.cache
sessionInfo = {LoginController.SESSION_ROLE_KEY : principal.getRole()}
sessionInfo[LoginController.SESSION_USER_KEY] = principal.getUserInfo()
sessionInfo[LoginController.SESSION_USERNAME_KEY] = username
ssoManager = SingleSignOnManager.getInstance()
ssoManager.addSession(sessionId, sessionInfo)
else: else:
logger.debug('Login denied for user: %s' % username) logger.debug('Login denied for user: %s' % username)
username = cherrypy.session.get(LoginController.SESSION_USERNAME_KEY, None) username = cherrypy.session.get(LoginController.SESSION_USERNAME_KEY, None)
...@@ -128,17 +139,37 @@ class LoginController(DmController): ...@@ -128,17 +139,37 @@ class LoginController(DmController):
sessionId = cherrypy.serving.session.id sessionId = cherrypy.serving.session.id
sessionCache = cherrypy.session.cache sessionCache = cherrypy.session.cache
# If session cache does not have current session id, reuse original
# session id
if not sessionCache.has_key(sessionId) and cherrypy.serving.session.__dict__.has_key(LoginController.ORIGINAL_SESSION_ID_KEY):
logger.debug('Reusing original session id: %s' % sessionId)
sessionId = cherrypy.serving.session.__dict__.get(LoginController.ORIGINAL_SESSION_ID_KEY)
#logger.debug('Session: %s' % ((cherrypy.session.__dict__))) #logger.debug('Session: %s' % ((cherrypy.session.__dict__)))
#logger.debug('Session cache length: %s' % (len(sessionCache))) logger.debug('Session cache length: %s' % (len(sessionCache)))
#logger.debug('Session cache: %s' % (sessionCache)) #logger.debug('Session cache: %s' % (sessionCache))
# Check session. # Check session.
if not sessionCache.has_key(sessionId): # Try SingleSignOnManager first
ssoManager = SingleSignOnManager.getInstance()
# SSO Manager returns session info
sessionInfo = ssoManager.checkSession(sessionId)
if not sessionInfo:
# Cache has tuple (sessionInfo, updateTime)
sessionTuple = sessionCache.get(sessionId)
if sessionTuple:
sessionInfo = sessionTuple[0]
else:
logger.debug('Retrieved session %s from SSO Manager' % sessionId)
sessionCache[sessionId] = (sessionInfo, datetime.datetime.now())
if not sessionInfo:
errorMsg = 'Invalid or expired session id: %s.' % sessionId errorMsg = 'Invalid or expired session id: %s.' % sessionId
logger.debug(errorMsg) logger.debug(errorMsg)
raise DmHttpError(dmHttpStatus.DM_HTTP_UNAUTHORIZED, 'User Not Authorized', InvalidSession(errorMsg)) raise DmHttpError(dmHttpStatus.DM_HTTP_UNAUTHORIZED, 'User Not Authorized', InvalidSession(errorMsg))
username = cherrypy.session.get(LoginController.SESSION_USERNAME_KEY) username = sessionInfo.get(LoginController.SESSION_USERNAME_KEY)
cherrypy.session[LoginController.SESSION_ROLE_KEY] = sessionInfo[LoginController.SESSION_ROLE_KEY]
logger.debug('Session id %s is valid (username: %s)' % (sessionId, username)) logger.debug('Session id %s is valid (username: %s)' % (sessionId, username))
if username: if username:
cherrypy.request.login = username cherrypy.request.login = username
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment