Ограничить доступ к нескольким клиентам Keycloak. за конфигурацию или токен - PullRequest
0 голосов
/ 04 марта 2020

У меня есть два клиента, скажем, ClientA и ClientB, и один пользователь с именем userA, оба клиента имеют конфиденциальный тип доступа, и я следовал этому примеру, чтобы написать свои услуги https://sandor-nemeth.github.io/java/spring/2017/06/15/spring-boot-with-keycloak.html, и все работает, у меня есть одна проблема, хотя, если я запрашиваю токен доступа с помощью этого, запрос почтальона

client_id = ClientA, 
grant_type=password, 
client_secret= 8657c896-b2fw-4ad6-aa9d-72563240cc62, 
scope = openid, 
user =userA
password=passwordA.

теперь, когда я делаю запрос к моей защищенной конечной точке, используя этот токен, он работает как следует, но проблема в том, что если я генерирую другой токен, использующий вышеупомянутые запросы тела, за исключением изменения client_id = ClientB и clientB, которые секретируют и вызывают ту же самую конечную точку, это все еще позволит мне получить доступ к конечной точке, но я хочу ограничить (запретить) это, что я хочу сделать, это ограничить запрос только его собственный ресурс.

, и это весенний конфиг

keycloak:
  realm: spring-security-example
  bearer-only: true
  auth-server-url: http://localhost:8080/auth
  ssl-required: external
  resource: clientA
  use-resource-role-mappings: true
  principal-attribute: preferred_username

, поэтому, если я сгенерирую токен для clientA, токену, сгенерированному с помощью ClintB, не будет разрешен доступ к любым конечным точкам. (и Я вижу в поле JWT "azp": "ClientA".) Как бы я go об этом, если бы это могло быть достигнуто через конфигурацию. или я должен сделать это в весеннем загрузочном коде?

override fun configure(http: HttpSecurity) {
        super.configure(http)
        http
                .authorizeRequests()
                .anyRequest().permitAll()
    }

1 Ответ

0 голосов
/ 06 марта 2020

Есть несколько способов, которыми это может быть достигнуто. Метод, который я бы использовал, заключался в определении роли внутри каждого клиента, которую пользователь должен иметь для доступа к этому клиенту. Затем вы должны проверить перед тем, как разрешить доступ этому клиенту, что у них есть эта роль клиента.

Чтобы создать роль клиента, в консоли администратора выберите свою «область», затем «Клиенты» в меню слева = > выберите «client2» => выберите «Roles» => «Add Role» и назовите его как хотите. Скажите «admin».

Чтобы предоставить эту роль пользователю, чтобы он мог получить доступ к этому клиенту, go «Пользователи» => Выберите пользователя => Сопоставления ролей => В разделе роли клиента выберите свой client => выберите новую роль и назначьте ее пользователю.

Затем вам необходимо ограничить доступ к области из клиента 1, выбрав «Клиенты» => «Клиент 1» => «Вкладка Области» => Снимите флажок «Полные области разрешены» => выберите «клиент 2» из выпадающего списка «Роли клиента» и убедитесь, что роль не применяется к этому клиенту.

Теперь вы можете проверить, получит ли этот пользователь доступ на эту роль от входа в «клиент 1», перейдя в «Клиенты» => «Клиент 1» => «Области клиента» => «Оценка вкладка». Если клиентские области настроены правильно, вы не должны получать доступ к роли клиента 2.

Последняя часть головоломки - настройка вашего клиента для проверки на эту роль. В бэкэнд-API (или другом месте принудительного применения на стороне клиента) настройте Keycloak для защиты от вновь созданной роли клиента для этого клиента. Для весенней загрузки, я считаю, что это что-то вроде этого (я не использую Springboot, так что не проверял, но взяты из их заметок здесь: https://www.keycloak.org/docs/latest/securing_apps/#_spring_security_adapter):

override fun configure(http: HttpSecurity) {
    {
        super.configure(http);
        http
                .authorizeRequests()
                .antMatchers("/yourClientRoute").hasRole("admin")
                .anyRequest().permitAll();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...