【发布时间】:2020-10-14 18:07:25
【问题描述】:
我希望使用带有 MySql 的 Spring Security 来存储用户、角色、权限(权限)。我做了以下事情:
ApplicationUser(id、firstName、lastName、用户名、密码、角色)
ApplicationRole(id、名称、描述、权限)实现 GrantedAuthority
ApplicationPermission(id, name, description) 实现 GrantedAuthority
我创建了一个实现 UserDetailService 的类。在 loadUserByUsername 方法中,我执行以下操作:
ApplicationUser applicationUser = userRepository.findByUsername(username);
if(applicationUser == null) {
throw new UsernameNotFoundException(username);
}
// Extract role/role permission grantedAuthorities from db user
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
for (Role role: applicationUser.getRoles()) {
grantedAuthorities.add(role);
grantedAuthorities.addAll(role.getPermissions());
}
return new User(applicationUser.getUsername(), applicationUser.getPassword(), grantedAuthorities);
但是,这仍然让我有点困惑,这里有一些我的问题......
- 是否有必要在我的 ApplicationRole 上实现 GrantedAuthority 和 ApplicationPermission 类。我没有看到其他人在很多地方这样做 我见过的例子,但它似乎让我的生活更轻松 这样我就可以得到它们并按原样传递它们。
- 我没有 用我的 ApplicationUser 类实现了 UserDetails。如果我要 这样做的目的是什么?是唯一的原因,所以我会 能够自定义 getAuthorities、isAccountNonExpired、 isAccountNonLocked、isCredentialsNonExpired、isEnabled 方法?是 甚至有这些方法的默认实现,或者只有当我 创建我的版本。为什么我需要实现 getAuthorities 如果我已经在使用 loadbyUserName 执行此操作 UserDetailsServiceImpl?
- SimpleGrantedAuthority 的用途是什么?我看到它实现了 GrantedAuthority 并且只接受一个字符串名称。但是,我觉得我不需要使用它,因为我使用我的 ApplicationRole 和 ApplicationPermission 类实现了 GrantedAuthority。
我认为我的问题是我对何时/如何正确实施 UserDetail 和 UserDetailService 感到困惑,以确保我从数据库中加载权限并在每次用户登录时设置它们。此外,是否有任何意义以我的方式使用我的 ApplicationRole 和 ApplicationPermission 类实现 GrantedAuthority?
【问题讨论】:
标签: java spring spring-boot spring-security