KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > jaspersoft > jasperserver > api > metadata > user > service > impl > UserAuthorityServiceImpl


1 /*
2  * Copyright (C) 2006 JasperSoft http://www.jaspersoft.com
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; either version 2 of the License, or
7  * (at your option) any later version.
8  *
9  * This program is distributed WITHOUT ANY WARRANTY; and without the
10  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11  * See the GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, see http://www.gnu.org/licenses/gpl.txt
15  * or write to:
16  *
17  * Free Software Foundation, Inc.,
18  * 59 Temple Place - Suite 330,
19  * Boston, MA USA 02111-1307
20  */

21
22 package com.jaspersoft.jasperserver.api.metadata.user.service.impl;
23
24 import java.util.ArrayList JavaDoc;
25 import java.util.Collection JavaDoc;
26 import java.util.HashSet JavaDoc;
27 import java.util.Iterator JavaDoc;
28 import java.util.List JavaDoc;
29 import java.util.Set JavaDoc;
30
31 import org.acegisecurity.GrantedAuthority;
32 import org.acegisecurity.context.SecurityContextHolder;
33 import org.acegisecurity.providers.UsernamePasswordAuthenticationToken;
34 import org.acegisecurity.userdetails.UserDetails;
35 import org.acegisecurity.userdetails.UserDetailsService;
36 import org.acegisecurity.userdetails.UsernameNotFoundException;
37 import org.apache.commons.collections.CollectionUtils;
38 import org.apache.commons.collections.Predicate;
39 import org.apache.commons.logging.Log;
40 import org.apache.commons.logging.LogFactory;
41 import org.hibernate.criterion.DetachedCriteria;
42 import org.hibernate.criterion.Restrictions;
43 import org.springframework.dao.DataAccessException;
44
45 import com.jaspersoft.jasperserver.api.common.domain.ExecutionContext;
46 import com.jaspersoft.jasperserver.api.common.domain.impl.ExecutionContextImpl;
47 import com.jaspersoft.jasperserver.api.metadata.common.service.ResourceFactory;
48 import com.jaspersoft.jasperserver.api.metadata.common.service.impl.HibernateDaoImpl;
49 import com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.PersistentObjectResolver;
50 import com.jaspersoft.jasperserver.api.metadata.user.domain.Role;
51 import com.jaspersoft.jasperserver.api.metadata.user.domain.User;
52 import com.jaspersoft.jasperserver.api.metadata.user.domain.impl.client.MetadataUserDetails;
53 import com.jaspersoft.jasperserver.api.metadata.user.domain.impl.hibernate.RepoRole;
54 import com.jaspersoft.jasperserver.api.metadata.user.domain.impl.hibernate.RepoUser;
55 import com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria;
56
57 /**
58  * @author swood
59  * @version $Id: UserAuthorityServiceImpl.java 4395 2006-09-01 17:10:27Z swood $
60  */

61 public class UserAuthorityServiceImpl extends HibernateDaoImpl implements UserDetailsService, ExternalUserService, PersistentObjectResolver {
62
63     protected static final Log log = LogFactory.getLog(UserAuthorityServiceImpl.class);
64     private ResourceFactory objectFactory;
65     private ResourceFactory persistentClassFactory;
66
67     private List JavaDoc defaultInternalRoles;
68
69     public ResourceFactory getObjectMappingFactory() {
70         return objectFactory;
71     }
72
73     public void setObjectMappingFactory(ResourceFactory objectFactory) {
74         this.objectFactory = objectFactory;
75     }
76
77     public ResourceFactory getPersistentClassFactory() {
78         return persistentClassFactory;
79     }
80
81     public void setPersistentClassFactory(ResourceFactory persistentClassFactory) {
82         this.persistentClassFactory = persistentClassFactory;
83     }
84
85     protected RepoUser getRepoUser(ExecutionContext context, String JavaDoc username) {
86         DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClassFactory().getImplementationClass(User.class));
87         criteria.add(Restrictions.eq("username", username));
88         List JavaDoc userList = getHibernateTemplate().findByCriteria(criteria);
89         RepoUser user = null;
90         if (userList.isEmpty()) {
91             log.debug("User not found with username \"" + username + "\"");
92         } else {
93             user = (RepoUser) userList.get(0);
94         }
95         return user;
96     }
97
98     /* (non-Javadoc)
99      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.String)
100      */

