我正在寻找使我的应用程序更安全,并让我了解正在发生的一切 .
我有一个登录Spring Boot . 此登录调用UserDetailsService实现,如下所示:
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
User user = userRepository.findByUsername(username);
if (user.getUsername().isEmpty()) {
throw new UsernameNotFoundException(
"No user found with username: "+ username);
}
String role;
if (user.getUserType().contains("Gp")){
role = "ROLE_GP";
}
else if(user.getUserType().contains("Patient")){
role = "ROLE_PATIENT";
}
else {
role = "ROLE_ADMIN";
}
boolean enabled = true;
boolean accountNonExpired = true;
boolean credentialsNonExpired = true;
boolean accountNonLocked = true;
return new org.springframework.security.core.userdetails.User
(user.getUsername(),
user.getPassword(), enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked,
getAuthorities(Arrays.asList(role)));
}
private static List<GrantedAuthority> getAuthorities (List<String> roles) {
List<GrantedAuthority> authorities = new ArrayList<>();
for (String role : roles) {
authorities.add(new SimpleGrantedAuthority(role));
}
return authorities;
}
这创建了一个具有用户角色的会话,因此我可以配置WebSecurityConfigurerAdapter等 .
所以我的问题是用JWT添加过滤器究竟是做什么的? Spring Security是否已默认执行这些操作,因为我所做的已经创建了经过授权和验证的用户 .
谢谢 .
1 回答
在更高层次上:
你取得的成绩是
statefull authentication
. 虽然JWT为您的应用程序提供无状态身份验证(无需创建/销毁任何会话 . 每个请求都带有一个令牌来访问资源 . ) . 虽然,使用JWT,您也可以进行有状态身份验证 .技术上:
在两种方法中,最终结果都是相同的 . 主要区别在于,在您的方法中,您负责对用户进行身份验证并提供权限 . 在JWT中,对用户进行身份验证的责任属于名为 Authorization server 的第三方 . 在您的应用程序中,您只需验证JWT并根据权限允许或拒绝访问所需资源 .
根据您的要求和架构,您可以选择任何 . 在微服务领域,无状态方法更为常见且最适合 .
取决于您如何实现它 . 通常,JWT过滤器首先通过签名或加密验证令牌,然后从JWT读取用户权限 . 因此不需要任何userDetails服务的实现 .