1 21 22 package com.jaspersoft.jasperserver.war.control; 23 24 import java.util.ArrayList ; 25 import java.util.Iterator ; 26 import java.util.List ; 27 28 import javax.servlet.ServletException ; 29 import javax.servlet.http.HttpServletRequest ; 30 import javax.servlet.http.HttpServletResponse ; 31 32 import org.acegisecurity.Authentication; 33 import org.acegisecurity.context.SecurityContext; 34 import org.acegisecurity.context.SecurityContextHolder; 35 import org.acegisecurity.userdetails.UserDetails; 36 import org.apache.commons.logging.Log; 37 import org.apache.commons.logging.LogFactory; 38 import org.springframework.web.servlet.ModelAndView; 39 40 import com.jaspersoft.jasperserver.api.common.domain.impl.ExecutionContextImpl; 41 import com.jaspersoft.jasperserver.api.metadata.user.domain.Role; 42 import com.jaspersoft.jasperserver.api.metadata.user.domain.User; 43 import com.jaspersoft.jasperserver.api.metadata.user.domain.impl.client.MetadataUserDetails; 44 45 49 public class LoginController extends JRBaseMultiActionController { 50 51 private static Log log = LogFactory.getLog(LoginController.class); 52 53 56 private List homePageByRole; 57 private List homePageByRoleEntries; 58 private String defaultHomePage = "home"; 59 60 65 public ModelAndView homePage(HttpServletRequest req, HttpServletResponse res) 66 throws ServletException { 67 68 if ((SecurityContextHolder.getContext() == null) 69 || !(SecurityContextHolder.getContext() instanceof SecurityContext) 70 || (((SecurityContext) SecurityContextHolder.getContext()) 71 .getAuthentication() == null)) { 72 return new ModelAndView("loginError"); 74 } 75 76 Authentication auth = SecurityContextHolder.getContext() 77 .getAuthentication(); 78 79 if (auth.getPrincipal() == null) { 80 return new ModelAndView("home"); 82 } 83 84 User user = (User) auth.getPrincipal(); 85 return new ModelAndView(getBestHomeURLForUser(user)); 86 } 87 88 100 public ModelAndView loginSuccess(HttpServletRequest req, HttpServletResponse res) 101 throws ServletException { 102 103 if ((SecurityContextHolder.getContext() == null) 104 || !(SecurityContextHolder.getContext() instanceof SecurityContext) 105 || (((SecurityContext) SecurityContextHolder.getContext()) 106 .getAuthentication() == null)) { 107 return new ModelAndView("loginError"); 109 } 110 111 Authentication auth = SecurityContextHolder.getContext() 112 .getAuthentication(); 113 114 if (auth.getPrincipal() == null) { 115 return new ModelAndView("loginError"); 117 } 118 119 User user; 120 121 log.debug("Authentication class: " + auth.getClass() + 122 " Authentication principal class: " + auth.getPrincipal().getClass()); 123 124 if (!(auth.getPrincipal() instanceof MetadataUserDetails)) { 125 126 UserDetails userDetails = (UserDetails) auth.getPrincipal(); 127 128 log.debug("External user: " + userDetails.getUsername()); 129 130 user = getUserAuthService().getUser(new ExecutionContextImpl(), userDetails.getUsername()); 131 } else { 132 user = (User) auth.getPrincipal(); 133 } 134 135 return new ModelAndView(getBestHomeURLForUser(user)); 136 } 137 138 144 private String getBestHomeURLForUser(User user) { 145 if (getHomePageByRole() == null || getHomePageByRole().size() == 0) { 146 log.debug("Set home page for user: " + user.getUsername() + " to default: " + getDefaultHomePage()); 147 return getDefaultHomePage(); 148 } 149 Iterator it = getHomePageByRoleEntries().iterator(); 150 while (it.hasNext()) { 151 RoleHomePage entry = (RoleHomePage) it.next(); 152 153 if (hasRole(user, entry.getRoleName())) { 154 log.debug("Set home page for user: " + user.getUsername() + 155 " based on role: " + entry.getRoleName() + 156 " to: " + entry.getHomePageURL()); 157 return entry.getHomePageURL(); 158 } 159 160 } 161 log.debug("Set home page for user: " + user.getUsername() + " to default: " + getDefaultHomePage()); 162 return getDefaultHomePage(); 163 } 164 165 172 private boolean hasRole(User u, String roleName) { 173 if (u == null || u.getRoles().size() == 0) { 174 log.debug("No roles on user: " + u + " to check for role: " + roleName); 175 return false; 176 } 177 Iterator it = u.getRoles().iterator(); 178 while (it.hasNext()) { 179 Role r = (Role) it.next(); 180 if (r.getRoleName().equalsIgnoreCase(roleName)) { 181 log.debug("Found role " + roleName + " on user: " + u); 182 return true; 183 } 184 } 185 log.debug("Found NO role " + roleName + " on user: " + u); 186 return false; 187 } 188 189 192 public String getDefaultHomePage() { 193 return defaultHomePage; 194 } 195 196 199 public void setDefaultHomePage(String defaultHomePage) { 200 this.defaultHomePage = defaultHomePage; 201 } 202 203 206 public List getHomePageByRole() { 207 return homePageByRole; 208 } 209 210 215 public void setHomePageByRole(List homePageByRole) { 216 this.homePageByRole = homePageByRole; 217 218 if (homePageByRole == null) { 219 setHomePageByRoleEntries(null); 220 return; 221 } 222 223 List entriesList = new ArrayList (homePageByRole.size()); 224 225 Iterator it = homePageByRole.iterator(); 226 227 while (it.hasNext()) { 228 String str = (String ) it.next(); 229 230 int pos = str.indexOf('|'); 231 232 if (pos == -1) { 233 throw new RuntimeException ("Invalid home page entry (needs | to separate role and URL:" + str); 234 } 235 236 RoleHomePage entry = new RoleHomePage(str.substring(0, pos),str.substring(pos + 1)); 237 entriesList.add(entry); 238 } 239 240 setHomePageByRoleEntries(entriesList); 241 242 } 243 244 247 public List getHomePageByRoleEntries() { 248 return homePageByRoleEntries; 249 } 250 251 254 public void setHomePageByRoleEntries(List homePageByRoleEntries) { 255 this.homePageByRoleEntries = homePageByRoleEntries; 256 } 257 258 private class RoleHomePage { 259 private String roleName; 260 private String homePageURL; 261 262 public RoleHomePage(String roleName, String homePageURL) { 263 this.roleName = roleName; 264 this.homePageURL = homePageURL; 265 } 266 267 270 public String getHomePageURL() { 271 return homePageURL; 272 } 273 276 public void setHomePageURL(String homePageURL) { 277 this.homePageURL = homePageURL; 278 } 279 282 public String getRoleName() { 283 return roleName; 284 } 285 288 public void setRoleName(String roleName) { 289 this.roleName = roleName; 290 } 291 } 292 293 } 294 | Popular Tags |