View Javadoc

1   /**
2    * Copyright 2010 The Kuali Foundation Licensed under the
3    * Educational Community License, Version 2.0 (the "License"); you may
4    * not use this file except in compliance with the License. You may
5    * obtain a copy of the License at
6    *
7    * http://www.osedu.org/licenses/ECL-2.0
8    *
9    * Unless required by applicable law or agreed to in writing,
10   * software distributed under the License is distributed on an "AS IS"
11   * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
12   * or implied. See the License for the specific language governing
13   * permissions and limitations under the License.
14   */
15  
16  package org.kuali.student.security.spring;
17  
18  import org.kuali.rice.core.config.Config;
19  import org.kuali.rice.core.config.ConfigContext;
20  import org.kuali.rice.kim.bo.entity.dto.KimPrincipalInfo;
21  import org.kuali.rice.kim.service.IdentityService;
22  import org.kuali.student.common.util.security.UserWithId;
23  import org.springframework.security.GrantedAuthority;
24  import org.springframework.security.providers.UsernamePasswordAuthenticationToken;
25  import org.springframework.security.userdetails.User;
26  import org.springframework.security.userdetails.UserDetails;
27  import org.springframework.security.userdetails.UserDetailsService;
28  import org.springframework.security.userdetails.UsernameNotFoundException;
29  import org.springframework.security.util.AuthorityUtils;
30  
31  /**
32   * This is a description of what this class does. 
33   * 
34   * @author Kuali Student Team
35   *
36   */
37  public class KSRiceDefaultUserDetailsService implements UserDetailsService{
38  
39      private UserWithId ksuser = null;
40      private String password = "";
41     
42      private boolean enabled = true;
43      private boolean nonlocked = true;
44      
45      private IdentityService identityService = null;
46      
47      // Spring Security requires roles to have a prefix of ROLE_ , 
48      // look in org.springframework.security.vote.RoleVoter to change.
49      private GrantedAuthority[] authorities = 
50          AuthorityUtils.commaSeparatedStringToAuthorityArray("ROLE_KS_ADMIN, ROLE_KS_USER");
51      
52      public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
53          if(username==null || username.equals("")){
54              throw new UsernameNotFoundException("Username cannot be null or empty");
55          }
56          
57          Config config = ConfigContext.getCurrentContextConfig();
58          String ksIgnoreRiceLogin = config.getProperty("ks.ignore.rice.login");
59          
60          // if property was not set in a config file then 
61          // it will be null and it falls through to the identityService code.
62          if(Boolean.valueOf(ksIgnoreRiceLogin) == true){
63              return new User(username, password, enabled, true, true, nonlocked, authorities);
64          }
65          
66          KimPrincipalInfo kimPrincipalInfo = null;
67          kimPrincipalInfo = identityService.getPrincipalByPrincipalName(username);
68          
69          String userId;
70          if (null != kimPrincipalInfo) {
71              username = kimPrincipalInfo.getPrincipalName();
72              userId = kimPrincipalInfo.getPrincipalId();
73          } else {
74          // When a UsernameNotFoundException is thrown, spring security will proceed to the next AuthenticationProvider on the list.
75          // When Rice is running and username is not found in KIM, we want authentication to stop and allow the user to enter the correct username.
76          // to do this we need to throw a AccountStatusException and not UsernameNotFoundException.
77              throw new KimUserNotFoundException("Invalid username or password");  
78          }
79          ksuser = new UserWithId(username, password, enabled, true, true, nonlocked, authorities);
80          ksuser.setUserId(userId);
81          return ksuser;
82      }
83      
84      public UserDetails loadUserByUsernameAndToken(String username, UsernamePasswordAuthenticationToken authentication) throws UsernameNotFoundException {
85          if(username==null || username.equals("")){
86              throw new UsernameNotFoundException("Username cannot be null or empty");
87          }
88          
89          Config config = ConfigContext.getCurrentContextConfig();
90          String ksIgnoreRiceLogin = config.getProperty("ks.ignore.rice.login");
91          
92          // if property was not set in a config file then 
93          // it will be null and it falls through to the identityService code.
94          if(Boolean.valueOf(ksIgnoreRiceLogin) == true){
95              return null;
96          }
97          
98          password = (String)authentication.getCredentials();
99          
100         KimPrincipalInfo kimPrincipalInfo = null;
101         
102         kimPrincipalInfo = identityService.getPrincipalByPrincipalNameAndPassword(username, password);
103         String userId;
104         if (null != kimPrincipalInfo) {
105             username = kimPrincipalInfo.getPrincipalName();
106             userId = kimPrincipalInfo.getPrincipalId();
107         } else {
108         // When a UsernameNotFoundException is thrown, spring security will proceed to the next AuthenticationProvider on the list.
109         // When Rice is running and username is not found in KIM, we want authentication to stop and allow the user to enter the correct username.
110         // to do this we need to throw a AccountStatusException and not UsernameNotFoundException.
111             //System.out.println("kimPrincipalInfo is null ");
112             throw new KimUserNotFoundException("Invalid username or password");  
113         }
114         ksuser = new UserWithId(username, password, enabled, true, true, nonlocked, authorities);
115         ksuser.setUserId(userId);
116         return ksuser;
117     }
118     
119     public void setAuthorities(String[] roles) {
120         this.authorities =  AuthorityUtils.stringArrayToAuthorityArray(roles);
121     }
122 
123     public void setIdentityService(IdentityService identityService) {
124         this.identityService = identityService;
125     }
126 }