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]

Reply via email to