首页 > 解决方案 > 当我有两种类型的用户时,如何使用 spring security 保护 rest api

问题描述

我有两个实体:老师和学生。我想让一些端点只对教师可用,而另一些对学生可用。我认为最简单的方法是使用 spring secure (或者我也应该使用 JWT ?)但我不确定我是否理解教程。我的点子 :

制作两个 UserServiceDetails(TeacherServiceDetails 连接到 Teacher JPA 存储库,同样适用于学生)和两个扩展 WebSecurityConfigureAdapter 的类。够了吗?如何为他们设置角色?我没有在表中指定角色,我可以对其进行硬编码吗?我不期待任何其他用户,所以实施它是个好主意吗?:

private final String ROLE = "ROLE_TEACHER";

标签: springspring-bootspring-security

解决方案


Spring Security 会很好。顺便说一句,它还支持 JWT 令牌,但除非您正在构建一个具有其他来源的前端和 RESTful 服务器的全栈应用程序,否则您不一定需要它。Spring Security 表单登录就可以了。

实际上,您不需要两个 UserDetailsS​​ervices,您只需要确保为每个用户实体设置一个角色(并将其与实体一起保留)。

然后,您的 UserDetailsS​​ervice 将如下所示:

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);
    }
}

推荐阅读