【问题标题】:JWT Spring - user based accessJWT Spring - 基于用户的访问
【发布时间】:2018-05-18 00:07:06
【问题描述】:
我正在我的 Spring 引导应用程序中实现基于 JWT 的身份验证。我有一个 Accounts 表,其中包含用户的银行帐户信息。现在,用户使用该表中的帐号和密码登录。问题是登录后,用户可以使用 JWT 分配给它的令牌访问任何内容。他甚至可以更改其他人的帐户信息。如何将访问权限限制在为其创建令牌的用户?
每个用户都应该只能访问与该用户关联的信息,因此不能创建roles。 JWT 是否提供任何此类功能,还是我必须手动检查令牌?我可以解析令牌并从中检索帐号并将其与控制器方法中传递的帐号进行比较,但这似乎不是一个简洁的解决方案,因为这需要更改每个控制器方法。
【问题讨论】:
标签:
java
spring
spring-boot
spring-security
jwt
【解决方案1】:
由于您的情况的安全性取决于业务逻辑,我想没有办法在身份验证提供者端执行此类验证。
你可以做的是在 Spring 的帮助下以 AOP 的方式实现它,非常优雅。您可以将 spring method security 与自定义安全解析器一起使用
@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 之类的检查