假设我们有一个像/users/{userId}/messages/{messageId}
这样的端点,并且该端点通过@DeleteMapping
公开(正如端点建议的那样,它删除了具有指定ID的消息,用于指定用户)。
在两种情况下可以删除Message
:您是主持人,或者您是邮件的所有者。第一部分很简单,您可以添加Security configuration
来使用此Endint需要ROLE_MODERATOR
。但是还有第二种情况,如果您是所有者,则可以删除邮件。如何正确实施?如果您在ROLE_MODERATOR
中添加Security configuration
,则将禁用非主持人用户(包括某些邮件所有者)的enpoint。
假设我们使用方法AuthenticatedUserHolder
调用了getLoggedUserID()
服务,该服务将返回userID
(会话,JWT或sth)。有什么办法可以合并ROLE_MODERATOR
或邮件所有者?
第二个问题:假设我们的端点/users/{id}/addresses
带有@PutMapping
,并且只有loggedUserID == id
才可以更改地址。如何从service/facade
中提取如果401/403
会返回loggedUserID != id
的逻辑?
编辑:方法代码:
SecurityContext authentication = SecurityContextHolder.getContext();
UserPrincipal loggedUser = (UserPrincipal) authentication.getAuthentication().getPrincipal();
return loggedUser.getUser().getPersonId();
UserPrincipal具有额外的字段personId
。
答案 0 :(得分:0)
您可以将@PreAuthorize注释与自定义方法一起使用 Examples
控制器
@PreAuthorize("@beanName.beanMethodName(#controllerParamName)")
@GetMapping("/{controllerParamName}")
fun getMethod(@PathVariable("controllerParamName") param: Long) {
//whenever
}
验证豆
@Service
class BeanName {
fun beanMethodName(param: Long): Boolean {
return false
}
}