当我有两种类型的用户时,如何使用spring security保护rest api

当我有两种类型的用户时,如何使用spring security保护rest api,spring,spring-boot,spring-security,Spring,Spring Boot,Spring Security,我有两个实体:老师和学生。 我想让一些端点仅对教师可用,而另一些端点对学生可用。 我认为最简单的方法是使用SpringSecure(或者我也应该使用JWT?) 但我不确定我是否理解教程。我的想法是: 制作两个UserServiceDetails(TeacherServiceDetails,它连接到教师JPA存储库,对于学生也是如此)和两个扩展WebSecurityConfigureAdapter的类。 够了吗?我如何为他们设定角色?我没有在表中指定角色,可以硬编码吗?我不希望有其他用户,所以实施

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

制作两个UserServiceDetails(TeacherServiceDetails,它连接到教师JPA存储库,对于学生也是如此)和两个扩展WebSecurityConfigureAdapter的类。 够了吗?我如何为他们设定角色?我没有在表中指定角色,可以硬编码吗?我不希望有其他用户,所以实施它是个好主意吗

private final String ROLE = "ROLE_TEACHER";

春季保安会很好的。顺便说一句,它也支持JWT令牌,但除非您正在构建一个前端位于其他来源和RESTful服务器的fullstack应用程序,否则您不一定需要它。Spring安全表单登录即可

实际上,您不需要两个userdetails服务,您只需要确保为每个用户实体设置一个角色(当然,还要将其与实体一起持久化)

然后,您的UserDetails服务将如下所示:

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);
    }
}
公共类SpringDataUserDetailsService实现UserDetailsService{
私人用户服务;
@自动连线
public void setUserService(UserService UserService){
this.userService=userService;
}
@凌驾
公共用户详细信息loadUserByUsername(字符串用户名){
User=userService.findByUserName(用户名);
如果(user==null){抛出新的UsernameNotFoundException(username);}
Set grantedAuthories=new HashSet();
user.getRoles().forEach(r->
添加(新的SimpleGrantedAuthority(r.getName()));
返回新的org.springframework.security.core.userdetails.User(
user.getUsername()、user.getPassword()、授权机构);
}
}

ok我想我明白了。如果我想使用电子邮件而不是用户名怎么办?只需将userService.findByUserName(用户名)更改为userService.findByEmail(电子邮件)?它会自动在JPA存储库中找到方法吗?编辑:用户服务呢?Spring也可以注入适当的参数(技术人员或学生)?是的,只需将方法的参数更改为
email
,然后按您所说的做,就可以了。关于这个
UserService
:我个人只是用它来破解密码。因此,我的
userserviceinpl
基本上只有查找实体的方法(根据存储库的方法调用)和保存实体的方法(根据存储库的方法调用+BCrypts密码)。在Spring中,服务是持久层和业务逻辑之间的代理。在您的情况下,您的UserServiceImpl中会有两个实体的方法,例如
saveTeacher
saveStudent
,等等。。。祝你好运:)非常感谢!我花了很多时间寻找解决方案。现在我知道该怎么办了:D