I would suggest using an "instanceof" check to see if it's a String or a real user. We do something like this in UserSecurityAdvice:
private User getCurrentUser(Authentication auth) { User currentUser; if (auth.getPrincipal() instanceof UserDetails) { currentUser = (User) auth.getPrincipal(); } else if (auth.getDetails() instanceof UserDetails) { currentUser = (User) auth.getDetails(); } else { throw new AccessDeniedException("User not properly authenticated."); } return currentUser; } Matt On Mon, May 5, 2008 at 4:09 PM, ifunsu <[EMAIL PROTECTED]> wrote: > Hi all, > > Just after you success register a new user in appfuse(signup.html), > "current user" at the windows's middle below area will show User > object's "username" property. > If you go to userforms.html and save user information again, it will > show User object's "firstname" plus "lastname" property. It seems that > the object have changed. > If you call "User user = (User) > SecurityContextHolder.getContext().getAuthentication().getPrincipal();" > without step userforms.html, you will got a ClassCastException. > > Relative link: > http://www.nabble.com/Proper-way-of-requesting-current-user-tp6236528s2369p6237122.html > > Stack messages: > > ?? > > javax.servlet.ServletException: > org.springframework.web.util.NestedServletException: Request > processing failed; nested exception is java.lang.ClassCastException: > java.lang.String cannot be cast to org.appfuse.model.User > at > net.sf.ehcache.constructs.web.filter.Filter.logThrowable(Filter.java:152) > at > net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:97) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.appfuse.webapp.filter.LocaleFilter.doFilterInternal(LocaleFilter.java:74) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > com.opensymphony.clickstream.ClickstreamFilter.doFilter(ClickstreamFilter.java:42) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:265) > at > org.acegisecurity.intercept.web.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:107) > at > org.acegisecurity.intercept.web.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:72) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.ui.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:166) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:81) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249) > at > org.acegisecurity.util.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:275) > at > org.acegisecurity.util.FilterChainProxy.doFilter(FilterChainProxy.java:149) > at > org.acegisecurity.util.FilterToBeanProxy.doFilter(FilterToBeanProxy.java:98) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) > at > org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) > at > org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) > at > org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) > at > org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) > at > org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263) > at > org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) > at > org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584) > at > org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) > at java.lang.Thread.run(Unknown Source) > Caused by: org.springframework.web.util.NestedServletException: > Request processing failed; nested exception is > java.lang.ClassCastException: java.lang.String cannot be cast to > org.appfuse.model.User > at > org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:488) > at > org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:431) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) > at > org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445) > at > org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:343) > at > org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292) > at > org.appfuse.webapp.filter.StaticFilter.doFilterInternal(StaticFilter.java:102) > at > org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:118) > at > com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:52) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.tuckey.web.filters.urlrewrite.RuleChain.handleRewrite(RuleChain.java:164) > at > org.tuckey.web.filters.urlrewrite.RuleChain.doRules(RuleChain.java:141) > at > org.tuckey.web.filters.urlrewrite.UrlRewriter.processRequest(UrlRewriter.java:90) > at > org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:406) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125) > at > org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) > at > org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) > at > net.sf.ehcache.constructs.web.filter.GzipFilter.doFilter(GzipFilter.java:75) > at > net.sf.ehcache.constructs.web.filter.Filter.doFilter(Filter.java:92) > ... 43 more > Caused by: java.lang.ClassCastException: java.lang.String cannot be > cast to org.appfuse.model.User > at > ifunsu.at.gmail.leftright.webapp.controller.BundleController.left(BundleController.java:201) > at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at > org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:472) > at > org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:409) > at > org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153) > at > org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48) > at > org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:874) > at > org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:808) > at > org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:476) > ... 71 more > > Code > ifunsu.at.gmail.leftright.webapp.controller.BundleController.left(BundleController.java:201) > public ModelAndView left(HttpServletRequest request, > HttpServletResponse responese) { > this.log.debug("User left."); > User user = (User) SecurityContextHolder.getContext() // > <<<<<<<<<<<======== line 201 > .getAuthentication().getPrincipal(); > Unit unit = (Unit) request.getSession().getAttribute( > UnitController.Unit_Key); > > if(unit == null){ > unit = this.unitManager.loadUnit(Unit.ROOT); > } > > Left left = unit.getLeft(); > if (left == null) { > > unit = new Unit(unit.getId(), user.getId(), > unit.getLevel() + 1); > > unit.setLeft(new Left()); > }else{ > unit = this.unitManager.loadUnit(left.getLeaf()); > } > request.getSession().setAttribute(UnitController.Unit_Key, > unit); > return new ModelAndView("redirect:/unit.html"); > } > > > > ---------- Forwarded message ---------- > From: Matt Raible <[EMAIL PROTECTED]> > Date: 2008/5/6 > Subject: Re: Proper way of requesting current user > To: [EMAIL PROTECTED] > > > Please post this question to the users mailing list with more details > and steps to reproduce. > > http://appfuse.org/display/APF/Mailing+Lists > > Thanks, > > Matt > > On Mon, May 5, 2008 at 10:08 AM, <[EMAIL PROTECTED]> wrote: > > Dear Matt: > > > > Hi, I find a bug in your code. > > If I register a new user, it says "You have successfully > registered for access to this application. ". > > Then I continue to use the application. A cast error will throw in > your code below: > > > User user = (User) > > > SecurityContextHolder.getContext().getAuthentication().getPrincipal(); > > For when this time the getPrincipal() only return a string > represent the current user not the User object. > > If I first edit the user's profile, it will run normally seem like > acegi load the User object to replace the ONLY user name String > object. > > > > Thank you for your great job! > > > > Ifun > > > > Matt Raible-3 wrote: > > > > > > UserSecurityAdvice.java has an example: > > > > > > SecurityContext ctx = SecurityContextHolder.getContext(); > > > Authentication auth = ctx.getAuthentication(); > > > User user = (User) auth.getPrincipal(); > > > > > > Of course, you could shorten it to: > > > > > > User user = (User) > > > SecurityContextHolder.getContext().getAuthentication().getPrincipal(); > > > > > > Matt > > > > > > On 9/10/06, Ernesto Echeverria <[EMAIL PROTECTED]> wrote: > > >> I've noticed the method getUser in BaseFormController (Spring MVC) has > > >> been deprecated. > > >> > > >> What is the alternate/current recommended way of getting the current > > >> user in a secure way? > > >> > > >> Regards. > > >> > > >> > > >> --------------------------------------------------------------------- > > >> To unsubscribe, e-mail: [EMAIL PROTECTED] > > >> For additional commands, e-mail: [EMAIL PROTECTED] > > >> > > >> > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > > > > > Quoted from: > > > http://www.nabble.com/Proper-way-of-requesting-current-user-tp6236528s2369p6237122.html > > > > > > > > -- > http://raibledesigns.com > > > > -- > ====================================== > Let's make it work! > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]