Spring安全上下文';校长';返回字符串,而不是实际的用户数据

Spring安全上下文';校长';返回字符串,而不是实际的用户数据,spring,authentication,spring-security,authorization,Spring,Authentication,Spring Security,Authorization,我正在处理一个API的buggy身份验证部分的现有项目。作为一名春季初学者,我觉得我在这里错过了一些关于安全性的重要内容,所以我想得到一些帮助或建议。 我的Spring Security版本是3.2.5。发布版 我的一个控制器中有此方法: @Override @ResponseBody @ResponseStatus(HttpStatus.OK) @RequestMapping(method = RequestMethod.POST, produces = "text/plain", consu

我正在处理一个API的buggy身份验证部分的现有项目。作为一名春季初学者,我觉得我在这里错过了一些关于安全性的重要内容,所以我想得到一些帮助或建议。 我的Spring Security版本是3.2.5。发布版

我的一个控制器中有此方法:

@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是自定义用户类中的一个字段,它实现了Serializable和UserDetails

我很困惑:为什么principal变量是一个字符串,而不是像用户对象那样的东西(例如),这是我希望使用并从中获取信息的东西。此错误以以下内容结束:

Wrapped by: java.lang.IllegalArgumentException:
Failed to evaluate expression "principal.manager.id == #managerId and hasAuthority('ADMIN')"
因为它显然无法从principal获取manager属性,这是一个字符串变量

为了记录更多关于这方面的信息,我尝试将事情外部化一点,并将我的预授权行更改为:

@PreAuthorize("hasAuthority('ADMIN') and @userService.hasRightManager(principal, #managerId)")
我实现了一个非常简单的hasRightManager方法:目前它除了记录主变量的值之外什么都不做。 它在日志中返回“admin”,这实际上是一个字符串,而不是用户对象

现在我被卡住了,因为即使是Spring安全文档也似乎说,在获取这个主要变量时,应该使用UserDetails对象(或其他一些用户信息类),而我得到的只是一个字符串:

Object getPrincipal()正在创建的主体的标识 认证的。对于用户名为的身份验证请求 和密码,这将是用户名。来电者应 填充身份验证请求的主体。这个 AuthenticationManager实现通常会返回 身份验证包含更丰富的信息作为使用主体 通过应用程序。许多身份验证提供程序将创建一个 UserDetails对象作为主体

返回:正在验证的主体或已验证的 身份验证后的主体

我不是为这个API实现身份验证的人,所以我觉得它有点模糊

知道了这一点,你能不能解释一下这种类型的问题,并告诉我如何做不同的事情,在获取主体时获取用户对象而不是字符串


如果我的解释太不完整,对我的情况没有帮助,请不要犹豫问我更多的问题。谢谢。

您需要找到正在使用的
AuthenticationProvider
,这就是设置主体的方法。@holmis83是正确的。您的配置是什么样子的?您有自定义身份验证吗?您需要找到正在使用的
AuthenticationProvider
,这就是设置主体的方法。@holmis83是正确的。您的配置是什么样子的?您有自定义身份验证吗?