У меня есть keycloak в моем весеннем загрузочном приложении, и мне нужно отфильтровать запросы, поступающие из проекта angular, на основе имеющейся у меня роли пользователя, но каким-то образом он не фильтруется с ролями.
Здесь мой класс фильтра
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = request.getHeader("Authorization").toString().substring(7);
if (StringUtils.hasText(jwt) && !jwt.isEmpty()) {
String role = getRole(jwt);
Set<GrantedAuthority> authorities = new HashSet<>();
authorities.add(new SimpleGrantedAuthority(role));
KeycloakAuthenticationToken auth = new KeycloakAuthenticationToken(null, true, authorities);
auth.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(auth);
}
} catch (Exception e) {
logger.error("Could not set user authentication in security context", e);
}
filterChain.doFilter(request, response);
}
private JSONArray getRoles(String jwt) {
SimpleJWTProcessor processor = new SimpleJWTProcessor(jwt);
if (processor.isValid()) {
JSONObject body = processor.getJsonClaimObject();
JSONObject jSONObject = (JSONObject) body.get("realm_access");
return (JSONArray) jSONObject.get("roles");
}
return null;
}
private String getRole(String jwt) {
JSONArray jsonArray = getRoles(jwt);
if (jsonArray != null) {
if (jsonArray.contains("HR"))
return "HR";
else if (jsonArray.contains("SSE"))
return "SSE";
else if (jsonArray.contains("ASE"))
return "ASE";
}
return "";
}
}