使用Spring Security验证用户

时间:2019-12-25 17:41:41

标签: spring spring-boot authentication spring-security

假设我们有一个像/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

1 个答案:

答案 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
   }
}