我正在为一个API的buggy身份验证部分开发一个现有项目。作为一个Spring初学者,我觉得我在这里缺少一些关于安全性的重要信息,所以我想要一些帮助或建议。 我的Spring Security版本是 3.2.5.RELEASE 。
我在我的一个控制器中有这个方法:
@Override
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@RequestMapping(method = RequestMethod.POST, produces = "text/plain", consumes = "application/xml")
@PreAuthorize("principal.manager.id == #managerId and hasAuthority('ADMIN')")
public String create(@PathVariable("manager-id") Short managerId, @RequestBody Key key) {
return super.create(managerId, key);
}
这里重要的部分是@Preauthorize行。实际上,当我尝试将此方法称为作为未经身份验证的用户时,我会收到失败,并且日志会告诉我以下内容:
Field or property 'manager' cannot be found on object of type 'java.lang.String'
Manager是自定义User类中的一个字段,它实现了Serializable和UserDetails。
我很困惑:为什么主要变量是字符串而不是用户对象(例如)我希望使用的那种东西并从中获取信息。此错误以:
结束Wrapped by: java.lang.IllegalArgumentException:
Failed to evaluate expression "principal.manager.id == #managerId and hasAuthority('ADMIN')"
因为它显然无法从principal获取 manager 属性,这是一个String变量。
要记录更多相关内容,我尝试将内容外部化,并将我的预授权行更改为:
@PreAuthorize("hasAuthority('ADMIN') and @userService.hasRightManager(principal, #managerId)")
我实现了一个非常简单的hasRightManager方法:现在它除了记录主变量的值外什么都不做。 它在日志中返回“admin”,这确实是一个String而不是User对象。
现在我被卡住了,因为即使是Spring Security文档似乎也说在获取这个主要变量时应该有一个UserDetails对象(或其他一些用户信息类),而我得到的只是一个字符串:
Object getPrincipal()主体的身份 认证。在使用用户名的身份验证请求的情况下 和密码,这将是用户名。呼叫者应该是 填充身份验证请求的主体。该 AuthenticationManager实现通常会返回一个 身份验证包含更丰富的信息作为使用的主体 通过申请。许多身份验证提供程序将创建一个 UserDetails对象作为主体。
返回:正在进行身份验证或已通过身份验证的Principal 认证后的委托人。
我不是那个为这个API实现身份验证的人,所以对我来说感觉很模糊。
知道这一点,你能不能对这个类型的问题有所了解,并让我领导一下如何以不同的方式做事,并在获取主体时获取User对象而不是String?
如果我的解释太不完整而无法帮助我,请不要犹豫,问我更多问题。谢谢。