101     public User getUser(ExecutionContext context, String JavaDoc username) {
102         RepoUser user = getRepoUser(context, username);
103         User userDTO = null;
104         if (user != null) {
105             userDTO = (User) user.toClient(getObjectMappingFactory());
106         } else {
107             log.debug("No such user as: " + username);
108         }
109         return userDTO;
110     }
111
112     protected RepoUser getRepoUser(ExecutionContext context, Long JavaDoc id) {
113         RepoUser user = (RepoUser) getHibernateTemplate().load(getPersistentClassFactory().getImplementationClass(User.class), id);
114         return user;
115     }
116
117     /* (non-Javadoc)
118      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.Long)
119      */

120     protected User getUser(ExecutionContext context, Long JavaDoc id) {
121         RepoUser user = getRepoUser(context, id);
122         User userDTO = null;
123         if (user != null) {
124             userDTO = (User) user.toClient(getObjectMappingFactory());
125         }
126         return userDTO;
127     }
128
129     /* (non-Javadoc)
130      * @see org.acegisecurity.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
131      */

132     public UserDetails loadUserByUsername(String JavaDoc username) throws UsernameNotFoundException, DataAccessException {
133         User u = getUser(null, username);
134
135         if (u == null) {
136             throw new UsernameNotFoundException("User not found with username \"" + username + "\"");
137         } else {
138             return new MetadataUserDetails(u);
139         }
140     }
141
142     /* (non-Javadoc)
143      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#putUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, com.jaspersoft.jasperserver.api.metadata.user.domain.User)
144      */

145     public void putUser(ExecutionContext context, User aUser) {
146         RepoUser existingUser = getRepoUser(context, aUser.getUsername());
147         if (existingUser == null) {
148             existingUser = (RepoUser) getPersistentClassFactory().newObject(User.class);
149         }
150         existingUser.copyFromClient(aUser, this);
151         getHibernateTemplate().saveOrUpdate(existingUser);
152     }
153
154     /**
155      * return everything for now
156      *
157      * (non-Javadoc)
158      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getUsers(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria)
159      */

160     public List JavaDoc getUsers(ExecutionContext context, FilterCriteria filterCriteria) {
161         // make User DTOs
162
List JavaDoc results = getHibernateTemplate().loadAll(getPersistentClassFactory().getImplementationClass(User.class));
163         List JavaDoc userDTOs = null;
164
165         if (results != null) {
166             userDTOs = new ArrayList JavaDoc(results.size());
167             Iterator JavaDoc it = results.iterator();
168             while (it.hasNext()) {
169                 RepoUser u = (RepoUser) it.next();
170                 User newUser = (User) u.toClient(getObjectMappingFactory());
171                 userDTOs.add(newUser);
172             }
173         }
174         return userDTOs;
175     }
176
177     /**
178      * DTO for the User interface
179      *
180      * (non-Javadoc)
181      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#newUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext)
182      */

183     public User newUser(ExecutionContext context) {
184         return (User) getObjectMappingFactory().newObject(User.class);
185     }
186
187     /* (non-Javadoc)
188      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#disableUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.Long)
189      */

190     protected boolean disableUser(ExecutionContext context, Long JavaDoc id) {
191         RepoUser user = getRepoUser(context, id);
192         if (user != null && user.isEnabled()) {
193             user.setEnabled(false);
194             return true;
195         } else {
196             return false;
197         }
198     }
199
200     /* (non-Javadoc)
201      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#disableUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.String)
202      */

203     public boolean disableUser(ExecutionContext context, String JavaDoc username) {
204         RepoUser user = getRepoUser(context, username);
205         if (user != null && user.isEnabled()) {
206             user.setEnabled(false);
207             return true;
208         } else {
209             return false;
210         }
211     }
212
213     /* (non-Javadoc)
214      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#enableUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.Long)
215      */

216     protected boolean enableUser(ExecutionContext context, Long JavaDoc id) {
217         RepoUser user = getRepoUser(context, id);
218         if (user != null && !user.isEnabled()) {
219             user.setEnabled(true);
220             return true;
221         } else {
222             return false;
223         }
224     }
225
226     /* (non-Javadoc)
227      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#enableUser(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.String)
228      */

