Classes in this File | Line Coverage | Branch Coverage | Complexity | ||||
SimpleAccount |
|
| 1.3333333333333333;1.333 |
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.authc; | |
20 | ||
21 | import org.apache.shiro.authz.Permission; | |
22 | import org.apache.shiro.authz.SimpleAuthorizationInfo; | |
23 | import org.apache.shiro.subject.PrincipalCollection; | |
24 | import org.apache.shiro.subject.SimplePrincipalCollection; | |
25 | import org.apache.shiro.util.ByteSource; | |
26 | ||
27 | import java.io.Serializable; | |
28 | import java.util.Collection; | |
29 | import java.util.Set; | |
30 | ||
31 | ||
32 | /** | |
33 | * Simple implementation of the {@link org.apache.shiro.authc.Account} interface that | |
34 | * contains principal and credential and authorization information (roles and permissions) as instance variables and | |
35 | * exposes them via getters and setters using standard JavaBean notation. | |
36 | * | |
37 | * @since 0.1 | |
38 | */ | |
39 | public class SimpleAccount implements Account, MergableAuthenticationInfo, SaltedAuthenticationInfo, Serializable { | |
40 | ||
41 | /*-------------------------------------------- | |
42 | | I N S T A N C E V A R I A B L E S | | |
43 | ============================================*/ | |
44 | /** | |
45 | * The authentication information (principals and credentials) for this account. | |
46 | */ | |
47 | private SimpleAuthenticationInfo authcInfo; | |
48 | ||
49 | /** | |
50 | * The authorization information for this account. | |
51 | */ | |
52 | private SimpleAuthorizationInfo authzInfo; | |
53 | ||
54 | /** | |
55 | * Indicates this account is locked. This isn't honored by all <tt>Realms</tt> but is honored by | |
56 | * {@link org.apache.shiro.realm.SimpleAccountRealm}. | |
57 | */ | |
58 | private boolean locked; | |
59 | ||
60 | /** | |
61 | * Indicates credentials on this account are expired. This isn't honored by all <tt>Realms</tt> but is honored by | |
62 | * {@link org.apache.shiro.realm.SimpleAccountRealm}. | |
63 | */ | |
64 | private boolean credentialsExpired; | |
65 | ||
66 | /*-------------------------------------------- | |
67 | | C O N S T R U C T O R S | | |
68 | ============================================*/ | |
69 | ||
70 | /** | |
71 | * Default no-argument constructor. | |
72 | */ | |
73 | 0 | public SimpleAccount() { |
74 | 0 | } |
75 | ||
76 | /** | |
77 | * Constructs a SimpleAccount instance for the specified realm with the given principals and credentials. | |
78 | * | |
79 | * @param principal the 'primary' identifying attribute of the account, for example, a user id or username. | |
80 | * @param credentials the credentials that verify identity for the account | |
81 | * @param realmName the name of the realm that accesses this account data | |
82 | */ | |
83 | public SimpleAccount(Object principal, Object credentials, String realmName) { | |
84 | 80 | this(principal instanceof PrincipalCollection ? (PrincipalCollection) principal : new SimplePrincipalCollection(principal, realmName), credentials); |
85 | 80 | } |
86 | ||
87 | /** | |
88 | * Constructs a SimpleAccount instance for the specified realm with the given principals, hashedCredentials and | |
89 | * credentials salt used when hashing the credentials. | |
90 | * | |
91 | * @param principal the 'primary' identifying attribute of the account, for example, a user id or username. | |
92 | * @param hashedCredentials the credentials that verify identity for the account | |
93 | * @param credentialsSalt the salt used when hashing the credentials | |
94 | * @param realmName the name of the realm that accesses this account data | |
95 | * @see org.apache.shiro.authc.credential.HashedCredentialsMatcher HashedCredentialsMatcher | |
96 | * @since 1.1 | |
97 | */ | |
98 | public SimpleAccount(Object principal, Object hashedCredentials, ByteSource credentialsSalt, String realmName) { | |
99 | 0 | this(principal instanceof PrincipalCollection ? (PrincipalCollection) principal : new SimplePrincipalCollection(principal, realmName), |
100 | hashedCredentials, credentialsSalt); | |
101 | 0 | } |
102 | ||
103 | /** | |
104 | * Constructs a SimpleAccount instance for the specified realm with the given principals and credentials. | |
105 | * | |
106 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
107 | * account's 'primary' identifying attribute, for example, a user id or username. | |
108 | * @param credentials the credentials that verify identity for the account | |
109 | * @param realmName the name of the realm that accesses this account data | |
110 | */ | |
111 | public SimpleAccount(Collection principals, Object credentials, String realmName) { | |
112 | 0 | this(new SimplePrincipalCollection(principals, realmName), credentials); |
113 | 0 | } |
114 | ||
115 | /** | |
116 | * Constructs a SimpleAccount instance for the specified principals and credentials. | |
117 | * | |
118 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
119 | * account's 'primary' identifying attribute, for example, a user id or username. | |
120 | * @param credentials the credentials that verify identity for the account | |
121 | */ | |
122 | 80 | public SimpleAccount(PrincipalCollection principals, Object credentials) { |
123 | 80 | this.authcInfo = new SimpleAuthenticationInfo(principals, credentials); |
124 | 80 | this.authzInfo = new SimpleAuthorizationInfo(); |
125 | 80 | } |
126 | ||
127 | /** | |
128 | * Constructs a SimpleAccount instance for the specified principals and credentials. | |
129 | * | |
130 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
131 | * account's 'primary' identifying attribute, for example, a user id or username. | |
132 | * @param hashedCredentials the hashed credentials that verify identity for the account | |
133 | * @param credentialsSalt the salt used when hashing the credentials | |
134 | * @see org.apache.shiro.authc.credential.HashedCredentialsMatcher HashedCredentialsMatcher | |
135 | * @since 1.1 | |
136 | */ | |
137 | 0 | public SimpleAccount(PrincipalCollection principals, Object hashedCredentials, ByteSource credentialsSalt) { |
138 | 0 | this.authcInfo = new SimpleAuthenticationInfo(principals, hashedCredentials, credentialsSalt); |
139 | 0 | this.authzInfo = new SimpleAuthorizationInfo(); |
140 | 0 | } |
141 | ||
142 | /** | |
143 | * Constructs a SimpleAccount instance for the specified principals and credentials, with the assigned roles. | |
144 | * | |
145 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
146 | * account's 'primary' identifying attribute, for example, a user id or username. | |
147 | * @param credentials the credentials that verify identity for the account | |
148 | * @param roles the names of the roles assigned to this account. | |
149 | */ | |
150 | 0 | public SimpleAccount(PrincipalCollection principals, Object credentials, Set<String> roles) { |
151 | 0 | this.authcInfo = new SimpleAuthenticationInfo(principals, credentials); |
152 | 0 | this.authzInfo = new SimpleAuthorizationInfo(roles); |
153 | 0 | } |
154 | ||
155 | /** | |
156 | * Constructs a SimpleAccount instance for the specified realm with the given principal and credentials, with the | |
157 | * the assigned roles and permissions. | |
158 | * | |
159 | * @param principal the 'primary' identifying attributes of the account, for example, a user id or username. | |
160 | * @param credentials the credentials that verify identity for the account | |
161 | * @param realmName the name of the realm that accesses this account data | |
162 | * @param roleNames the names of the roles assigned to this account. | |
163 | * @param permissions the permissions assigned to this account directly (not those assigned to any of the realms). | |
164 | */ | |
165 | 0 | public SimpleAccount(Object principal, Object credentials, String realmName, Set<String> roleNames, Set<Permission> permissions) { |
166 | 0 | this.authcInfo = new SimpleAuthenticationInfo(new SimplePrincipalCollection(principal, realmName), credentials); |
167 | 0 | this.authzInfo = new SimpleAuthorizationInfo(roleNames); |
168 | 0 | this.authzInfo.setObjectPermissions(permissions); |
169 | 0 | } |
170 | ||
171 | /** | |
172 | * Constructs a SimpleAccount instance for the specified realm with the given principals and credentials, with the | |
173 | * the assigned roles and permissions. | |
174 | * | |
175 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
176 | * account's 'primary' identifying attribute, for example, a user id or username. | |
177 | * @param credentials the credentials that verify identity for the account | |
178 | * @param realmName the name of the realm that accesses this account data | |
179 | * @param roleNames the names of the roles assigned to this account. | |
180 | * @param permissions the permissions assigned to this account directly (not those assigned to any of the realms). | |
181 | */ | |
182 | 0 | public SimpleAccount(Collection principals, Object credentials, String realmName, Set<String> roleNames, Set<Permission> permissions) { |
183 | 0 | this.authcInfo = new SimpleAuthenticationInfo(new SimplePrincipalCollection(principals, realmName), credentials); |
184 | 0 | this.authzInfo = new SimpleAuthorizationInfo(roleNames); |
185 | 0 | this.authzInfo.setObjectPermissions(permissions); |
186 | 0 | } |
187 | ||
188 | /** | |
189 | * Constructs a SimpleAccount instance from the given principals and credentials, with the | |
190 | * the assigned roles and permissions. | |
191 | * | |
192 | * @param principals the identifying attributes of the account, at least one of which should be considered the | |
193 | * account's 'primary' identifying attribute, for example, a user id or username. | |
194 | * @param credentials the credentials that verify identity for the account | |
195 | * @param roleNames the names of the roles assigned to this account. | |
196 | * @param permissions the permissions assigned to this account directly (not those assigned to any of the realms). | |
197 | */ | |
198 | 0 | public SimpleAccount(PrincipalCollection principals, Object credentials, Set<String> roleNames, Set<Permission> permissions) { |
199 | 0 | this.authcInfo = new SimpleAuthenticationInfo(principals, credentials); |
200 | 0 | this.authzInfo = new SimpleAuthorizationInfo(roleNames); |
201 | 0 | this.authzInfo.setObjectPermissions(permissions); |
202 | 0 | } |
203 | ||
204 | /*-------------------------------------------- | |
205 | | A C C E S S O R S / M O D I F I E R S | | |
206 | ============================================*/ | |
207 | ||
208 | /** | |
209 | * Returns the principals, aka the identifying attributes (username, user id, first name, last name, etc) of this | |
210 | * Account. | |
211 | * | |
212 | * @return all the principals, aka the identifying attributes, of this Account. | |
213 | */ | |
214 | public PrincipalCollection getPrincipals() { | |
215 | 292 | return authcInfo.getPrincipals(); |
216 | } | |
217 | ||
218 | /** | |
219 | * Sets the principals, aka the identifying attributes (username, user id, first name, last name, etc) of this | |
220 | * Account. | |
221 | * | |
222 | * @param principals all the principals, aka the identifying attributes, of this Account. | |
223 | * @see Account#getPrincipals() | |
224 | */ | |
225 | public void setPrincipals(PrincipalCollection principals) { | |
226 | 2 | this.authcInfo.setPrincipals(principals); |
227 | 2 | } |
228 | ||
229 | ||
230 | /** | |
231 | * Simply returns <code>this.authcInfo.getCredentials</code>. The <code>authcInfo</code> attribute is constructed | |
232 | * via the constructors to wrap the input arguments. | |
233 | * | |
234 | * @return this Account's credentials. | |
235 | */ | |
236 | public Object getCredentials() { | |
237 | 20 | return authcInfo.getCredentials(); |
238 | } | |
239 | ||
240 | /** | |
241 | * Sets this Account's credentials that verify one or more of the Account's | |
242 | * {@link #getPrincipals() principals}, such as a password or private key. | |
243 | * | |
244 | * @param credentials the credentials associated with this Account that verify one or more of the Account principals. | |
245 | * @see org.apache.shiro.authc.Account#getCredentials() | |
246 | */ | |
247 | public void setCredentials(Object credentials) { | |
248 | 74 | this.authcInfo.setCredentials(credentials); |
249 | 74 | } |
250 | ||
251 | /** | |
252 | * Returns the salt used to hash this Account's credentials (eg for password hashing), or {@code null} if no salt | |
253 | * was used or credentials were not hashed at all. | |
254 | * | |
255 | * @return the salt used to hash this Account's credentials (eg for password hashing), or {@code null} if no salt | |
256 | * was used or credentials were not hashed at all. | |
257 | * @since 1.1 | |
258 | */ | |
259 | public ByteSource getCredentialsSalt() { | |
260 | 2 | return this.authcInfo.getCredentialsSalt(); |
261 | } | |
262 | ||
263 | /** | |
264 | * Sets the salt to use to hash this Account's credentials (eg for password hashing), or {@code null} if no salt | |
265 | * is used or credentials are not hashed at all. | |
266 | * | |
267 | * @param salt the salt to use to hash this Account's credentials (eg for password hashing), or {@code null} if no | |
268 | * salt is used or credentials are not hashed at all. | |
269 | * @since 1.1 | |
270 | */ | |
271 | public void setCredentialsSalt(ByteSource salt) { | |
272 | 0 | this.authcInfo.setCredentialsSalt(salt); |
273 | 0 | } |
274 | ||
275 | /** | |
276 | * Returns <code>this.authzInfo.getRoles();</code> | |
277 | * | |
278 | * @return the Account's assigned roles. | |
279 | */ | |
280 | public Collection<String> getRoles() { | |
281 | 108 | return authzInfo.getRoles(); |
282 | } | |
283 | ||
284 | /** | |
285 | * Sets the Account's assigned roles. Simply calls <code>this.authzInfo.setRoles(roles)</code>. | |
286 | * | |
287 | * @param roles the Account's assigned roles. | |
288 | * @see Account#getRoles() | |
289 | */ | |
290 | public void setRoles(Set<String> roles) { | |
291 | 22 | this.authzInfo.setRoles(roles); |
292 | 22 | } |
293 | ||
294 | /** | |
295 | * Adds a role to this Account's set of assigned roles. Simply delegates to | |
296 | * <code>this.authzInfo.addRole(role)</code>. | |
297 | * | |
298 | * @param role a role to assign to this Account. | |
299 | */ | |
300 | public void addRole(String role) { | |
301 | 76 | this.authzInfo.addRole(role); |
302 | 76 | } |
303 | ||
304 | /** | |
305 | * Adds one or more roles to this Account's set of assigned roles. Simply delegates to | |
306 | * <code>this.authzInfo.addRoles(roles)</code>. | |
307 | * | |
308 | * @param roles one or more roles to assign to this Account. | |
309 | */ | |
310 | public void addRole(Collection<String> roles) { | |
311 | 0 | this.authzInfo.addRoles(roles); |
312 | 0 | } |
313 | ||
314 | /** | |
315 | * Returns all String-based permissions assigned to this Account. Simply delegates to | |
316 | * <code>this.authzInfo.getStringPermissions()</code>. | |
317 | * | |
318 | * @return all String-based permissions assigned to this Account. | |
319 | */ | |
320 | public Collection<String> getStringPermissions() { | |
321 | 12 | return authzInfo.getStringPermissions(); |
322 | } | |
323 | ||
324 | /** | |
325 | * Sets the String-based permissions assigned to this Account. Simply delegates to | |
326 | * <code>this.authzInfo.setStringPermissions(permissions)</code>. | |
327 | * | |
328 | * @param permissions all String-based permissions assigned to this Account. | |
329 | * @see org.apache.shiro.authc.Account#getStringPermissions() | |
330 | */ | |
331 | public void setStringPermissions(Set<String> permissions) { | |
332 | 0 | this.authzInfo.setStringPermissions(permissions); |
333 | 0 | } |
334 | ||
335 | /** | |
336 | * Assigns a String-based permission directly to this Account (not to any of its realms). | |
337 | * | |
338 | * @param permission the String-based permission to assign. | |
339 | */ | |
340 | public void addStringPermission(String permission) { | |
341 | 0 | this.authzInfo.addStringPermission(permission); |
342 | 0 | } |
343 | ||
344 | /** | |
345 | * Assigns one or more string-based permissions directly to this Account (not to any of its realms). | |
346 | * | |
347 | * @param permissions one or more String-based permissions to assign. | |
348 | */ | |
349 | public void addStringPermissions(Collection<String> permissions) { | |
350 | 0 | this.authzInfo.addStringPermissions(permissions); |
351 | 0 | } |
352 | ||
353 | /** | |
354 | * Returns all object-based permissions assigned directly to this Account (not any of its realms). | |
355 | * | |
356 | * @return all object-based permissions assigned directly to this Account (not any of its realms). | |
357 | */ | |
358 | public Collection<Permission> getObjectPermissions() { | |
359 | 12 | return authzInfo.getObjectPermissions(); |
360 | } | |
361 | ||
362 | /** | |
363 | * Sets all object-based permissions assigned directly to this Account (not any of its realms). | |
364 | * | |
365 | * @param permissions the object-based permissions to assign directly to this Account. | |
366 | */ | |
367 | public void setObjectPermissions(Set<Permission> permissions) { | |
368 | 0 | this.authzInfo.setObjectPermissions(permissions); |
369 | 0 | } |
370 | ||
371 | /** | |
372 | * Assigns an object-based permission directly to this Account (not any of its realms). | |
373 | * | |
374 | * @param permission the object-based permission to assign directly to this Account (not any of its realms). | |
375 | */ | |
376 | public void addObjectPermission(Permission permission) { | |
377 | 0 | this.authzInfo.addObjectPermission(permission); |
378 | 0 | } |
379 | ||
380 | /** | |
381 | * Assigns one or more object-based permissions directly to this Account (not any of its realms). | |
382 | * | |
383 | * @param permissions one or more object-based permissions to assign directly to this Account (not any of its realms). | |
384 | */ | |
385 | public void addObjectPermissions(Collection<Permission> permissions) { | |
386 | 48 | this.authzInfo.addObjectPermissions(permissions); |
387 | 48 | } |
388 | ||
389 | /** | |
390 | * Returns <code>true</code> if this Account is locked and thus cannot be used to login, <code>false</code> otherwise. | |
391 | * | |
392 | * @return <code>true</code> if this Account is locked and thus cannot be used to login, <code>false</code> otherwise. | |
393 | */ | |
394 | public boolean isLocked() { | |
395 | 16 | return locked; |
396 | } | |
397 | ||
398 | /** | |
399 | * Sets whether or not the account is locked and can be used to login. | |
400 | * | |
401 | * @param locked <code>true</code> if this Account is locked and thus cannot be used to login, <code>false</code> otherwise. | |
402 | */ | |
403 | public void setLocked(boolean locked) { | |
404 | 0 | this.locked = locked; |
405 | 0 | } |
406 | ||
407 | /** | |
408 | * Returns whether or not the Account's credentials are expired. This usually indicates that the Subject or an application | |
409 | * administrator would need to change the credentials before the account could be used. | |
410 | * | |
411 | * @return whether or not the Account's credentials are expired. | |
412 | */ | |
413 | public boolean isCredentialsExpired() { | |
414 | 16 | return credentialsExpired; |
415 | } | |
416 | ||
417 | /** | |
418 | * Sets whether or not the Account's credentials are expired. A <code>true</code> value indicates that the Subject | |
419 | * or application administrator would need to change their credentials before the account could be used. | |
420 | * | |
421 | * @param credentialsExpired <code>true</code> if this Account's credentials are expired and need to be changed, | |
422 | * <code>false</code> otherwise. | |
423 | */ | |
424 | public void setCredentialsExpired(boolean credentialsExpired) { | |
425 | 0 | this.credentialsExpired = credentialsExpired; |
426 | 0 | } |
427 | ||
428 | ||
429 | /** | |
430 | * Merges the specified <code>AuthenticationInfo</code> into this <code>Account</code>. | |
431 | * <p/> | |
432 | * If the specified argument is also an instance of {@link SimpleAccount SimpleAccount}, the | |
433 | * {@link #isLocked()} and {@link #isCredentialsExpired()} attributes are merged (set on this instance) as well | |
434 | * (only if their values are <code>true</code>). | |
435 | * | |
436 | * @param info the <code>AuthenticationInfo</code> to merge into this account. | |
437 | */ | |
438 | public void merge(AuthenticationInfo info) { | |
439 | 0 | authcInfo.merge(info); |
440 | ||
441 | // Merge SimpleAccount specific info | |
442 | 0 | if (info instanceof SimpleAccount) { |
443 | 0 | SimpleAccount otherAccount = (SimpleAccount) info; |
444 | 0 | if (otherAccount.isLocked()) { |
445 | 0 | setLocked(true); |
446 | } | |
447 | ||
448 | 0 | if (otherAccount.isCredentialsExpired()) { |
449 | 0 | setCredentialsExpired(true); |
450 | } | |
451 | } | |
452 | 0 | } |
453 | ||
454 | /** | |
455 | * If the {@link #getPrincipals() principals} are not null, returns <code>principals.hashCode()</code>, otherwise | |
456 | * returns 0 (zero). | |
457 | * | |
458 | * @return <code>principals.hashCode()</code> if they are not null, 0 (zero) otherwise. | |
459 | */ | |
460 | public int hashCode() { | |
461 | 0 | return (getPrincipals() != null ? getPrincipals().hashCode() : 0); |
462 | } | |
463 | ||
464 | /** | |
465 | * Returns <code>true</code> if the specified object is also a {@link SimpleAccount SimpleAccount} and its | |
466 | * {@link #getPrincipals() principals} are equal to this object's <code>principals</code>, <code>false</code> otherwise. | |
467 | * | |
468 | * @param o the object to test for equality. | |
469 | * @return <code>true</code> if the specified object is also a {@link SimpleAccount SimpleAccount} and its | |
470 | * {@link #getPrincipals() principals} are equal to this object's <code>principals</code>, <code>false</code> otherwise. | |
471 | */ | |
472 | public boolean equals(Object o) { | |
473 | 0 | if (o == this) { |
474 | 0 | return true; |
475 | } | |
476 | 0 | if (o instanceof SimpleAccount) { |
477 | 0 | SimpleAccount sa = (SimpleAccount) o; |
478 | //principal should be unique across the application, so only check this for equality: | |
479 | 0 | return (getPrincipals() != null ? getPrincipals().equals(sa.getPrincipals()) : sa.getPrincipals() == null); |
480 | } | |
481 | 0 | return false; |
482 | } | |
483 | ||
484 | /** | |
485 | * Returns {@link #getPrincipals() principals}.toString() if they are not null, otherwise prints out the string | |
486 | * "empty" | |
487 | * | |
488 | * @return the String representation of this Account object. | |
489 | */ | |
490 | public String toString() { | |
491 | 86 | return getPrincipals() != null ? getPrincipals().toString() : "empty"; |
492 | } | |
493 | ||
494 | } |