Галоўная / Артыкулы / Практычныя прытамулі: Рэцепт Spring AI: Захаванне сервера MCP за дапамою OAuth

Практычныя прытамулі: Рэцепт Spring AI: Захаванне сервера MCP за дапамою OAuth

Практычныя прыказкі: Рэцепт Spring AI: Захаванне сервера MCP за дапамою OAuth: кантракты, перакрыцця та слоты для коду для команд, якія викорыстоўваюць гэты патэрн.

1607 слоў

Наступныя прыміткі паказваюць практычны шлях адпрацоўкі тэмы «Spring AI Recipe: Захаванне сервера MCP за дапамою OAuth». Акцэнт ставіцца на контракты, пераканальныя перагляды та шаблоны коду, якіе можна проста заместіць, а не на мотывацыйныя аспекты. Калі працуеце на стадіі агляду, спачатку запісайце контракт: неабяжныя даны, сігнал успеху та тое, што выканаецца у разы частковага невясковасці. Такі список контроля дапамагае залічваць пазнейшыя змены ў кодзе. Храніце настройкі парадульна ад коду прыемлівача. Файлы сераўіса, базы секрэтных даных та флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавіць аудыт без неабяжнага чытання всіх элементаў системы.

Стварэнне сервера автарызаціі

Этап стварэння сервера автарызаціі працюе наяўней, калі яго розглядаюць як мерыемую структуру. Запісаўце адну ідеальную транскрыпцію, адзін прыклад неудачы і прыметкі па поверненню да пачатковага стану пры расшырэнні сферы дзеяння. Дакументаваць трэба як успішны, так і варыянт вярнення да нормальнага стану. Перапрыбуткі, людзкія контрольныя пункты і обработка некоректных паведамленняў є часткай продукту, а не наступным этапам дапрацоўкі. Абявляйце інструменты з вузкімі схемамі та чысткімі пазначэннямі побачных эфектаў. Хостам неабходна знаты, якія запыткі меняюць стан, перш чым яны будуць автаматычна затверджаны.

implementation 'org.springaicommunity:mcp-authorization-server:0.1.14'
@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .authorizeHttpRequests(auth ->
            auth.anyRequest().authenticated())
        .formLogin(withDefaults())
        .with(
            McpAuthorizationServerConfigurer.mcpAuthorizationServer(),
            withDefaults())
        .build();
  }

}
spring:
  application:
    name: recipes-authorization-server
  security:
    oauth2:
      authorizationserver:
        client:
          default-client:
            token:
              access-token-time-to-live: 1h
            registration:
              client-id: "myclient"
              client-secret: "{noop}mysecret"
              client-authentication-methods:
                - "client_secret_basic"
              authorization-grant-types:
                - "authorization_code"
              redirect-uris:
                - "http://localhost:6274/oauth/callback"
                - "http://127.0.0.1:6274/oauth/callback"
              scopes:
                - general-access
                - meteorology
                - administration
    user:
      name: craig
      password: letmein

server:
  port: 9999

Забезпечэнне безпекі сервера MCP

Этап забезпечэння безпекі сервера MCP работае наявнашчы ў лепшым спосабе, калі яго розглядаюць як меравальную плошчу. Зафіксавайце адны ідеальны прыклад роботы, адзін прыклад неудачы і прыметку па поверненню да пачатковага стану пры расшырэнні масштаба. Валіце маленькія, тэставальныя элементы замест большых скрыптов. Калі якісь крок не выйшае, прычына неудачы павінна вказываць на адну конкрэтную адпаведальнасць, а не на заплутаны ланцюг задач. Адкройце інструменты з вузкімі схемамі та чысткімі пазначэннямі побачных наследкаў. Хостам неабходна знаты, якія вызовы мутуюць стан, перш чым яны автаматычна схваляюць ўпраўленні.

implementation 'org.springaicommunity:mcp-server-security:0.1.14'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:9999
@Configuration
@EnableWebSecurity
class McpSecurityConfig {

  @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
  private String issuerUrl;

  @Bean
  SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .authorizeHttpRequests(auth ->
            auth.anyRequest().authenticated())
        .with(
            McpServerOAuth2Configurer.mcpServerOAuth2(),
            (mcpAuthorization) -> {
              mcpAuthorization.authorizationServer(issuerUrl);
            }
        )
        .build();
  }

}

Тэставанне сервера MCP

