Spring MVC と Hibernate を使用して、ユーザーが名前とパスワードを入力してクリックできるログイン ページを作成しています。 ログイン ボタンをクリックして、関連ページにアクセスします。ログインタスクを完了しようと何度も試みましたが、残念ながら完了できませんでした。このタスクを完了するには助けが必要です。 これが私が試したコードです。
DAOInterface クラス
Admin loginAdmin(String name, String password);
DAOImplementation class
@Override
public Admin loginAdmin(String name, String password) {
Admin admin = (Admin) sessionFactory.getCurrentSession().createNativeQuery(name, password);
sessionFactory.getCurrentSession().createQuery("select name ,password from Admin where
name="+"'" + name +"'" +"and password=" + "'"+password+"'");
if(admin.getName() == name && admin.getPassword() == password){
return admin;
}else{
return admin;
}
ServiceInterface class
Admin loginAdmin(String name, String password);
ServiceImplementation class
@Override
@Transactional
public Admin loginAdmin(String name, String password) {
return adminDao.loginAdmin(name, password);
}
Rest コントローラー クラス
@GetMapping("login/{name}/{password}")
private Admin loginAdmin(@PathVariable("name") String name, @PathVariable("password")String password){
//boolean admin =
Admin admin= new Admin();
admin = adminService.loginAdmin(name, password);
if(name == admin.getName() && password == admin.getPassword()){
System.out.println("Login successfull");
return admin;
}else{
System.out.println("user name and password is null");
return admin;
}
}
postmain から API を呼び出すとこの例外が発生する
[Request processing failed; nested exception is javax.persistence.PersistenceException: org.hibernate.MappingException: Unknown SqlResultSetMapping [coder]] with root cause
org.hibernate.MappingException: Unknown SqlResultSetMapping [coder]
at org.hibernate.query.internal.NativeQueryImpl.setResultSetMapping(NativeQueryImpl.java:122)
at org.hibernate.internal.AbstractSharedSessionContract.createNativeQuery(AbstractSharedSessionContract.java:907)
at org.hibernate.internal.AbstractSharedSessionContract.createNativeQuery(AbstractSharedSessionContract.java:103)
at com.LibraryManagment.spring.dao.AdminDAOImp.loginAdmin(AdminDAOImp.java:43)
at com.LibraryManagment.spring.service.AdminServiceImpl.loginAdmin(AdminServiceImpl.java:43)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:367)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:118)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy347.loginAdmin(Unknown Source)
at com.LibraryManagment.spring.controller.AdminController.loginAdmin(AdminController.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:879)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.filters.CorsFilter.handleNonCORS(CorsFilter.java:352)
at org.apache.catalina.filters.CorsFilter.doFilter(CorsFilter.java:171)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
これを完了したら、フロントエンドとして使用した Angular 8 からリクエストを送信します
なぜそうしないのか'得るクエリからの休止状態エンティティ?それはクエリを実行する方法に関連していると思います。また、クエリに文字列を追加することは避け、適切なプレースホルダーを使用してください。この方法では SQL インジェクションが発生する危険があります。さらに、ログインを管理するために Spring Security を確認すると、作業が容易になるはずです。
– ラシオ2020 年 9 月 3 日 12:29
認証/認可機能を管理するには、Spring Security フレームワークを検討してください。 「管理者」をどのように処理しますか?他のリクエストが来たら?離れて上記のエラーは結果なしのクエリのようです。データベースに対してクエリを直接実行してみてください。
– Guilherme Ribeiro 開発者2020 年 9 月 3 日 13:19
@GuilhermeRibeiroDeveloper これの背後にある理由は、私が Spring と Hibernate を初めて使用するため、これを簡単な方法で実行しようとしているためです。はい、Spring Security が対処することはわかっています。データベースに対してこのクエリを実行すると、適切な結果が得られます。
– ワシフ ザマン2020 年 9 月 4 日 17:14
@rascio 質問する理由は、このコードを書くことができないためです。Google で検索しているのに結果が得られなかったので、手伝っていただければこのタスクを完了できると幸いです。
– ワシフ ザマン2020 年 9 月 4 日 17:16
(このソリューションの前提は、Admin オブジェクトが休止状態エンティティであることです)
コードを機能させるには、DAO クラスを次のように変更する必要があります。
public Admin findByUsernameAndPassword(String name, String pass) {
Session session = sessionFactory.getCurrentSession();
return (Admin) session.createQuery("FROM Admin WHERE name = :name AND password = :password")
.setParameter("name", name)
.setParameter("password", pass)
.getSingleResult();
}
そしてあなたのサービスとして:
public Admin login(String user, String pass) {
return dao.findByUsernameAndPassword(user, pass);
}
コントローラーでは、サービスから返された Admin が null かどうかを確認するだけで、認証が適切かどうかを知ることができます。 (コードでは == を使用して文字列を比較していました。それらには .equals() を使用する必要があります)
ところで、コメントで提案したように、認証 (および認可) は非常に複雑になりやすいため、この種のアプローチはお勧めしません。
Spring はよく使用され、テストされているフレームワークであるため、開発時に多くのコードを記述する必要がなくなり、ドキュメントの検討に時間を費やす価値があります (したがって、偶発的なバグのリスクが軽減されます)。 SpringBoot を使用している場合、設定は非常に簡単です。
開発に役立つガイドのリストは次のとおりです。
Spring Securityのセットアップ: https://spring.io/guides/gs/se硬化ウェブ/ Spring Security と DB ユーザー: https://www.baeldung.com/spring-security-authentication-with-a-database Spring Security: https://spring.io/projects/spring-security#learn Spring Data JPA (休止状態での作業に非常に便利): https://docs.spring.io/spring-data/jpa/docs/2.3.3.RELEASE/reference/html/#reference