teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

必要そうな情報を追記しました。

2020/05/25 12:21

投稿

yys949
yys949

スコア9

title CHANGED
File without changes
body CHANGED
@@ -274,12 +274,6 @@
274
274
  @Autowired
275
275
  private LoginUserDao userDao;
276
276
 
277
- /**
278
- * UserDetailsServiceインタフェースの実装メソッド
279
- * フォームから取得したユーザ名でDBを検索し、合致するものが存在したとき、
280
- * パスワード、権限情報と共にUserDetailsオブジェクトを生成
281
- * コンフィグクラスで上入力値とDBから取得したパスワードと比較し、ログイン判定を行う
282
- */
283
277
  @Override
284
278
  public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
285
279
 
@@ -288,9 +282,6 @@
288
282
  if (user == null) {
289
283
  throw new UsernameNotFoundException("User" + userId + "was not found in the database");
290
284
  }
291
- //権限のリスト
292
- //AdminやUserなどが存在するが、今回は利用しないのでUSERのみを仮で設定
293
- //権限を利用する場合は、DB上で権限テーブル、ユーザ権限テーブルを作成し管理が必要
294
285
  List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>();
295
286
  GrantedAuthority authority = new SimpleGrantedAuthority("USERS");
296
287
  grantList.add(authority);
@@ -298,7 +289,6 @@
298
289
  //rawDataのパスワードは渡すことができないので、暗号化
299
290
  BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
300
291
 
301
- //UserDetailsはインタフェースなのでUserクラスのコンストラクタで生成したユーザオブジェクトを
302
292
  UserDetails userDetails = (UserDetails)new User(user.getUserName(), encoder.encode(user.getPassword()),grantList);
303
293
 
304
294
  return userDetails;

3

必要そうな情報を追記しました。

2020/05/25 12:21

投稿

yys949
yys949

スコア9

title CHANGED
File without changes
body CHANGED
@@ -168,7 +168,144 @@
168
168
  </body>
169
169
  </html>
170
170
  ```
171
+ ```UserEntity.java
172
+ @Entity
173
+ @Table(name = "USERS")
174
+ public class UserEntity implements UserDetails{
175
+
176
+ /**
177
+ *
178
+ */
179
+ private static final long serialVersionUID = 1L;
171
180
 
181
+ @Id
182
+ @Column(name = "USER_ID")
183
+ @NotEmpty
184
+ private String userId;
185
+
186
+ @Column(name = "USER_NAME")
187
+ @NotEmpty
188
+ private String userName;
189
+
190
+ @Column(name = "ADMIN_FLG")
191
+ private int adminFlg;
192
+
193
+ @Column(name = "PASSWORD")
194
+ @NotEmpty
195
+ private String password;
196
+
197
+ public String getUserId() {
198
+ return userId;
199
+ }
200
+
201
+ public void setUserId(String userId) {
202
+ this.userId = userId;
203
+ }
204
+
205
+ public String getUserName() {
206
+ return userName;
207
+ }
208
+
209
+ public void setUserName(String userName) {
210
+ this.userName = userName;
211
+ }
212
+
213
+ public int getAdminFlg() {
214
+ return adminFlg;
215
+ }
216
+
217
+ public void setAdminFlg(int adminFlg) {
218
+ this.adminFlg = adminFlg;
219
+ }
220
+
221
+ public String getPassword() {
222
+ return password;
223
+ }
224
+
225
+ public void setPassword(String password) {
226
+ this.password = password;
227
+ }
228
+
229
+ @Override
230
+ public Collection<? extends GrantedAuthority> getAuthorities() {
231
+ // TODO 自動生成されたメソッド・スタブ
232
+ return null;
233
+ }
234
+
235
+ @Override
236
+ public String getUsername() {
237
+ // TODO 自動生成されたメソッド・スタブ
238
+ return null;
239
+ }
240
+
241
+ @Override
242
+ public boolean isAccountNonExpired() {
243
+ // TODO 自動生成されたメソッド・スタブ
244
+ return false;
245
+ }
246
+
247
+ @Override
248
+ public boolean isAccountNonLocked() {
249
+ // TODO 自動生成されたメソッド・スタブ
250
+ return false;
251
+ }
252
+
253
+ @Override
254
+ public boolean isCredentialsNonExpired() {
255
+ // TODO 自動生成されたメソッド・スタブ
256
+ return false;
257
+ }
258
+
259
+ @Override
260
+ public boolean isEnabled() {
261
+ // TODO 自動生成されたメソッド・スタブ
262
+ return false;
263
+ }
264
+
265
+ }
266
+
267
+ ```
268
+ ```JpaUserDetailsServiceImpl.java
269
+ @Component
270
+ @Service
271
+ public class JpaUserDetailsServiceImpl implements UserDetailsService {
272
+
273
+ //DBからユーザ情報を検索するメソッドを実装したクラス
274
+ @Autowired
275
+ private LoginUserDao userDao;
276
+
277
+ /**
278
+ * UserDetailsServiceインタフェースの実装メソッド
279
+ * フォームから取得したユーザ名でDBを検索し、合致するものが存在したとき、
280
+ * パスワード、権限情報と共にUserDetailsオブジェクトを生成
281
+ * コンフィグクラスで上入力値とDBから取得したパスワードと比較し、ログイン判定を行う
282
+ */
283
+ @Override
284
+ public UserDetails loadUserByUsername(String userId) throws UsernameNotFoundException {
285
+
286
+ UserEntity user = userDao.findUser(userId);
287
+
288
+ if (user == null) {
289
+ throw new UsernameNotFoundException("User" + userId + "was not found in the database");
290
+ }
291
+ //権限のリスト
292
+ //AdminやUserなどが存在するが、今回は利用しないのでUSERのみを仮で設定
293
+ //権限を利用する場合は、DB上で権限テーブル、ユーザ権限テーブルを作成し管理が必要
294
+ List<GrantedAuthority> grantList = new ArrayList<GrantedAuthority>();
295
+ GrantedAuthority authority = new SimpleGrantedAuthority("USERS");
296
+ grantList.add(authority);
297
+
298
+ //rawDataのパスワードは渡すことができないので、暗号化
299
+ BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
300
+
301
+ //UserDetailsはインタフェースなのでUserクラスのコンストラクタで生成したユーザオブジェクトを
302
+ UserDetails userDetails = (UserDetails)new User(user.getUserName(), encoder.encode(user.getPassword()),grantList);
303
+
304
+ return userDetails;
305
+ }
306
+ }
307
+ ```
308
+
172
309
  ### 試したこと
173
310
 
174
311
  上述した通り、Principalを使うとユーザー名だけは取得できました。

2

必要そうな情報を追記しました。

2020/05/25 12:20

投稿

yys949
yys949

スコア9

title CHANGED
File without changes
body CHANGED
@@ -30,7 +30,7 @@
30
30
  */
31
31
  @PostMapping("/index")
32
32
  public String loginFormSubmit(@Valid @ModelAttribute UserForm loginUser,
33
- BindingResult result) {
33
+ BindingResult result, Model model) {
34
34
 
35
35
  if(result.hasErrors()) {
36
36
  return "/login";
@@ -43,14 +43,21 @@
43
43
 
44
44
  return "/login";
45
45
  }
46
-
46
+ setLoginInfo(userInfo);
47
47
  model.addAttribute(loginUser);
48
48
 
49
49
 
50
50
  return "redirect:/index";
51
51
  }
52
+
53
+ private void setLoginInfo(UserEntity userEntityResult) {
54
+
55
+ this.userForm.setUserId(userEntityResult.getUserId());
56
+ this.userForm.setPassword(userEntityResult.getPassword());
57
+ this.userForm.setUserName(userEntityResult.getUserName());
58
+
59
+ }
52
60
 
53
-
54
61
  @GetMapping("/index")
55
62
  public String afterLogin(@ModelAttribute UserForm loginUser, Model model) {
56
63
 
@@ -63,7 +70,52 @@
63
70
  }
64
71
 
65
72
  ```
