java - Spring MVCでシンプルなログインRest APIを作成するには?

okwaves2024-01-25  191

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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。