spring - 当我有两种类型的用户时,如何使用 spring security 保护 rest api
问题描述
我有两个实体:老师和学生。我想让一些端点只对教师可用,而另一些对学生可用。我认为最简单的方法是使用 spring secure (或者我也应该使用 JWT ?)但我不确定我是否理解教程。我的点子 :
制作两个 UserServiceDetails(TeacherServiceDetails 连接到 Teacher JPA 存储库,同样适用于学生)和两个扩展 WebSecurityConfigureAdapter 的类。够了吗?如何为他们设置角色?我没有在表中指定角色,我可以对其进行硬编码吗?我不期待任何其他用户,所以实施它是个好主意吗?:
private final String ROLE = "ROLE_TEACHER";
解决方案
Spring Security 会很好。顺便说一句,它还支持 JWT 令牌,但除非您正在构建一个具有其他来源的前端和 RESTful 服务器的全栈应用程序,否则您不一定需要它。Spring Security 表单登录就可以了。
实际上,您不需要两个 UserDetailsServices,您只需要确保为每个用户实体设置一个角色(并将其与实体一起保留)。
然后,您的 UserDetailsService 将如下所示:
public class SpringDataUserDetailsService implements UserDetailsService {
private UserService userService;
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
@Override
public UserDetails loadUserByUsername(String username) {
User user = userService.findByUserName(username);
if (user == null) {throw new UsernameNotFoundException(username); }
Set<GrantedAuthority> grantedAuthorities = new HashSet<>();
user.getRoles().forEach(r ->
grantedAuthorities.add(new SimpleGrantedAuthority(r.getName())));
return new org.springframework.security.core.userdetails.User(
user.getUsername(), user.getPassword(), grantedAuthorities);
}
}
推荐阅读
- windows - 在 Windows 10 上永久允许(单个)未签名的驱动程序
- jaxb - 使用嵌套模式解组 xml
- python - 如何将模型传递给所有模板都从 base.html 扩展的 base.html
- php - 迭代或获取 Object 属性
- php - 不能写入空白行;改用删除
- java - 具有约束布局的拖放事件
- sql - 根据多个字段比较 MS Access 中的 2 个表,并获得一个新表,其中的值不包含在第一个表中
- python - Python:根据另一列值从 DataFrame 中删除重复项
- android - 使用post表单数据上传axios图片总是返回网络错误
- python - 使用 SFTP 将文件从 AWS S3 传输到 Unix 服务器