229     public boolean enableUser(ExecutionContext context, String JavaDoc username) {
230         RepoUser user = getRepoUser(context, username);
231         if (user != null && !user.isEnabled()) {
232             user.setEnabled(true);
233             return true;
234         } else {
235             return false;
236         }
237     }
238
239     public void deleteUser (ExecutionContext context, String JavaDoc username) {
240         RepoUser user = getRepoUser(context, username);
241         if (user == null) {
242             return;
243         }
244         removeAllRoles(context, (User) user);
245
246         // TODO remove ObjectPermissions related to the role, too
247

248         getHibernateTemplate().delete(user);
249     }
250
251     public void addRole(ExecutionContext context, User user, Role role) {
252         if (user == null) {
253             return;
254         }
255
256         RepoUser existingUser = getRepoUser(context, user.getUsername());
257         if (existingUser != null) {
258             existingUser.addRole(role);
259             putUser(null, existingUser);
260         }
261         user.addRole(role);
262     }
263
264
265     public void removeRole(ExecutionContext context, User user, Role role) {
266         if (user == null) {
267             return;
268         }
269
270         RepoUser existingUser = getRepoUser(context, user.getUsername());
271         if (existingUser != null) {
272             existingUser.removeRole(role);
273             putUser(null, existingUser);
274         }
275         user.removeRole(role);
276     }
277
278     public void removeAllRoles(ExecutionContext context, User user) {
279         if (user == null) {
280             return;
281         }
282
283         RepoUser existingUser = getRepoUser(context, user.getUsername());
284         if (existingUser == null) {
285             return;
286         }
287
288         /*
289             for (Iterator it = existingUser.getRoles().iterator(); it.hasNext(); ) {
290                 Role role = (Role) it.next();
291                 existingUser.removeRole(role);
292                 user.removeRole(role);
293             }
294         */

295
296         existingUser.getRoles().clear(); //to avoid ConcurrentModificationException
297
putUser(null, existingUser);
298
299     }
300
301     /* (non-Javadoc)
302      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getRole(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.String)
303      */

304     public Role getRole(ExecutionContext context, String JavaDoc roleName) {
305         DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClassFactory().getImplementationClass(Role.class));
306         criteria.add(Restrictions.eq("roleName", roleName));
307         List JavaDoc roleList = getHibernateTemplate().findByCriteria(criteria);
308         Role role = null;
309         if (roleList.isEmpty()) {
310             log.debug("Role not found with role name \"" + roleName + "\"");
311         } else {
312             RepoRole repoRole = (RepoRole) roleList.get(0);
313             role = (Role) repoRole.toClient((ResourceFactory) getObjectMappingFactory());
314         }
315         return role;
316     }
317
318     /* (non-Javadoc)
319      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getRole(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, java.lang.Long)
320      */

321     protected RepoRole getRepoRole(ExecutionContext context, String JavaDoc roleName) {
322         //return (RepoRole) getHibernateTemplate().load(getPersistentClassFactory().getImplementationClass(Role.class), roleName);
323
DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClassFactory().getImplementationClass(Role.class));
324         criteria.add(Restrictions.eq("roleName", roleName));
325         List JavaDoc userList = getHibernateTemplate().findByCriteria(criteria);
326         RepoRole role = null;
327         if (userList.isEmpty()) {
328             log.debug("Role not found with role name \"" + roleName + "\"");
329         } else {
330             role = (RepoRole) userList.get(0);
331         }
332         return role;
333     }
334
335     /* (non-Javadoc)
336      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#putRole(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, com.jaspersoft.jasperserver.api.metadata.user.domain.Role)
337      */

338     public void putRole(ExecutionContext context, Role aRole) {
339         RepoRole existingRole = getRepoRole(context, aRole.getRoleName());
340         log.debug("putRole: " + aRole.getRoleName() + ", " + existingRole);
341         if (existingRole == null) {
342             existingRole = (RepoRole) getPersistentClassFactory().newObject(Role.class);
343             log.debug("New Object");
344         }
345         existingRole.copyFromClient(aRole, this);
346         getHibernateTemplate().saveOrUpdate(existingRole);
347
348         Set JavaDoc repoUsers = existingRole.getUsers();
349         for (Iterator JavaDoc it = repoUsers.iterator(); it.hasNext();) {
350             RepoUser repoUser = (RepoUser) it.next();
351             repoUser.getRoles().remove(getPersistentObject(aRole));
352         }
353
354         Set JavaDoc users = aRole.getUsers();
355         for (Iterator JavaDoc it = users.iterator(); it.hasNext();) {
356             User user = (User) it.next();
357             addRole(context, user, aRole);
358         }
359
360     }
361
362     /**
363      * Return everything for now
364      *
365      * (non-Javadoc)
366      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#getRoles(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext, com.jaspersoft.jasperserver.api.metadata.view.domain.FilterCriteria)
367      */

