У меня есть проект keycloak при весенней загрузке (API) и angular (Front End). При попытке фильтрации пользователей на основе ролей, которые не могут фильтровать - PullRequest
0 голосов
/ 29 января 2020

У меня есть 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 "";
    }
}
...