Spring安全上下文'principal'返回String而不是实际的用户数据

时间:2016-03-08 14:02:44

标签: spring authentication spring-security authorization

我正在为一个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?

如果我的解释太不完整而无法帮助我,请不要犹豫,问我更多问题。谢谢。

0 个答案:

没有答案