Доступ к HTTP-запросу в пользовательском выражении безопасности Spring - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь написать собственное выражение безопасности Spring с помощью PreAuthorize. Я хочу добиться этого:

@PreAuthorize(customAuthCheck(param1, param2))
@RestController
public String getRestrictedInfo(HttpServletRequest request) {
    // 
}

, где param1, param2 зависит от бизнес-логики c.

В моем AuthSecurityExpressionRoot классе:

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
    public boolean customAuthCheck(String param1, String param2) {
        // check authorization
    }
}

Проблема в том, что я хочу получить доступ к HTTP-запросу (в частности, к заголовку «Авторизация» и httpMethod) внутри метода customAuthCheck. Как я могу это реализовать?

1 Ответ

0 голосов
/ 05 августа 2020

Вы можете передать весь запрос своему объекту MethodSecurityExpressionOperations, а затем извлечь нужные заголовки. В вашем случае используйте это:

public class CustomMethodSecurityExpressionRoot extends SecurityExpressionRoot implements MethodSecurityExpressionOperations {
    public boolean customAuthCheck(HttpServletRequest request) {
        String jwtString = request.getHeader("Authorization");
        // decode/process the JWT
        // check authorization
    }
}

Затем в вашем контроллере:

@PreAuthorize(customAuthCheck(#request))
@RestController
public String getRestrictedInfo(HttpServletRequest request) {
    // 
}

Вы также можете передать другие параметры вместе с заголовком, если хотите, если они часть сигнатуры метода, например:

@PreAuthorize(customAuthCheck(#param1, #request))
public String getRestrictedInfo(HttpServletRequest request, @RequestParam String param1) {
    //
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...