如何为单个用户处理多个元素的不同角色?

时间:2016-03-14 15:12:09

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

首先,我是弹簧启动和弹簧安全的新手。 我已经阅读了很多文档(特别是关于http://www.spring.io),但我找不到很多信息。我也在使用JsonWebTokens,所以我的所有身份验证过程都基于此。我遵循了这个优秀的教程,使用spring-security实现JsonWebToken身份验证:http://blog.jdriven.com/2014/10/stateless-spring-security-part-2-stateless-authentication/

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

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

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

但在这种情况下显然不会处理查询参数。

2 个答案:

答案 0 :(得分:0)

你所追求的不是"不同的角色"对于用户而言,而不是授权用户访问对象或对象集。

通读Domain ACLs,您的用户将获得不同项目的授权,项目将成为问题的主要授权对象,问题将继承项目。

答案 1 :(得分:0)

由于您的安全规则需要考虑您的应用程序域,因此我将在您的控制器中实施安全规则。如果您的控制器检测到用户正在尝试访问禁用的资源,您将通过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自行重用它,并使用503而不是500标记ResponseEntity。

祝你好运。

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