Я пишу Spring Boot REST API и использую токены JWT. Теперь я пытаюсь создать авторизацию на основе ролей.
Это учебное пособие / реализация, которую я использую.
https://auth0.com/blog/implementing-jwt-authentication-on-spring-boot/
Я расширил эту реализацию с помощью дополнительной сущности Role и добавил отображение @ManyToMany в сущность ApplicationUser.
Теперь, насколько я понимаю, роли пользователей должны быть добавлены в токен (во время его создание). Итак, это существующий код:
@Override
protected void successfulAuthentication(HttpServletRequest req, HttpServletResponse res, FilterChain chain, Authentication auth) throws IOException, ServletException {
String token = JWT.create()
.withSubject(((User) auth.getPrincipal()).getUsername())
.withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.sign(HMAC512(SECRET.getBytes()));
res.addHeader(HEADER_STRING, TOKEN_PREFIX + token);
}
Думаю, туда нужно добавить роли пользователей. Есть функция:
withArrayClaim(String Name, String[] items)
И вот моя первая проблема: я не уверен, как правильно это добавить.
Тогда это фрагменты, которые, насколько я понимаю, место, где проверяется токен:
private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
String token = request.getHeader(HEADER_STRING);
if (token != null) {
// parse the token.
String user = JWT.require(Algorithm.HMAC512(SECRET.getBytes()))
.build()
.verify(token.replace(TOKEN_PREFIX, ""))
.getSubject();
if (user != null) {
return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());
}
return null;
}
return null;
}
Что меня беспокоит, так это фрагмент:
return new UsernamePasswordAuthenticationToken(user, null, new ArrayList<>());
Я не понимаю, почему здесь null (Inteliij выделяет его как «учетные данные») и это новый ArrayList. Есть ли место, где я должен получить роли из токена и добавить их?
Я знаю, это довольно широкий вопрос, но я не смог найти других решений. Или, возможно, есть более простой способ создать простую аутентификацию / авторизацию токена JWT (на основе ролей).
Жду ваших ответов!
РЕДАКТИРОВАТЬ:
Или может быть, есть более простое решениеi - не сохранять роли пользователей внутри ключа, а только добавлять их во «второй» части, где null и новый ArrayList?