spring security + MyBatisでログイン機能を作っておりますが、ユーザー名とパスワードを入力してもエラーになり、ログイン後の画面があるのですが、そちらに遷移しません。
DBにはちゃんとテーブルもありカラムもあり、値も入ってます。
どこが悪いのかわからず、苦戦しております。
ひとつ挙げるとしたら、securityController.javaのloginUser.name()で、loginUser.getName()という書き方をしたら、怒られ、loginUser.name()にしろと言われて、 直しても変わらずです。
どなたか、わかる方いましたらご教授お願いします。
実装したクラスは以下です。
//securityController.java package com.example.demo.securityController; import org.apache.tomcat.util.net.openssl.ciphers.Authentication; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class SecurityController { @GetMapping("/login") //configのloginPageでloginに来るように指定したので public String login() { return "login";//自作のloginページを表示 } @GetMapping("/hello") //configのdefaultSuccessUrlでhelloに来るように指定したので public String hello(Authentication loginUser,Model model) { /*AuthenticationでログインUserの情報を使うことができるので modelを使って、"username"にusernameを詰める*/ model.addAttribute("username",loginUser.name()); return "hello";//helloを表示。usernameをhelloで表示できる } }
// securityConfig.java package com.example.demo.securityConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Bean //パスワードのエンコード public BCryptPasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override //securityの設定をする protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests()//ルール、アクセスポリシーの設定 .antMatchers("/login").permitAll()//loginは認証なしでaccessできる .anyRequest().authenticated()//↑以外のすべてのURLリクエストをloginしないと見れない .and() .formLogin()//ログインの設定 .loginPage("/login") .defaultSuccessUrl("/hello", true)//ログインが成功したら/helloにいく .and() .logout()//ログアウトの設定 .logoutRequestMatcher(new AntPathRequestMatcher("/logout"));//logoutのURLを/logoutにする } @Override //認証方法の設定を行う protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth //userDetailsServiceを使って、認証を行う .userDetailsService(userDetailsService); } }
//securityMapper.java package com.example.demo.securityMapper; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Select; import com.example.demo.securityUser.MyUser; @Mapper public interface UserMapper { //select文。userテーブルから、usernameが一致しているものを検索 @Select("select * from loginuser where username = #{username}") public MyUser findByUsername(String username);//識別する }
//securityUser.java package com.example.demo.securityUser; import java.util.Collection; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import lombok.Getter; import lombok.Setter; public class MyUser implements UserDetails { @Getter @Setter private String username; @Getter @Setter private String password; private Collection<GrantedAuthority> authorities; @Override public Collection<? extends GrantedAuthority> getAuthorities() { return authorities; } @Override public boolean isAccountNonExpired() { // TODO 自動生成されたメソッド・スタブ return true; } @Override public boolean isAccountNonLocked() { // TODO 自動生成されたメソッド・スタブ return true; } @Override public boolean isCredentialsNonExpired() { // TODO 自動生成されたメソッド・スタブ return true; } @Override public boolean isEnabled() { // TODO 自動生成されたメソッド・スタブ return true; } }
//SecurityUserDetails.java package com.example.demo.SecurityUserDetails; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; import com.example.demo.securityMapper.UserMapper; import com.example.demo.securityUser.MyUser; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired //mapperをインスタンス化。DB接続をするMapperクラスを参照 private UserMapper userMapper; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { //findByUsernameで見つけてきたユーザ情報をmyUserに入れる MyUser myUser = userMapper.findByUsername(username); //UserDetailsにreturn return myUser; } }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/08 11:14