368     public List JavaDoc getRoles(ExecutionContext context, FilterCriteria filterCriteria) {
369         List JavaDoc results = getHibernateTemplate().loadAll(getPersistentClassFactory().getImplementationClass(Role.class));
370         List JavaDoc roleDTOs = null;
371
372         if (results != null) {
373             roleDTOs = new ArrayList JavaDoc(results.size());
374             Iterator JavaDoc it = results.iterator();
375             while (it.hasNext()) {
376                 RepoRole r = (RepoRole) it.next();
377                 Role newRole = (Role) r.toClient((ResourceFactory) getObjectMappingFactory());
378                 roleDTOs.add(newRole);
379             }
380         }
381         return roleDTOs;
382     }
383
384     /* (non-Javadoc)
385      * @see com.jaspersoft.jasperserver.api.metadata.user.service.UserAuthorityService#newRole(com.jaspersoft.jasperserver.api.common.domain.ExecutionContext)
386      */

387     public Role newRole(ExecutionContext context) {
388         // return a Role DTO
389
return (Role) getObjectMappingFactory().newObject(Role.class);
390     }
391
392     public void deleteRole(ExecutionContext context, String JavaDoc roleName) {
393         RepoRole role = getRepoRole(context, roleName);
394         if (role == null) {
395             return;
396         }
397
398         // Get all users that have this role and remove the role from them
399

400         DetachedCriteria criteria = DetachedCriteria.forClass(getPersistentClassFactory().getImplementationClass(User.class));
401         criteria.createAlias("roles", "r")
402             .add( Restrictions.eq("r.roleName", roleName) );
403         List JavaDoc userList = getHibernateTemplate().findByCriteria(criteria);
404
405         for (Iterator JavaDoc it = userList.iterator(); it.hasNext(); ) {
406             RepoUser u = (RepoUser) it.next();
407             u.removeRole(role);
408         }
409
410 // role.getUsers().clear();
411
// TODO remove ObjectPermissions related to the role, too
412

413         // then delete the role
414
getHibernateTemplate().delete(role);
415     }
416
417     public List JavaDoc getUsersNotInRole(ExecutionContext context, String JavaDoc roleName)
418     {
419         List JavaDoc allUsers = getUsers(context, null);
420         List JavaDoc usersInRole = getUsersInRole(context, roleName);
421         allUsers.removeAll(usersInRole);
422
423         return allUsers;
424     }
425
426     public List JavaDoc getUsersInRole(ExecutionContext context, String JavaDoc roleName)
427     {
428         RepoRole repoRole = getRepoRole(context, roleName);
429         Set JavaDoc repoUsers = repoRole.getUsers();
430         List JavaDoc users = new ArrayList JavaDoc();
431
432         for (Iterator JavaDoc it = repoUsers.iterator(); it.hasNext();)
433         {
434             RepoUser repoUser = (RepoUser) it.next();
435             User user = (User) repoUser.toClient(getObjectMappingFactory());
436             users.add(user);
437         }
438
439         return users;
440     }
441
442
443     /*
444      * TODO this should be generalized. Maybe get the Repo* objects to return a
445      * DetachedCriteria filled with the key from the client object?
446      *
447      * (non-Javadoc)
448      * @see com.jaspersoft.jasperserver.api.metadata.common.service.impl.hibernate.PersistentObjectResolver#getPersistentObject(java.lang.Object)
449      */

450     public Object JavaDoc getPersistentObject(Object JavaDoc clientObject) {
451         if (clientObject instanceof Role) {
452             Role r = (Role) clientObject;
453             return getRepoRole(null, r.getRoleName());
454         } else if (clientObject instanceof User) {
455             User u = (User) clientObject;
456             return getRepoUser(null, u.getUsername());
457         }
458         return null;
459     }
460
461     /**
462      * From an external user, maintain the shadow internal user
463      *
464      * @param externalUserDetails
465      */

466     public void maintainInternalUser(UserDetails externalUserDetails) {
467
468         log.debug("External user: " + externalUserDetails.getUsername());
469
470         User user = getUser(new ExecutionContextImpl(), externalUserDetails.getUsername());
471
472         if (user == null) {
473             user = createNewExternalUser(externalUserDetails);
474         }
475
476         alignInternalAndExternalUser(externalUserDetails, user);
477
478     }
479     /**
480      * New user created from given authentication details. No password is set or needed.
481      * Roles are set elsewhere.
482      *
483      * @param userDetails
484      * @return created User
485      */

