java - org.springframework.security.core.userdetails.User cannot be cast to MyUserDetails -
i getting class cast exception when implement user class of spring security. want add few additional details in myuserdetails (id) not able result.
this question answered here 2 getting error, don't know missing.
below code :
securityconfig.java:
@configuration @enablewebsecurity public class securityconfig extends websecurityconfigureradapter { @autowired @qualifier("authenticationprovider") authenticationprovider authenticationprovider; @autowired datasource datasource; @autowired public void configauthentication(authenticationmanagerbuilder auth) throws exception { auth.jdbcauthentication() .datasource(datasource) .passwordencoder(passwordencoder()) .usersbyusernamequery( "select username,password, enabled users username=?") .authoritiesbyusernamequery( "select username, role user_roles username=?"); } @bean public passwordencoder passwordencoder() { passwordencoder encoder = new bcryptpasswordencoder(); return encoder; } @override protected void configure(httpsecurity http) throws exception { http.headers().cachecontrol().and().xssprotection().and() .frameoptions().and(); http.authorizerequests() .antmatchers("/sadmin/**") .access("hasrole('role_sadmin')") .antmatchers("/admin/**") .access("hasrole('role_admin') or hasrole('role_sadmin')") .antmatchers("/") .access("hasrole('role_admin') or hasrole('role_sadmin') or hasrole('role_user')") .and().formlogin() .loginprocessingurl("/j_spring_security_check") .loginpage("/login").failureurl("/login?error") .usernameparameter("username").passwordparameter("password") .and().logout().logouturl("/j_spring_security_logout") .logoutsuccessurl("/login?logout").and().exceptionhandling() .accessdeniedpage("/403").and().csrf(); // session management url reference // https://github.com/spring-projects/spring-security-javaconfig/blob/master/spring-security-javaconfig/src/test/groovy/org/springframework/security/config/annotation/web/configurers/namespacesessionmanagementtests.groovy } myuserdetails.java:
public class myuserdetails extends user { private int id; public myuserdetails(string username, string password, boolean enabled, boolean accountnonexpired, boolean credentialsnonexpired, boolean accountnonlocked, collection<? extends grantedauthority> authorities) { super(username, password, enabled, accountnonexpired, credentialsnonexpired, accountnonlocked, authorities); } // getter setter .... } customuserdetailsservice.java:
@service("userdetailsservice") public class customuserdetailsservice extends jdbcdaoimpl{ @override protected list<userdetails> loadusersbyusername(string username) { return getjdbctemplate().query(super.getusersbyusernamequery(), new string[] { username }, new rowmapper<userdetails>() { public userdetails maprow(resultset rs, int rownum) throws sqlexception { string username = rs.getstring("username"); string password = rs.getstring("password"); boolean enabled = rs.getboolean("enabled"); boolean accountnonexpired = rs.getboolean("accountnonexpired"); boolean credentialsnonexpired = rs.getboolean("credentialsnonexpired"); boolean accountnonlocked = rs.getboolean("accountnonlocked"); int id = rs.getint("id"); myuserdetails myuserdetails = new myuserdetails(username, password, enabled, accountnonexpired, credentialsnonexpired, accountnonlocked, authorityutils.no_authorities); myuserdetails.setid(id); return myuserdetails; } }); } @override protected userdetails createuserdetails(string username, userdetails userfromuserquery, list<grantedauthority> combinedauthorities) { string returnusername = userfromuserquery.getusername(); if (!isusernamebasedprimarykey()) { returnusername = username; } final myuserdetails myuserdetails = new myuserdetails(returnusername, userfromuserquery.getpassword(), userfromuserquery.isenabled(), userfromuserquery.isaccountnonexpired(), userfromuserquery.iscredentialsnonexpired(), userfromuserquery.isaccountnonlocked(), combinedauthorities); myuserdetails.setid(((myuserdetails) userfromuserquery).getid()); return myuserdetails; } } code myuserdetails:
myuserdetails userdetails = (myuserdetails) securitycontextholder.getcontext().getauthentication().getprincipal(); pom.xml:
<org.springframework.version>4.0.5.release</org.springframework.version> <spring.security.version>4.0.1.release</spring.security.version> stacktrace:
severe: servlet.service() servlet [dispatcher] in context path [/housing] threw exception [request processing failed; nested exception java.lang.classcastexception: org.springframework.security.core.userdetails.user cannot cast com.esociety.dto.myuserdetails] root cause java.lang.classcastexception: org.springframework.security.core.userdetails.user cannot cast com.esociety.dto.myuserdetails @ com.esociety.controller.logincontroller.dashboard(logincontroller.java:38) @ sun.reflect.nativemethodaccessorimpl.invoke0(native method) @ sun.reflect.nativemethodaccessorimpl.invoke(unknown source) @ sun.reflect.delegatingmethodaccessorimpl.invoke(unknown source) @ java.lang.reflect.method.invoke(unknown source) @ org.springframework.web.method.support.invocablehandlermethod.invoke(invocablehandlermethod.java:215) @ org.springframework.web.method.support.invocablehandlermethod.invokeforrequest(invocablehandlermethod.java:132) @ org.springframework.web.servlet.mvc.method.annotation.servletinvocablehandlermethod.invokeandhandle(servletinvocablehandlermethod.java:104) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.invokehandlemethod(requestmappinghandleradapter.java:749) @ org.springframework.web.servlet.mvc.method.annotation.requestmappinghandleradapter.handleinternal(requestmappinghandleradapter.java:689) @ org.springframework.web.servlet.mvc.method.abstracthandlermethodadapter.handle(abstracthandlermethodadapter.java:83) @ org.springframework.web.servlet.dispatcherservlet.dodispatch(dispatcherservlet.java:938) @ org.springframework.web.servlet.dispatcherservlet.doservice(dispatcherservlet.java:870) @ org.springframework.web.servlet.frameworkservlet.processrequest(frameworkservlet.java:961) @ org.springframework.web.servlet.frameworkservlet.doget(frameworkservlet.java:852) @ javax.servlet.http.httpservlet.service(httpservlet.java:618) @ org.springframework.web.servlet.frameworkservlet.service(frameworkservlet.java:837) @ javax.servlet.http.httpservlet.service(httpservlet.java:725) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:291) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.tomcat.websocket.server.wsfilter.dofilter(wsfilter.java:52) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:316) @ org.springframework.security.web.access.intercept.filtersecurityinterceptor.invoke(filtersecurityinterceptor.java:126) @ org.springframework.security.web.access.intercept.filtersecurityinterceptor.dofilter(filtersecurityinterceptor.java:90) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.access.exceptiontranslationfilter.dofilter(exceptiontranslationfilter.java:114) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.session.sessionmanagementfilter.dofilter(sessionmanagementfilter.java:122) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.authentication.anonymousauthenticationfilter.dofilter(anonymousauthenticationfilter.java:111) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.servletapi.securitycontextholderawarerequestfilter.dofilter(securitycontextholderawarerequestfilter.java:168) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.savedrequest.requestcacheawarefilter.dofilter(requestcacheawarefilter.java:48) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.authentication.abstractauthenticationprocessingfilter.dofilter(abstractauthenticationprocessingfilter.java:205) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.authentication.logout.logoutfilter.dofilter(logoutfilter.java:120) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.csrf.csrffilter.dofilterinternal(csrffilter.java:96) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.header.headerwriterfilter.dofilterinternal(headerwriterfilter.java:64) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.context.securitycontextpersistencefilter.dofilter(securitycontextpersistencefilter.java:91) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.context.request.async.webasyncmanagerintegrationfilter.dofilterinternal(webasyncmanagerintegrationfilter.java:53) @ org.springframework.web.filter.onceperrequestfilter.dofilter(onceperrequestfilter.java:107) @ org.springframework.security.web.filterchainproxy$virtualfilterchain.dofilter(filterchainproxy.java:330) @ org.springframework.security.web.filterchainproxy.dofilterinternal(filterchainproxy.java:213) @ org.springframework.security.web.filterchainproxy.dofilter(filterchainproxy.java:176) @ org.springframework.web.filter.delegatingfilterproxy.invokedelegate(delegatingfilterproxy.java:344) @ org.springframework.web.filter.delegatingfilterproxy.dofilter(delegatingfilterproxy.java:261) @ org.apache.catalina.core.applicationfilterchain.internaldofilter(applicationfilterchain.java:239) @ org.apache.catalina.core.applicationfilterchain.dofilter(applicationfilterchain.java:206) @ org.apache.catalina.core.standardwrappervalve.invoke(standardwrappervalve.java:219) @ org.apache.catalina.core.standardcontextvalve.invoke(standardcontextvalve.java:106) @ org.apache.catalina.authenticator.authenticatorbase.invoke(authenticatorbase.java:503) @ org.apache.catalina.core.standardhostvalve.invoke(standardhostvalve.java:136) @ org.apache.catalina.valves.errorreportvalve.invoke(errorreportvalve.java:79) @ org.apache.catalina.valves.abstractaccesslogvalve.invoke(abstractaccesslogvalve.java:610) @ org.apache.catalina.core.standardenginevalve.invoke(standardenginevalve.java:88) @ org.apache.catalina.connector.coyoteadapter.service(coyoteadapter.java:526) @ org.apache.coyote.http11.abstracthttp11processor.process(abstracthttp11processor.java:1078) @ org.apache.coyote.abstractprotocol$abstractconnectionhandler.process(abstractprotocol.java:655) @ org.apache.coyote.http11.http11nioprotocol$http11connectionhandler.process(http11nioprotocol.java:222) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.dorun(nioendpoint.java:1566) @ org.apache.tomcat.util.net.nioendpoint$socketprocessor.run(nioendpoint.java:1523) @ java.util.concurrent.threadpoolexecutor.runworker(unknown source) @ java.util.concurrent.threadpoolexecutor$worker.run(unknown source) @ org.apache.tomcat.util.threads.taskthread$wrappingrunnable.run(taskthread.java:61) @ java.lang.thread.run(unknown source)
i have similar "requirements" , working fine. setup follows
@configuration protected static class authenticationconfiguration extends globalauthenticationconfigureradapter { @autowired private userdetailsservice userdetailsservice; @autowired private passwordencoder passwordencoder; @override public void init(authenticationmanagerbuilder auth) throws exception { auth.userdetailsservice(userdetailsservice).passwordencoder( passwordencoder); } } my guess problem auth.jdbcauthentication() provide implementation of userdetailsservice returns core security user , not use implementation @ all. see javadoc:
add jdbc authentication authenticationmanagerbuilder , return jdbcuserdetailsmanagerconfigurer allow customization of jdbc authentication. method ensure userdetailsservice available getdefaultuserdetailsservice() method. note additional userdetailsservice's may override userdetailsservice default.
Comments
Post a Comment