【问题标题】:How to handle different roles for multiple elements for a single user?如何为单个用户处理多个元素的不同角色?
【发布时间】:2016-06-29 17:01:46
【问题描述】:

首先,我是 spring-boot 和 spring-security 的新手。 我已经阅读了很多文档(尤其是在http://www.spring.io),但我没有找到很多信息。我也在使用 JsonWebTokens,所以我所有的身份验证过程都基于此。我按照这个优秀的教程使用 spring-security 实现 JsonWebToken 身份验证:http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/

所以这是我的问题: 我正在开发一个错误跟踪应用程序。对于每个项目,多个用户可能具有不同的角色(记者、开发人员、管理员等)。在前面的教程中,权限是整个 RESTful API 的授权,用户对整个 API 只有一个角色。但是,就我而言,我需要首先检查用户是否具有好项目的好角色(项目是通过 http 查询参数发送的),我不知道如何处理这个问题。总而言之,用户可以在一个项目上调用像 /tickets/close/{id} 这样的 URI,但不能在另一个项目上调用。

目前,我的 WebSecurityConfigurerAdapter 覆盖了 configure() 方法,例如:

http
...
.antMatchers("/admin/**").hasAuthority("ROLE_ADMIN")
.anyRequest().hasAuthority("ROLE_USER").and()
...

但在这种情况下,它显然不关心查询参数。

【问题讨论】:

    标签: java spring spring-security spring-boot jwt


    【解决方案1】:

    您所追求的不是用户的“不同角色”,而是授权用户访问一个对象或一组对象。

    通读Domain ACLs,您的用户将被不同的项目授权,并且项目将是问题的父授权对象,问题将继承自项目。

    【讨论】:

      【解决方案2】:

      由于您的安全规则需要考虑您的应用程序域,我将在您的控制器中实施安全规则。如果您的控制器检测到用户正在尝试访问被禁止的资源,您将通过 ResponseEntity 响应 503 错误。

      我通常做的是从我的控制器中抛出一个自定义异常并定义一个异常处理程序。该异常处理程序将处理 503 响应。这是一个例子:

      @ControllerAdvice
      public class ExceptionHandlerConfig {
        @ExceptionHandler(ValidationException.class)
        public ResponseEntity<Error> handleInvalidFileFormatException(HttpServletRequest request, RuntimeException ex) {
          Error error = new Error(0, new Date(), request.getRemoteAddr(), request.getRemoteHost(),
          request.getHeader("User-Agent"), ex.getMessage(), ExceptionUtils.getFullStackTrace(ex));
      
          if (ex instanceof ValidationException) {
              return new ResponseEntity<Error>(error, HttpStatus.BAD_REQUEST);
          }
      
          LOGGER.error("Error while processing request.", ex);
      
          return new ResponseEntity<Error>(errorService.save(error), HttpStatus.INTERNAL_SERVER_ERROR);
        }
      }
      

      这是一个自定义 ValidationException 处理程序,它生成一个 500 HTTP 响应,错误消息包装在 JSON 对象中。您可以使用自定义 SecurityException 为自己重用它,并将 ResponseEntity 标记为 503 而不是 500。

      祝你好运。

      编辑:ACL 绝对是保持业务逻辑与安全方面适当分离的最佳选择。但是,如果您不熟悉 Spring Security Advanced 概念,设置可能会很复杂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-15
        • 2013-08-06
        • 2012-11-02
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2016-02-05
        相关资源
        最近更新 更多