現在、springフレームワーク、spring security、MyBatis、MySQLでログイン認証システムを作ろうとしています。
しかし、実行してみると、
An internal error occurred while trying to authenticate the user.
とエラーが出て、
Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): net.javaguides.springboot.techshare.auth.UserRepositry.identifyUser
と、原因はこれだと書いてあります。
多分、DBにアクセスできてないのかなと思っておりまして、
この写真の、identifyUserメソッドにつきましては、下にコードを貼りましたのでご確認いただけると幸いです。
アーキテクチャに記載の使うクラスなどのコードを下に全て貼らさせていただきます。
IDEはeclipseです。
アーキテクチャは、こんな感じですが、間違っていたら申し訳ありません。
コントローラーは以下です
Java
1//RootController.java 2 3package net.javaguides.springboot.techshare; 4 5import org.springframework.stereotype.Controller; 6import org.springframework.web.bind.annotation.RequestMapping; 7 8@Controller 9public class RootController { 10 11 @RequestMapping("/") 12 public String root() { 13 return "index"; 14 } 15} 16
HTML
1<!DOCTYPE html> 2<html> 3 4<head> 5 <meta charset="UTF-8"> 6 <title>Insert title here</title> 7</head> 8 9 <body> 10 11 <h1>Hello!!</h1> 12 13 </body> 14 15</html>
SecurityConfigurationクラス → ユーザー認証の設定を行うためのもの
java
1//SecurityConfiguration.java 2 3package net.javaguides.springboot.techshare.conf; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.context.annotation.Bean; 7import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 8import org.springframework.security.config.annotation.web.builders.HttpSecurity; 9import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 10import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 11import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 12import org.springframework.security.crypto.password.PasswordEncoder; 13 14import net.javaguides.springboot.techshare.auth.DatabaseUserDetailsService; 15 16 17@EnableWebSecurity 18public class SecurityConfigration extends WebSecurityConfigurerAdapter { 19 20 @Autowired 21 private DatabaseUserDetailsService userDetailsService; 22 23 @Override 24 protected void configure(AuthenticationManagerBuilder auth) throws Exception { 25 auth.userDetailsService(userDetailsService); 26 } 27 28 @Override 29 protected void configure(HttpSecurity http) throws Exception { 30 http.authorizeRequests() // 31 .anyRequest().authenticated() 32 .and() 33 .formLogin(); 34 } 35 36 @Bean 37 public PasswordEncoder passwordEncoder() { // 38 return new BCryptPasswordEncoder(); 39 } 40}
次に、User Detailsインターフェースを実装した、Userクラを作成
Java
1//User.java 2 3package net.javaguides.springboot.techshare.auth; 4import java.util.Collection; 5 6import org.springframework.security.core.GrantedAuthority; 7import org.springframework.security.core.userdetails.UserDetails; 8 9public class User implements UserDetails { 10 11 private static final long serialVersionUID = -4292831594774687625L; 12 13 private long id; 14 15 private String email; 16 17 private String username; 18 19 private String password; 20 21 @Override 22 public String getPassword() { 23 return password; 24 } 25 26 @Override 27 public String getUsername() { 28 return username; 29 } 30 31 public long getId() { 32 return id; 33 } 34 35 public void setId(long id) { 36 this.id = id; 37 } 38 39 public String getEmail() { 40 return email; 41 } 42 43 public void setEmail(String email) { 44 this.email = email; 45 } 46 47 @Override 48 public Collection<? extends GrantedAuthority> getAuthorities() { 49 // TODO 自動生成されたメソッド・スタブ 50 return null; 51 } 52 53 @Override 54 public boolean isAccountNonExpired() { 55 // TODO 自動生成されたメソッド・スタブ 56 return false; 57 } 58 59 @Override 60 public boolean isAccountNonLocked() { 61 // TODO 自動生成されたメソッド・スタブ 62 return false; 63 } 64 65 @Override 66 public boolean isCredentialsNonExpired() { 67 // TODO 自動生成されたメソッド・スタブ 68 return false; 69 } 70 71 @Override 72 public boolean isEnabled() { 73 // TODO 自動生成されたメソッド・スタブ 74 return false; 75 } 76 77}
次に、MyBatisの実装
Mapperインターフェースを実装したUserRepositryクラスを作成 <--正確なスペルはRepositoryだが、気にしなくて良いです
java
1//UserRepositry.java 2 3package net.javaguides.springboot.techshare.auth; 4 5import org.apache.ibatis.annotations.Mapper; 6 7@Mapper 8public interface UserRepositry { 9 10 public User identifyUser(String email); 11 12}
次に、MapperXMLファイルの作成
XML
1//UserRepositry.xml 2 3<?xml version = "1.0" encoding = "UTF-8"?> 4 5<!DOCTYPE mapper PUBLIC 6 "-//mybatis.org//DTD Mapper 3.0//EN" 7 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 8 9<mapper namespace="net.javaguides.springboot.techshare.auth.UserRepositry"> 10 11 <select id="identifyUser" parameterType="java.lang.String" resultMap="userDetails"> 12 13 <![CDATA[ 14 SELECT ID, 15 EMAIL, 16 NAME, 17 PASSWORD 18 19 FROM USERS; 20 21 22 ]]> 23 </select> 24 25 <resultMap type="net.javaguides.springboot.techshare.auth.User" id="userDetails"> 26 </result property="id" column="ID"> 27 </result property="email" column="EMAIL"> 28 </result property="username" column="NAME"> 29 </result property="password" column="PASSWORD"> 30 </resultMap> 31 32</mapper>
DBのテーブルのカラムは以下の通りです。
ID
EMAIL
NAME
PASSWORD
次に、User Details Serviceインンターフェースを実装した
DatabaseUserDetailsServiceクラスの作成
Java
1//DatabaseUserDetailsService.java 2 3package net.javaguides.springboot.techshare.auth; 4 5import org.springframework.beans.factory.annotation.Autowired; 6import org.springframework.security.core.userdetails.UserDetails; 7import org.springframework.security.core.userdetails.UserDetailsService; 8import org.springframework.security.core.userdetails.UsernameNotFoundException; 9import org.springframework.stereotype.Service; 10 11@Service 12public class DatabaseUserDetailsService implements UserDetailsService { 13 14 @Autowired 15 private UserRepositry userRepositry; 16 17 @Override 18 public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { 19 20 return userRepositry.identifyUser(username); 21 } 22}
この一連の実装は、誰かの動画を拝見してやっておりまして、
UserRepository.javaのidentifyUser(String email);
の引数には、DBのemailの値が入るという解釈であっていますでしょうか。
また、ブラウザの、ログイン画面のUserNameにはカラムのEMAILを入れ、PassWordには、カラムのPASSWORDを入れる仕組みにしていますが、
内部では、ブラウザで入力したEMAILとPASWWORDと、DBのEMAILとPASSWORDが一致してたら、index.htmlを返すよ、という動作をしているのでしょうか。
あまり仕組みもわかっておらず、エラー解決ができないため、ご教授頂けると幸いです。
あなたの回答
tips
プレビュー