73
+ ```UserService.java
74
+ @Service
75
+ @Transactional
76
+ public class UserService {
66
77
 
78
+ @Autowired
79
+ private UserRepository userRepository;
80
+
81
+ @Autowired
82
+ LoginUserDao loginUserDao;
83
+
84
+ @Autowired
85
+ private BCryptPasswordEncoder passwordEncoder;
86
+
87
+ public UserEntity create(UserEntity account, String rawPassword) {
88
+ String encodePassword = passwordEncoder.encode(rawPassword);
89
+ account.setPassword(encodePassword);
90
+
91
+ return userRepository.save(account);
92
+ }
93
+
94
+ public UserEntity loginCheck(String userId, String password) {
95
+ return loginUserDao.findUser(userId);
96
+ }
97
+
98
+ }
99
+ ```
100
+ ```LoginUserDao.java
101
+ @Repository
102
+ public class LoginUserDao {
103
+
104
+ @Autowired
105
+ EntityManager em;
106
+
107
+ public UserEntity findUser(String userId) {
108
+ String query = "";
109
+ query += "SELECT * ";
110
+ query += "FROM USERS ";
111
+ query += "WHERE USER_ID = :userId ";
112
+
113
+ return (UserEntity)em.createNativeQuery(query, UserEntity.class).setParameter("userId", userId)
114
+ .getSingleResult();
115
+ }
116
+ }
117
+
118
+ ```
67
119
  ```login.html
68
120
  <!DOCTYPE html>
69
121
  <html xmlns:th="http://thymeleaf.org">
@@ -126,7 +178,9 @@
126
178
  @ModelAttributeを両方に書けばいくかと思って書いたのですがデバッグするとUserFormがnullになっていました。
127
179
 
128
180
 
181
+ 上記のような感じで書いてあります。
129
- ほかにど情報を書けばいいかわからなかったのでとりあえずController処理htmlのほうだけ書きましたが必要な情報あれば教えください。
182
+ ログイン先画面への移行はできたのですが、そもそもuserInfoとしたところユーザー情報をすべ返すように作ったと思ったのにnullが返ってきてます
183
+ dao内の書き方が悪いのでしょうか。
130
184
 
131
185
  全然わからなくなってしまったため教えていただきたいです。
132
186
  お手数おかけしますがよろしくお願いします。

1

誤字

2020/05/25 12:05

投稿

yys949
yys949

スコア9

title CHANGED
File without changes
body CHANGED
@@ -54,7 +54,7 @@
54
54
  @GetMapping("/index")
55
55
  public String afterLogin(@ModelAttribute UserForm loginUser, Model model) {
56
56
 
57
- model.addAttribute("userId", userId);
57
+ model.addAttribute("loginUser", loginUser);
58
58
 
59
59
  return "/index";
60
60
  }