/* * Copyright (C) 2011 Rhegium Team * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.rhegium.internal.security.authenticator; import java.util.Locale; import java.util.Set; import org.rhegium.api.i18n.LanguageService; import org.rhegium.api.security.Principal; import org.rhegium.api.security.SecurityService; import org.rhegium.api.security.UserSession; import org.rhegium.api.security.authenticator.AuthenticationContext; import org.rhegium.api.security.authenticator.AuthenticationService; import org.rhegium.api.security.authenticator.Authenticator; import org.rhegium.api.security.authenticator.HashAuthenticationContext; import org.rhegium.internal.security.DefaultUserSession; import com.google.inject.Inject; public class DefaultAuthenticationService implements AuthenticationService { @Inject private SecurityService securityService; @Inject private Set<Authenticator> authenticators; @Inject private LanguageService languageService; @Override public <T> UserSession<T> authenticate(AuthenticationContext context, T session) { // Build actual UserSession UserSession<T> userSession = buildUserSession(context, session); // Save UserSession into HttpSession for later use securityService.setUserSession(userSession); return userSession; } @Override public <T> UserSession<T> logout(T session) { // Build illegal UserSession to force relogin UserSession<T> userSession = new DefaultUserSession<T>(null, session, languageService.getDefaultLocale(), securityService); // Remove UserSession from ThreadLocal securityService.setUserSession(userSession); return userSession; } @Override public AuthenticationContext buildAuthenticationContext() { return new HashAuthenticationContext(); } protected <T> UserSession<T> buildUserSession(AuthenticationContext context, T session) { final UserSession<T> userSession = findAlreadyLoggedInUser(); if (userSession != null && userSession.getPrincipal() != null) { return userSession; } PrincipalResult principalResult = authenticate0(context); Principal principal = principalResult != null ? principalResult.getPrincipal() : null; boolean autoLogin = principalResult != null ? principalResult.isAutoLogin() : false; Locale locale = languageService.getDefaultLocale(); return new DefaultUserSession<T>(principal, session, locale, autoLogin, securityService); } protected <T> UserSession<T> findAlreadyLoggedInUser() { return null; } private PrincipalResult authenticate0(AuthenticationContext context) { for (Authenticator authenticator : authenticators) { Principal principal = authenticator.authenticate(context); if (principal != null) { return new PrincipalResult(principal, authenticator.isAutoLoginAuthenticator()); } } return null; } private class PrincipalResult { private final Principal principal; private final boolean autoLogin; PrincipalResult(Principal principal, boolean autoLogin) { this.principal = principal; this.autoLogin = autoLogin; } public Principal getPrincipal() { return principal; } public boolean isAutoLogin() { return autoLogin; } } }