сегодня я обнаружил проблему с авторизацией JWT и аннотацией @PreAuthorize. А именно, существует проблема с поиском правильной роли при использовании @PreAuthorize.
Мой предыдущий метод getAuthorities () из класса SecurityUtil, например:
public class SecurityUtil {
private static String AUTHORITIES_KEY = "AUTHORITIES";
public static UserPrincipal getPrinciple() {
return (UserPrincipal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
}
public static Set<GrantedAuthority> getAuthorities(Claims claims) {
return Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(", "))
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
}
}
был добавлен дополнительный сборник, который мы видим на втором скриншоте в разделе полномочия -> роль. Это решение не распознавало роли по аннотации @PreAuthorize в контроллере. Более того, они окружены скобками.
Первый снимок экрана текущего рабочего решения, которое, по моему мнению, требует оптимизации:
Вторая душа вроде:
public static Set<SimpleGrantedAuthority> getAuthorities(Claims claims) {
return ((ArrayList<HashMap<String, String>>) claims.get(AUTHORITIES_KEY)).stream()
.map(HashMap::values)
.map(Object::toString)
.map(s -> s.replace("[", "")
.replace("]", ""))
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toSet());
}
отлично работает для меня, но у меня есть два вопроса, а именно:
Есть ли шанс украсить код, чтобы улучшить его оптимизацию
и как избавиться от подсказки IntellJ, которая появляется в строке
((ArrayList<HashMap<String, String>>) claims.get(AUTHORITIES_KEY))
который звонит как:
Unchecked cast 'java.lang.Object' to 'java.util.ArrayList<java.util.HashMap<java.lang.String, java.lang.String>>
Спасибо за любую помощь.