我正在Spring启动应用程序中实现基于JWT的身份验证。我有一个Accounts
表,其中包含用户的银行帐户信息。现在,用户使用该表中的帐号和密码登录。问题是登录后,用户可以使用JWT分配给它的令牌访问任何内容。他甚至可以更改其他人的帐户信息。如何仅限制对创建令牌的用户进行访问?
每个用户都应该只能访问与该用户关联的信息,因此无法创建roles
。 JWT是否提供任何此类功能,还是我必须手动检查令牌?我可以解析令牌并从中检索帐号,并将其与控制器方法中传递的帐号进行比较,但它似乎不是一个简洁的解决方案,因为这将需要更改每个Controller方法。
答案 0 :(得分:2)
由于您的案例中的安全性取决于业务逻辑,我想在Auth提供商方面无法执行此类验证。
你可以做的是在Spring的帮助下以AOP的方式实现它非常优雅。您可以将spring method security 与自定义securiry解析器
一起使用@PreAuthorize("@securityResolver.isOwner(#userId)")
void changeAccount(UUID userId, Request body);
@Component("securityResolver")
public class CustomSecurityResolver {
public boolean isOwner(final String userId) {
//TODO business check here
}
}
您甚至可以将JWT令牌传递给安全解析程序方法并实现自定义检查。在这种情况下,您可以避免更改服务的业务逻辑,只需使用自定义解析程序添加几个注释即可。
我总是在自定义方法安全性的帮助下实施user could only change its own info
或tenant isolation
等检查