質問編集履歴
4
必要そうな情報を追記しました。
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
必要そうな情報を追記しました。
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
必要そうな情報を追記しました。
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
|
-
|
182
|
+
ログイン先の画面への移行はできたのですが、そもそものuserInfoとしたところがユーザー情報をすべて返すように作ったと思ったのにnullが返ってきています。
|
183
|
+
dao内の書き方が悪いのでしょうか。
|
130
184
|
|
131
185
|
全然わからなくなってしまったため教えていただきたいです。
|
132
186
|
お手数おかけしますがよろしくお願いします。
|
1
誤字
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("
|
57
|
+
model.addAttribute("loginUser", loginUser);
|
58
58
|
|
59
59
|
return "/index";
|
60
60
|
}
|