001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: */
017: package org.apache.jetspeed.security.impl;
018:
019: import java.security.Principal;
020: import java.util.HashSet;
021: import java.util.Set;
022:
023: import javax.security.auth.Subject;
024:
025: import org.apache.jetspeed.administration.PortalAuthenticationConfiguration;
026: import org.apache.jetspeed.pipeline.valve.SecurityValve;
027: import org.apache.jetspeed.profiler.Profiler;
028: import org.apache.jetspeed.request.RequestContext;
029: import org.apache.jetspeed.security.SecurityException;
030: import org.apache.jetspeed.security.SecurityHelper;
031: import org.apache.jetspeed.security.User;
032: import org.apache.jetspeed.security.UserManager;
033: import org.apache.jetspeed.security.UserPrincipal;
034: import org.apache.jetspeed.statistics.PortalStatistics;
035:
036: /**
037: * SecurityValve
038: *
039: * @author <a href="mailto:taylor@apache.org">David Sean Taylor </a>
040: * @author <a href="mailto:rwatler@finali.com">Randy Walter </a>
041: * @author <a href="mailto:weaver@apache.org">Scott T. Weaver</a>
042: * @version $Id: SecurityValveImpl.java 544250 2007-06-04 20:30:43Z taylor $
043: */
044: public class SecurityValveImpl extends AbstractSecurityValve implements
045: SecurityValve {
046: private UserManager userMgr;
047: private PortalStatistics statistics;
048:
049: public SecurityValveImpl(
050: Profiler profiler,
051: UserManager userMgr,
052: PortalStatistics statistics,
053: PortalAuthenticationConfiguration authenticationConfiguration) {
054: this .userMgr = userMgr;
055: this .statistics = statistics;
056: this .authenticationConfiguration = authenticationConfiguration;
057: }
058:
059: public SecurityValveImpl(Profiler profiler, UserManager userMgr,
060: PortalStatistics statistics) {
061: this .userMgr = userMgr;
062: this .statistics = statistics;
063: }
064:
065: public SecurityValveImpl(Profiler profiler, UserManager userMgr) {
066: this .userMgr = userMgr;
067: this .statistics = null;
068: }
069:
070: public String toString() {
071: return "SecurityValve";
072: }
073:
074: /**
075: *
076: * <p>
077: * getSubject
078: * </p>
079: * Check for previously established session subject and
080: * invalidate if subject and current user principals do
081: * not match
082: * @param request
083: * @return
084: * @throws Exception
085: */
086: protected final Subject getSubject(RequestContext request)
087: throws Exception {
088: Principal userPrincipal = getUserPrincipal(request);
089:
090: Subject subject = getSubjectFromSession(request);
091: if (subject != null) {
092: Principal subjectUserPrincipal = SecurityHelper
093: .getPrincipal(subject, UserPrincipal.class);
094: if ((subjectUserPrincipal == null)
095: || !subjectUserPrincipal.getName().equals(
096: getUserPrincipal(request).getName())) {
097: subject = null;
098: }
099: }
100:
101: // create new session subject for user principal if required
102: if (subject == null) {
103: // attempt to get complete subject for user principal
104: // from user manager
105: try {
106: User user = userMgr.getUser(userPrincipal.getName());
107: if (user != null) {
108: subject = user.getSubject();
109: }
110: } catch (SecurityException sex) {
111: subject = null;
112: }
113:
114: // if subject not available, generate default subject using
115: // request or default profiler anonymous user principal
116: if (subject == null) {
117: Set principals = new HashSet();
118: principals.add(userPrincipal);
119: subject = new Subject(true, principals, new HashSet(),
120: new HashSet());
121: }
122:
123: // create a new statistics *user* session
124: if (statistics != null) {
125: statistics.logUserLogin(request, 0);
126: }
127: // put IP address in session for logout
128: request.setSessionAttribute(IP_ADDRESS, request
129: .getRequest().getRemoteAddr());
130: }
131: return subject;
132: }
133:
134: /**
135: *
136: * <p>
137: * getUserPrincipal
138: * </p>
139: * Aaccess request user principal if defined or default
140: * to profiler anonymous user
141: * @param request
142: * @return
143: */
144: protected Principal getUserPrincipal(RequestContext request)
145: throws Exception {
146: Principal userPrincipal = request.getRequest()
147: .getUserPrincipal();
148: if (userPrincipal == null) {
149: userPrincipal = new UserPrincipalImpl(userMgr
150: .getAnonymousUser());
151: }
152: return userPrincipal;
153: }
154:
155: }
|