Как использовать @RolesAllowed с Keycloak и Java? - PullRequest
0 голосов
/ 14 апреля 2020

Я новичок в веб-приложениях и поэкспериментировал с keycloak, чтобы выяснить, как работает весь этот процесс авторизации / аутентификации. Я также взглянул на Quickstart Github Repo и опробовал этот быстрый старт от mastertheboss.

В этом уроке есть просто REST сервис

package annotation_test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

@Path("/hello")
public class HelloService {
    @GET
    @Path("/text")
    public String getHello () 
    {
        return "hello world!";
    } 
    @GET
    @Path("/json")
    @Produces(MediaType.APPLICATION_JSON)
    public SimpleProperty getPropertyJSON ()
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
    @GET
    @Path("/xml")
    @Produces(MediaType.APPLICATION_XML)
    public SimpleProperty getPropertyXML () 
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
}

Теперь я внес следующие изменения:

  1. Добавьте три роли: admin, user, employee и по три пользователя каждая.
  2. Редактировать web.xml следующим образом
<?xml version="1.0"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

 <security-constraint>
    <web-resource-collection>
        <web-resource-name>All Resources</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>admin</role-name>
        <role-name>employee</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>KEYCLOAK</auth-method>
    <realm-name>Test</realm-name>
</login-config>

<security-role>
    <role-name>admin</role-name>
</security-role>
<security-role>
    <role-name>employee</role-name>
</security-role>
</web-app>

Теперь конечные точки REST доступны пользователям только в ролях "admin" и "employee". Теперь я хотел поиграться с аннотациями по безопасности и попробовал следующее:

package annotation_test;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.annotation.security.RolesAllowed;


@Path("/hello")
public class HelloService {
    @GET
    @Path("/text")
    public String getHello () 
    {
        return "hello world!";
    }

    @RolesAllowed("employee")
    @GET
    @Path("/json")
    @Produces(MediaType.APPLICATION_JSON)
    public SimpleProperty getPropertyJSON ()
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }

    @RolesAllowed("admin")
    @GET
    @Path("/xml")
    @Produces(MediaType.APPLICATION_XML)
    public SimpleProperty getPropertyXML () 
    {
        SimpleProperty p = new SimpleProperty("key","value");
        return p;
    }
} 

Но пока пользователь играет роль "admin" или "employee", он имеет доступ ко всему.

Как правильно работает эта аннотация? Я хочу использовать роли, которые я определил в keycloak, чтобы ограничить доступ в моем коде с помощью аннотаций, так что мне придется изменить код как можно меньше. Я нашел несколько примеров с SpringBoot, но я не хочу менять свои настройки ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...