486     private User createNewExternalUser(UserDetails userDetails) {
487         User user = newUser(new ExecutionContextImpl());
488         user.setUsername(userDetails.getUsername());
489         // If it is externally authenticated, no save of password
490
//user.setPassword(userDetails.getPassword());
491
user.setFullName(userDetails.getUsername()); // We don't know the real name
492
user.setExternallyDefined(true);
493         user.setEnabled(true);
494         log.warn("Created new external user: " + user.getUsername());
495         return user;
496     }
497
498     /**
499      * Ensure the external user has the right roles. Roles attached to the userDetails are the definitive list
500      * of externally defined roles.
501      *
502      * @param auth
503      * @param userDetails
504      * @param user
505      */

506     private void alignInternalAndExternalUser(UserDetails userDetails, User user) {
507
508         Set JavaDoc externalRoles = getRolesFromUserDetails(userDetails);
509
510         final Predicate externallyDefinedRoles = new Predicate() {
511             public boolean evaluate(Object JavaDoc input) {
512                 if (!(input instanceof Role)) {
513                     return false;
514                 }
515                 return ((Role) input).isExternallyDefined();
516             }
517         };
518
519         Set JavaDoc currentRoles = user.getRoles();
520
521         // we may have a new user, so always persist them
522
boolean persistUserNeeded = (currentRoles.size() == 0);
523 /*
524         // If it is externally authenticated, no save of password
525         if (!user.getPassword().equals(userDetails.getPassword())) {
526             user.setPassword(userDetails.getPassword());
527             persistUserNeeded = true;
528         }
529
530 */
Collection JavaDoc currentExternalRoles = CollectionUtils.select(user.getRoles(), externallyDefinedRoles);
531         if (log.isDebugEnabled()) {
532             log.debug("Login of external User: " + userDetails.getUsername() );
533             log.debug("Roles from authentication:\n" + roleCollectionToString(externalRoles));
534             log.debug("Current roles from metadata:\n" + roleCollectionToString(user.getRoles()));
535             log.debug("Current external roles for user from metadata: " + user.getUsername() + "\n" + roleCollectionToString(currentExternalRoles));
536         }
537
538         /*
539          * If we have new external roles, we want to add them
540          */

541         Collection JavaDoc newExternalRoles = CollectionUtils.subtract(externalRoles, currentExternalRoles);
542
543         if (newExternalRoles.size() > 0) {
544             currentRoles.addAll(newExternalRoles);
545             if (log.isWarnEnabled()) {
546                 log.warn("Added following external roles to: " + user.getUsername() + "\n" + roleCollectionToString(newExternalRoles));
547             }
548             persistUserNeeded = true;
549         }
550
551         /*
552          * If external roles have been removed, we need to remove them
553          */

554         Collection JavaDoc rolesNeedingRemoval = CollectionUtils.subtract(currentExternalRoles, externalRoles);
555
556         if (rolesNeedingRemoval.size() > 0) {
557             currentRoles.removeAll(rolesNeedingRemoval);
558             if (log.isWarnEnabled()) {
559                 log.warn("Removed following external roles from: " + user.getUsername() + "\n" + roleCollectionToString(rolesNeedingRemoval));
560             }
561             persistUserNeeded = true;
562         }
563
564         /*
565          * If we have new default internal roles, we want to add them
566          */

567         Collection JavaDoc defaultInternalRolesToAdd = CollectionUtils.subtract(getNewDefaultInternalRoles(), currentRoles);
568
569         if (defaultInternalRolesToAdd.size() > 0) {
570             if (log.isDebugEnabled()) {
571                 log.debug("Default internal roles: " + roleCollectionToString(getNewDefaultInternalRoles()));
572             }
573             currentRoles.addAll(defaultInternalRolesToAdd);
574             if (log.isWarnEnabled()) {
575                 log.warn("Added following new default internal roles to: " + user.getUsername() + "\n" + roleCollectionToString(defaultInternalRolesToAdd));
576             }
577             persistUserNeeded = true;
578         }
579
580         if (persistUserNeeded) {
581             if (log.isWarnEnabled()) {
582                 log.warn("Updated user: " + user.getUsername() + ". Roles are now:\n" + roleCollectionToString(currentRoles));
583             }
584             user.setRoles(currentRoles);
585             // persist user and roles
586
putUser(new ExecutionContextImpl(), user);
587             if (log.isWarnEnabled()) {
588                 log.warn("Updated user: " + user.getUsername() + ". Roles are now:\n" + roleCollectionToString(currentRoles));
589             }
590         }
591
592     }
593
594     private String JavaDoc roleCollectionToString(Collection JavaDoc coll) {
595         Iterator JavaDoc it = coll.iterator();
596         StringBuffer JavaDoc rolesPrint = new StringBuffer JavaDoc();
597         while (it.hasNext()) {
598             String JavaDoc s = ((Role) it.next()).getRoleName();
599             rolesPrint.append(s).append("\n");
600         }
601         return rolesPrint.toString();
602     }
603
604     /**
605      * Get a set of roles based on the given UserDetails. Roles are created
606      * in the metadata if they do not exist.
607      *
608      * @param UserDetails ud
609      * @return Set of externally defined Roles
610      */