Этап «Тэсты сервера MCP» працюе найкраща, калі яго розглядаць як параметрызаваную плошчу для аналізу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу тэставання. Разглядзіце этап як кантракт межа вхіднымі даннымі і пераканаленымі выходнымі рэзультатамі. Даўце назвы всім элементам, задаце критэрыя успеху і не падтрымвайце частковае завершэння задання без паведамлення. Абяўляйце інструменты з вузкімі схемамі та чысткімі пазначэннямі побачных эфектаў. Адпаведальныя за хоставанне должны знать, якія вызовы мутуюць стан системы, перш чым автаматычна ўзяць іх на спрыт. Этап «Тэсты сервера MCP» працюе найкраща, калі яго розглядаць як параметрызаваную плошчу для аналізу. Зберагачыце адны ідеальны прыклад роботы, адзін прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць сферу тэставання. Зберагачыце настройкі параду ўнутры аплікацыйнага коду. Файлы сяродавішча, хранільнікі секрэтных данных і флагі функций должны знаходзіцца ў аднам месцы, куда аператары можу аудытаваць іх без неабяжнага чытання всіх элементаў системы.

Забезпечэнне безпекі адзіных інструментаў

Для стадіі забезпечэння індывідуальных адзінакоў неабходна прадзефінаваць вхідныя даны, адпаведальную особу за крок і критэрыя завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здогадвацца пра схованы стан.

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
class SecurityConfig {

  @Value("${spring.security.oauth2.resourceserver.jwt.issuer-uri}")
  private String issuerUrl;

  @Bean
  SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
        .authorizeHttpRequests(auth -> {
          auth.requestMatchers("/mcp").permitAll();
          auth.anyRequest().authenticated();
        })
        .with(
            McpServerOAuth2Configurer.mcpServerOAuth2(),
            (mcpAuthorization) -> {
              mcpAuthorization.authorizationServer(issuerUrl);
            }
        )
        .build();
  }

}
@PreAuthorize("hasAuthority('SCOPE_meteorology')")
@McpTool(
    name = "get-weather-for-zipcode",
    description = "Gets the weather for a given zipcode",
    annotations = @McpTool.McpAnnotations(
        openWorldHint = false,
        destructiveHint = false,
        idempotentHint = true))
Weather getWeatherForZipcode(
    @McpToolParam(description = "The zipcode to get weather for")
    String zipcode) {
  var context = SecurityContextHolder.getContext();
  var username = context.getAuthentication().getName();
  return new Weather(
      zipcode,
      "Raining cats and dogs",
      78.0f,
      username);
}

Чэк-ліст для аперацый

Для стадіі чэк-ліста для аперацый неабходна прадзефінаваць вхідныя даны, адпаведальную особу за крок і критэрыя завершэння пры перамены коду. Аперацыйныя працавнікі должны магчымае перайсці на выкананне кроку з вядомага пункта контролю, не спрабоўваючы здагадвацца пра схованы стан.

Запісвайце часы выконання задач і вартась токенаў або запытак праза функцыйнае рэзультаты. Відразлівая вартась з самага пачатку запобегае неспакоўным рахункам, калі сцэнарый пераходзіць з дэмовай среды ў спадзеленыя сераверы.

Аутентыфікуйцеся ў шлюзе і паўтарна автарызуйцеся на роўні дадзенняў. Сам токен-носіцель не ёсць межай аддзела.

Напісце кароткі посоўнік: як ротаваць клучы, як спрачыслаць чергу, як анулюваць пярэдні процес імпорту.

Зберагаўце настройкі праза код аплікацыі. Файлы среды, хранільнікі секрэтных дадзенняў і флагі функцыйяў должны знаходзіцца ў аднам месцы, куды аператары можаць адбавляць контроль без неабходнасці чытання всей структуры.

Аутентыфікуйцеся ў шлюзе і паўтарна автарызуйцеся на роўні дадзенняў. Сам токен-носіцель не ёсць межай аддзела.

Перш чым запускать даную систему, заморозьце версіі, зафіксавце критычныя моменты для аналізу і паказваце крокі з вярнення да пачатковага стану. У спільных средах неабяжна наявнае ліміты на частоту запуска, пераконтрольванне прав на доступ і чыста відпаведальна особа за змěну секрэтных даных. Лепш выбіраць простую надзею на надзейнасць, чым крэатывныя, але еднакратныя дамы.

Прымітка для 01496ca9e17e: не кладзіце ключы прадаўцаў у репазітарый, задаце ліміт токену на кожную сесію і зберагачыце фіксаціі пад час адпрацоўкі разам з фіксатымі данымі, каб пазнейшыя замены модэляў заставаліся порównаннімы.

Для прыміткі па забезпечэнню надзейнасці на стадыі 0 неабяжна з’явіць вхідныя даны, відпаведальную особу за выкананне крока і критэрыя завершэння прычымкі коду. Аперацыйныя системы павінны магчымаць перзапуск крока з вядомай точкі контролю, не падозрываючы прыхованы стан. Спрыяйце цім стадыю як кантракту межа вхіднымі данымі і перакананымі выходнымі рэзультатамі. Даце назвы артыфактам, з’явіце критэрыя успеху і адмовіцеся ад тыхняе частковага завершэння без паведамлення.

Дзеянне паўжасткі 0/819: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага зазначэння, а пасля, на аднойчынай сутнасці пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.

