/* * Copyright (c) 2016 OBiBa. All rights reserved. * * This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.obiba.shiro.realm; import javax.annotation.Nullable; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.mgt.SessionsSecurityManager; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.session.Session; import org.apache.shiro.session.SessionException; import org.apache.shiro.session.mgt.DefaultSessionKey; import org.apache.shiro.session.mgt.SessionKey; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.support.DefaultSubjectContext; public abstract class AbstractHttpAuthenticatingRealm extends AuthorizingRealm { @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { Session session = getSession(getSessionId(token)); if(session == null) { throw new IncorrectCredentialsException(); } // Extract the principals from the session PrincipalCollection principals = (PrincipalCollection) session .getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY); if(principals != null) { return createAuthenticationInfo(token, principals); } throw new AuthenticationException(); } @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { return null; } abstract protected AuthenticationInfo createAuthenticationInfo(AuthenticationToken token, PrincipalCollection principals); abstract protected String getSessionId(AuthenticationToken token); @Nullable protected Session getSession(String sessionId) { if(sessionId != null) { SessionManager manager = getSessionManager(); if(manager != null) { SessionKey key = new DefaultSessionKey(sessionId); try { return manager.getSession(key); } catch(SessionException e) { // Means that the session does not exist or has expired. } } } return null; } @Nullable protected SessionManager getSessionManager() { SecurityManager sm = SecurityUtils.getSecurityManager(); return sm instanceof SessionsSecurityManager ? sm : null; } }