質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

解決済

SpringBootで作ったログイン機能でログイン後にユーザー情報を取得したい

yys949
yys949

総合スコア9

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

3回答

0評価

1クリップ

11637閲覧

投稿2020/05/24 16:22

編集2020/05/25 12:21

前提・実現したいこと

SpringBootをつかってログイン機能を勉強として作っています。
認証はSpringSecurityを使っています。

ログインボタンを押したらユーザーの名前とログインに使用したIDをログイン後の画面に表示したいのですが、Controllerの処理の書き方がよくわからずにいます。
principalを使ったらユーザー名だけは取得できたのですが、ユーザーの全情報を取得できるようにしたいです。

DBにはユーザー情報が1レコード登録してありそれを取り出してControllerで受け渡しをしたいです。

該当のソースコード

LoginController.java

@Controller public class LoginController { @Autowired UserForm userForm; @Autowired UserService userService; @GetMapping({"/", "/login"}) public String loginForm(UserForm userForm, Model model) { return "/login"; } /* * ログイン認証処理 */ @PostMapping("/index") public String loginFormSubmit(@Valid @ModelAttribute UserForm loginUser, BindingResult result, Model model) { if(result.hasErrors()) { return "/login"; } UserEntity userInfo = userService.loginCheck(loginUser.getUserId(), loginUser.getPassword()); if(userInfo == null) { model.addAttribute("error", "error"); return "/login"; } setLoginInfo(userInfo); model.addAttribute(loginUser); return "redirect:/index"; } private void setLoginInfo(UserEntity userEntityResult) { this.userForm.setUserId(userEntityResult.getUserId()); this.userForm.setPassword(userEntityResult.getPassword()); this.userForm.setUserName(userEntityResult.getUserName()); } @GetMapping("/index") public String afterLogin(@ModelAttribute UserForm loginUser, Model model) { model.addAttribute("loginUser", loginUser); return "/index"; } }

UserService.java

@Service @Transactional public class UserService { @Autowired private UserRepository userRepository; @Autowired LoginUserDao loginUserDao; @Autowired private BCryptPasswordEncoder passwordEncoder; public UserEntity create(UserEntity account, String rawPassword) { String encodePassword = passwordEncoder.encode(rawPassword); account.setPassword(encodePassword); return userRepository.save(account); } public UserEntity loginCheck(String userId, String password) { return loginUserDao.findUser(userId); } }

LoginUserDao.java

@Repository public class LoginUserDao { @Autowired EntityManager em; public UserEntity findUser(String userId) { String query = ""; query += "SELECT * "; query += "FROM USERS "; query += "WHERE USER_ID = :userId "; return (UserEntity)em.createNativeQuery(query, UserEntity.class).setParameter("userId", userId) .getSingleResult(); } }

login.html

index.html

<!DOCTYPE html> <html xmlns:th="http://thymeleaf.org"> <head> <meta charset="UTF-8"> <title>ログイン後の画面</title> </head> <body> <div th:object="${loginUser}"> <p>ログインユーザーID:<span th:text="*{userId}"></span></p> <p>ログインユーザー名:<span th:text="*{userName}"></span></p> </div> </body> </html>

UserEntity.java

@Entity @Table(name = "USERS") public class UserEntity implements UserDetails{ /** * */ private static final long serialVersionUID = 1L; @Id @Column(name = "USER_ID") @NotEmpty private String userId; @Column(name = "USER_NAME") @NotEmpty private String userName; @Column(name = "ADMIN_FLG") private int adminFlg; @Column(name = "PASSWORD") @NotEmpty private String password; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public int getAdminFlg() { return adminFlg; } public void setAdminFlg(int adminFlg) { this.adminFlg = adminFlg; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } @Override public Collection<? extends GrantedAuthority> getAuthorities() { // TODO 自動生成されたメソッド・スタブ return null; } @Override public String getUsername() { // TODO 自動生成されたメソッド・スタブ return null; } @Override public boolean isAccountNonExpired() { // TODO 自動生成されたメソッド・スタブ return false; } @Override public boolean isAccountNonLocked() { // TODO 自動生成されたメソッド・スタブ return false; } @Override public boolean isCredentialsNonExpired() { // TODO 自動生成されたメソッド・スタブ return false; } @Override public boolean isEnabled() { // TODO 自動生成されたメソッド・スタブ return false; } }

JpaUserDetailsServiceImpl.java

@Component @Service public class JpaUserDetailsServiceImpl implements UserDetailsService { //DBからユーザ情報を検索するメソッドを実装したクラス @Autowired private LoginUserDao userDao; @Override public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException { UserEntity user = userDao.findUser(userId); if (user == null) { throw new UsernameNotFoundException("User" + userId + "was not found in the database"); } List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>(); GrantedAuthority authority = new SimpleGrantedAuthority("USERS"); grantList.add(authority); //rawDataのパスワードは渡すことができないので、暗号化 BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(); UserDetails userDetails = (UserDetails)new User(user.getUserName(), encoder.encode(user.getPassword()),grantList); return userDetails; } }

試したこと

上述した通り、Principalを使うとユーザー名だけは取得できました。
ただそれだけでなく、UserFormにある情報(ユーザーIDとユーザー名の両方)を取得したいです。

@PostMappingだけで完結させればいいかと思ってloginFormSubmit()にいろいろ書いていたのですが、それだとログイン後の画面URLに遷移したときGETがないといけないといったエラーがでてしまったため@GetMappingの処理も書きました。
@ModelAttributeを両方に書けばいくかと思って書いたのですがデバッグするとUserFormがnullになっていました。

上記のような感じで書いてあります。
ログイン先の画面への移行はできたのですが、そもそものuserInfoとしたところがユーザー情報をすべて返すように作ったと思ったのにnullが返ってきています。
dao内の書き方が悪いのでしょうか。

全然わからなくなってしまったため教えていただきたいです。
お手数おかけしますがよろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Spring Security

Spring Securityは、Springのサブプロジェクトの一つでWebアプリケーションに必要な機能を追加します。正規ユーザーであるかを確認するための「認証機能」と、ユーザーのアクセスを制御する「認可機能」を簡単に追加することが可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。