1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one 3 * or more contributor license agreements. See the NOTICE file 4 * distributed with this work for additional information 5 * regarding copyright ownership. The ASF licenses this file 6 * to you under the Apache License, Version 2.0 (the 7 * "License"); you may not use this file except in compliance 8 * with the License. You may obtain a copy of the License at 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, 13 * software distributed under the License is distributed on an 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 * KIND, either express or implied. See the License for the 16 * specific language governing permissions and limitations 17 * under the License. 18 */ 19 package org.apache.shiro.subject; 20 21 import org.apache.shiro.authc.AuthenticationInfo; 22 import org.apache.shiro.authc.AuthenticationToken; 23 import org.apache.shiro.mgt.SecurityManager; 24 import org.apache.shiro.session.Session; 25 26 import java.io.Serializable; 27 import java.util.Map; 28 29 /** 30 * A {@code SubjectContext} is a 'bucket' of data presented to a {@link SecurityManager} which interprets 31 * this data to construct {@link org.apache.shiro.subject.Subject Subject} instances. It is essentially a Map of data 32 * with a few additional type-safe methods for easy retrieval of objects commonly used to construct Subject instances. 33 * <p/> 34 * While this interface contains type-safe setters and getters for common data types, the map can contain anything 35 * additional that might be needed by the {@link SecurityManager} or 36 * {@link org.apache.shiro.mgt.SubjectFactory SubjectFactory} implementation to construct {@code Subject} instances. 37 * <h2>Data Resolution</h2> 38 * The {@link SubjectContext} interface also allows for heuristic resolution of data used to construct a subject 39 * instance. That is, if an attribute has not been explicitly provided via a setter method, the {@code resolve*} 40 * methods can use heuristics to obtain that data in another way from other attributes. 41 * <p/> 42 * For example, if one calls {@link #getPrincipals()} and no principals are returned, perhaps the principals exist 43 * in the {@link #getSession() session} or another attribute in the context. The {@link #resolvePrincipals()} will know 44 * how to resolve the principals based on heuristics. If the {@code resolve*} methods return {@code null} then the 45 * data could not be achieved by any heuristics and must be considered as not available in the context. 46 * <p/> 47 * The general idea is that the normal getters can be called to see if the value was explicitly set. The 48 * {@code resolve*} methods should be used when actually constructing the {@code Subject} instance to ensure the most 49 * specific/accurate data can be used. 50 * <p/> 51 * <b>USAGE</b>: Most Shiro end-users will never use a {@code SubjectContext} instance directly and instead will use a 52 * {@link Subject.Builder} (which internally uses a {@code SubjectContext}) and build {@code Subject} instances that 53 * way. 54 * 55 * @see org.apache.shiro.mgt.SecurityManager#createSubject SecurityManager.createSubject 56 * @see org.apache.shiro.mgt.SubjectFactory SubjectFactory 57 * @since 1.0 58 */ 59 public interface SubjectContext extends Map<String, Object> { 60 61 /** 62 * Returns the SecurityManager instance that should be used to back the constructed {@link Subject} instance or 63 * {@code null} if one has not yet been provided to this context. 64 * 65 * @return the SecurityManager instance that should be used to back the constructed {@link Subject} instance or 66 * {@code null} if one has not yet been provided to this context. 67 */ 68 SecurityManager getSecurityManager(); 69 70 /** 71 * Sets the SecurityManager instance that should be used to back the constructed {@link Subject} instance 72 * (typically used to support {@link org.apache.shiro.subject.support.DelegatingSubject DelegatingSubject} implementations). 73 * 74 * @param securityManager the SecurityManager instance that should be used to back the constructed {@link Subject} 75 * instance. 76 */ 77 void setSecurityManager(SecurityManager securityManager); 78 79 /** 80 * Resolves the {@code SecurityManager} instance that should be used to back the constructed {@link Subject} 81 * instance (typically used to support {@link org.apache.shiro.subject.support.DelegatingSubject DelegatingSubject} implementations). 82 * 83 * @return the {@code SecurityManager} instance that should be used to back the constructed {@link Subject} 84 * instance 85 */ 86 SecurityManager resolveSecurityManager(); 87 88 /** 89 * Returns the session id of the session that should be associated with the constructed {@link Subject} instance. 90 * <p/> 91 * The construction process is expected to resolve the session with the specified id and then construct the Subject 92 * instance based on the resolved session. 93 * 94 * @return the session id of the session that should be associated with the constructed {@link Subject} instance. 95 */ 96 Serializable getSessionId(); 97 98 /** 99 * Sets the session id of the session that should be associated with the constructed {@link Subject} instance. 100 * <p/> 101 * The construction process is expected to resolve the session with the specified id and then construct the Subject 102 * instance based on the resolved session. 103 * 104 * @param sessionId the session id of the session that should be associated with the constructed {@link Subject} 105 * instance. 106 */ 107 void setSessionId(Serializable sessionId); 108 109 /** 110 * Returns any existing {@code Subject} that may be in use at the time the new {@code Subject} instance is 111 * being created. 112 * <p/> 113 * This is typically used in the case where the existing {@code Subject} instance returned by 114 * this method is unauthenticated and a new {@code Subject} instance is being created to reflect a successful 115 * authentication - you want to return most of the state of the previous {@code Subject} instance when creating the 116 * newly authenticated instance. 117 * 118 * @return any existing {@code Subject} that may be in use at the time the new {@code Subject} instance is 119 * being created. 120 */ 121 Subject getSubject(); 122 123 /** 124 * Sets the existing {@code Subject} that may be in use at the time the new {@code Subject} instance is 125 * being created. 126 * <p/> 127 * This is typically used in the case where the existing {@code Subject} instance returned by 128 * this method is unauthenticated and a new {@code Subject} instance is being created to reflect a successful 129 * authentication - you want to return most of the state of the previous {@code Subject} instance when creating the 130 * newly authenticated instance. 131 * 132 * @param subject the existing {@code Subject} that may be in use at the time the new {@code Subject} instance is 133 * being created. 134 */ 135 void setSubject(Subject subject); 136 137 /** 138 * Returns the principals (aka identity) that the constructed {@code Subject} should reflect. 139 * 140 * @return the principals (aka identity) that the constructed {@code Subject} should reflect. 141 */ 142 PrincipalCollection getPrincipals(); 143 144 PrincipalCollection resolvePrincipals(); 145 146 /** 147 * Sets the principals (aka identity) that the constructed {@code Subject} should reflect. 148 * 149 * @param principals the principals (aka identity) that the constructed {@code Subject} should reflect. 150 */ 151 void setPrincipals(PrincipalCollection principals); 152 153 /** 154 * Returns the {@code Session} to use when building the {@code Subject} instance. Note that it is more 155 * common to specify a {@link #setSessionId sessionId} to acquire the desired session rather than having to 156 * construct a {@code Session} to be returned by this method. 157 * 158 * @return the {@code Session} to use when building the {@code Subject} instance. 159 */ 160 Session getSession(); 161 162 /** 163 * Sets the {@code Session} to use when building the {@code Subject} instance. Note that it is more 164 * common to specify a {@link #setSessionId sessionId} to automatically resolve the desired session rather than 165 * constructing a {@code Session} to call this method. 166 * 167 * @param session the {@code Session} to use when building the {@code Subject} instance. 168 */ 169 void setSession(Session session); 170 171 Session resolveSession(); 172 173 /** 174 * Returns {@code true} if the constructed {@code Subject} should be considered authenticated, {@code false} 175 * otherwise. Be careful setting this value to {@code true} - you should know what you are doing and have a good 176 * reason for ignoring Shiro's default authentication state mechanisms. 177 * 178 * @return {@code true} if the constructed {@code Subject} should be considered authenticated, {@code false} 179 * otherwise. 180 */ 181 boolean isAuthenticated(); 182 183 /** 184 * Sets whether or not the constructed {@code Subject} instance should be considered as authenticated. Be careful 185 * when specifying {@code true} - you should know what you are doing and have a good reason for ignoring Shiro's 186 * default authentication state mechanisms. 187 * 188 * @param authc whether or not the constructed {@code Subject} instance should be considered as authenticated. 189 */ 190 void setAuthenticated(boolean authc); 191 192 /** 193 * Returns {@code true} if the constructed {@code Subject} should be allowed to create a session, {@code false} 194 * otherwise. Shiro's configuration defaults to {@code true} as most applications find value in Sessions. 195 * 196 * @return {@code true} if the constructed {@code Subject} should be allowed to create sessions, {@code false} 197 * otherwise. 198 * @since 1.2 199 */ 200 boolean isSessionCreationEnabled(); 201 202 /** 203 * Sets whether or not the constructed {@code Subject} instance should be allowed to create a session, 204 * {@code false} otherwise. 205 * 206 * @param enabled whether or not the constructed {@code Subject} instance should be allowed to create a session, 207 * {@code false} otherwise. 208 * @since 1.2 209 */ 210 void setSessionCreationEnabled(boolean enabled); 211 212 boolean resolveAuthenticated(); 213 214 AuthenticationInfo getAuthenticationInfo(); 215 216 void setAuthenticationInfo(AuthenticationInfo info); 217 218 AuthenticationToken getAuthenticationToken(); 219 220 void setAuthenticationToken(AuthenticationToken token); 221 222 /** 223 * Returns the host name or IP that should reflect the constructed {@code Subject}'s originating location. 224 * 225 * @return the host name or IP that should reflect the constructed {@code Subject}'s originating location. 226 */ 227 String getHost(); 228 229 /** 230 * Sets the host name or IP that should reflect the constructed {@code Subject}'s originating location. 231 * 232 * @param host the host name or IP that should reflect the constructed {@code Subject}'s originating location. 233 */ 234 void setHost(String host); 235 236 String resolveHost(); 237 }