611     private Set JavaDoc getRolesFromUserDetails(UserDetails ud) {
612         Set JavaDoc set = new HashSet JavaDoc();
613
614         GrantedAuthority[] authorities = ud.getAuthorities();
615
616         if (authorities == null || authorities.length == 0)
617             return set;
618
619         for (int i = 0; i < authorities.length; i++) {
620             GrantedAuthority auth = authorities[i];
621
622             String JavaDoc authorityName = auth.getAuthority();
623
624             // Make spaces in the authority name be underscores
625

626             authorityName = authorityName.replace(' ', '_');
627
628             set.add(getOrCreateRole(authorityName, true));
629         }
630         return set;
631     }
632
633     /**
634      * Get a set of roles that are the defaults for a new external user. Roles are created
635      * in the metadata if they do not exist.
636      *
637      * @return Set of internally defined Roles
638      */

639     private Set JavaDoc getNewDefaultInternalRoles() {
640         Set JavaDoc set = new HashSet JavaDoc();
641
642         if (getDefaultInternalRoles() == null || getDefaultInternalRoles().size() == 0)
643             return set;
644
645         for (int i = 0; i < getDefaultInternalRoles().size(); i++) {
646             String JavaDoc roleName = (String JavaDoc) getDefaultInternalRoles().get(i);
647
648             set.add(getOrCreateRole(roleName, false));
649         }
650         return set;
651     }
652
653     private Role getOrCreateRole(String JavaDoc roleName, boolean externallyDefined) {
654         Role r = getRole(new ExecutionContextImpl(), roleName);
655         if (r == null) {
656             r = newRole(new ExecutionContextImpl());
657             r.setRoleName(roleName);
658             r.setExternallyDefined(externallyDefined);
659             putRole(new ExecutionContextImpl(), r);
660             log.warn("Created new " + (externallyDefined ? "external" : "internal") + " role: " + roleName);
661         }
662
663         return r;
664     }
665
666     public void makeUserLoggedIn(String JavaDoc username) {
667
668         try {
669             // Make our user the Authentication!
670

671             UserDetails ourUserDetails = loadUserByUsername(username);
672
673             // Don't set the authentication if we have no roles
674

675             if (ourUserDetails.getAuthorities().length != 0) {
676                 UsernamePasswordAuthenticationToken ourAuthentication = new UsernamePasswordAuthenticationToken(ourUserDetails,
677                         ourUserDetails.getPassword(), ourUserDetails.getAuthorities());
678
679                 if (log.isDebugEnabled()) {
680                     log.debug("Setting Authentication to: " + ourAuthentication);
681                 }
682                 SecurityContextHolder.getContext().setAuthentication(ourAuthentication);
683             } else {
684
685                 // There was some error - maybe no roles?
686
// Remove authentication to allow anonymous access to catch things
687
// later in the filter chain
688
SecurityContextHolder.getContext().setAuthentication(null);
689             }
690         } catch (UsernameNotFoundException e) {
691             log.warn("User: " + username + " was not found to make them logged in");
692         }
693     }
694
695     /**
696      * @return Returns the defaultInternalRoles.
697      */

698     public List JavaDoc getDefaultInternalRoles() {
699         return defaultInternalRoles;
700     }
701
702     /**
703      * @param defaultInternalRoles The defaultInternalRoles to set.
704      */

705     public void setDefaultInternalRoles(List JavaDoc defaultInternalRoles) {
706         this.defaultInternalRoles = defaultInternalRoles;
707     }
708
709 }
710
Popular Tags