在使用 Spring Security 时遇到一个问题,我自己定义了 User 的 POJO,UserDetail 是用的官方的,然后官方的一个类名也叫 User,所以只能在这里把官方的全名写出来,就是很长,有没有更优雅的方法来解决?
或许只能给自己的类改名?但是还有比 User 更清楚明确的名字吗...
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("User not found");
} else {
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
for (Role role : user.getRoles()) {
grantedAuthorities.add(new SimpleGrantedAuthority(role.getName()));
}
return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities);
}
}
1
AS4694lAS4808 2020-04-30 14:33:06 +08:00
UserEntity...
|
2
littleylv 2020-04-30 14:42:01 +08:00
可以 import org.springframework.security.core.userdetails.User as xxx 吗
php 是可以 use xx\xx\xx as yy,然后用的地方直接 yy |
3
jin7 2020-04-30 14:53:23 +08:00
MyUser 哈哈
|
4
fgwmlhdkkkw 2020-04-30 14:55:47 +08:00
@littleylv oracle: 你可以提,但是我没必要改。
|
6
hantsy 2020-04-30 15:01:30 +08:00
1 。 自己的 User 可以实现 UserDetails 接口,省事一点。
2 。 然后 UserDetailsService, 一行代码解决。 @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { return this.users.findByUsername(username) .orElseThrow(() -> new UsernameNotFoundException("Username: " + username + " not found")); } |
7
whypool 2020-04-30 15:03:01 +08:00
不会改名?
|
8
hantsy 2020-04-30 15:05:51 +08:00
|
9
Lin0936 2020-04-30 15:05:57 +08:00
改成 Uesr
|
10
ma836323493 2020-04-30 15:45:07 +08:00
创建一个内部类 SpringUser 类继承 spring 的 User
|
11
1oNflow OP @hantsy 感谢回复,学到了,这段代码我应该是之前从教程里学的,各种教程(可能时间久了)里用 java8 的不多,自己也没机会体验什么情况用 java8 更好...实际工作中会强制要求使用 java8 吗?
|
12
hantsy 2020-04-30 18:38:32 +08:00
@1oNflow 我个人玩一直跟最新版本。
项目中早就用 Java 11 了,很多开源框架慢慢会把 Java 8 作为可选的,Java 11 为主要的支持版本了,如 Quarkus 计划在 1.6 中删除 Java 8 支持。 |
13
1oNflow OP @hantsy 了解。
另外能问下你在当 findByUsername 没有这个用户名时选择抛出了异常,但是我还有一个用户注册功能,并且对表单数据进行了后端 validation,其中有一项是判断数据库是否已经存在相同的用户名,在这种情况下,我也要调用 findByUsername 去看有没有这个用户,如果存在就返回校验失败。 所以此时抛出异常(此前不存在同名用户)恰恰是“正常”的情况无须处理,所以使用 try catch 感觉处理比较棘手,反而我最开始的返回 null 的方案比较好办。 想问下什么场合要抛出异常,我描述的这个情景使用异常有比较好的解决方案吗? |
15
enrio 2020-04-30 21:09:34 +08:00
我记得有个人说过,编程不要用 User 这个词。
|
17
jwenjian 2020-05-01 09:19:48 +08:00
My***
|
18
jwenjian 2020-05-01 09:21:38 +08:00
@1oNflow 存在不存在 可以用 countByUsername 判断返回数量,也可以用 exists 返回一个 boolean 值。
|
19
AAASUKA 2020-05-01 09:51:47 +08:00
所有自定义类写成 Myxxxx
|
20
daozhihun 2020-05-01 18:10:29 +08:00
java 不能 import as,如果你遇到了这个情况,除了写全包名,还可以考虑一个子类的实现。比如
public class XXXService { // Spring 自己的 User private static class SystemUserEntity extends UserDetails { } } 不过这样做的时候注意一下不会有副作用,比如 className 变了 |