Калі працюеце над першым этапам зазначэння паўжасткі, спачатку запісайце контракт: неабходныя даны, сігнал успеху і тое, што выканаецца у разе частковай памылкі. Такі список контроля дапамагае заставіць пасляэтапныя змяны ў кодзе чыстымі. Зберагаюце канфігурацыю праза код аплікацыі. Файлы сяродавысці, хранільнікі секрэтных дадзеных і флагі функцыйяў должны знаходзіцца ў аднам месцы, якое аператары можаць пераглядаць без неабходнасці чытання всей структуры.

Дзеянне паўжасткі 1/819: звярніце увагу на час выканання, клас памылкі і колькасць викорыстоўваных токенаў для гэтага зазначэння, а пасля, на аднойчынай сутнасці пытанняў, а не на індывідуальных прыкладах, выявіце, чы хачаце застаўіць змяну.

Этап 2 прыцеленняя на зміцнэнне работае найкраща, калі яго розглядаць як вимероўваную паверхню. Запісаце адна «золатая» транскрыпцыя, адин прыклад неудачы і запіс пра вярнэнне да пачатковага стану перш чым расширваць масштабы. Валіце маленькія, тэставаныя елементы замест большых скрыптов. Калі якісь крок не выходзіць, прычына неудачы павінна вказваць на адную адпаведальнасць, а не на заплутаны процес.

Дзеянне прыцеленняя на зміцнэнне 2/819: вимеравайце час выканання, класію памылак і колькасць викорыстоўваных токенав для гэтага дзеяння, а потым вырашайце, чы рашыцца застаўляць змяну, ставячыся да фіксованага набора пытанняў, а не да індывідуальных спазыроў.

Для трэція ўрагу практыкы забезпечэння надзеі неабходна пазначыць вхідныя даны, адпаведальнага за выкананне крока і критэрыя завершэння пры зміне коду. Аператары должны магчыма ўвайсці крок з вядомай точкі контролю, не прабуючы спадарожваць схованы стан. Запісвайце час выканання і вартасць токена або запытку паўстаючы разам з функцыйнальнымі рэзултатамі. Відразы вартасці з самага пачатку запобегае неспакоўным рахункам, калі процес пераходзіць з дэмаверсіі ў спяльныя среды.

Дзеянне забезпечэння надзеі 3/819: звярніце увагу на час выканання, класыя ошибакі і витрату токена для гэтай практыкі, а потым вынікніце рашэнне пра тое, чы хацеце застаўіць змяну, адпаведна фіксаванаму набору пытанняў, а не індывідуальным спазыркам.

Калі працуеце над 4-й стадзіяю прыемкі з павышэння безпекі, спачатку запісайце угоду: неабяжлівыя данні, сігнал успеху і тое, што выходзіць пад частковы нявыплэн. Такі список контролю дапамагае заставіць пазнейшыя змены коду быць чыстымі.

Документавайце як «шчаслівы» шлях, так і шлях вяснавання. Перапрыбуткі, людзкія контралі і обработка некоректных паведамленняў ёсць частью продукту, а не пазнейшым дапрацоўкам.

Дзялей 4/819 прыемкі з павышэння безпекі: вымерайце час выканання, класыя ошибкі і витрату токенав для гэтай прыемкі, а пасля выберайце, чы робіць змены на адной фіксаванай сэтке пытанняў, а не на адной лічбе прыкладаў.

4-я стадзія прыемкі з павышэння безпекі работае лепей, калі яе спрыямаць як меравальную плошчу. Запісайце адну «золатую» транскрыпцыю, адны прыклад нявыплэну і прыемку для абратнага выканання, перш чым расширваць масштаб.

Спрыяйце гэтай стадзіі як угоды межа даннімі і перакананымі выходамі. Дайце назвы артыфактам, задаце перакананні успеху і адмовіцеся ад тыхоўскага частковага завершэння.

Дзеянне паўжасткі 5/819: звярніце увагу на час выканання, класы паказакоў і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.

Для 6-й стадзіі паўжасткі запісу перад змянай коду неабходна апрацаваць параметры, вялікога адпаведальнага за крок і критэрыяы завершэння. Аперацыйныя працавнікі павінны магчымае перадзванаць крок з вядомай точкі контролю, не падозрываючы схованы стан. Канфігурацыю трэба заставіць праза код аплікацыі; файлы сяродавішча, хранільнікі секрэтных дадзенняў і флагі функций павінны знаходзіцца ў адном месцы, якое працавнікі можуць пераглядаць, не чытаючы весь граф.

Дзеянне паўжасткі 6/819: звярніце увагу на час выканання, класы паказакоў і витрату токенаў для гэтага запісу, а пасля, на аднойчынай базе пытанняў, а не на асобістых спазыраннях, выявіце, чы хацяце застаўіць змены.