В Spring Cloud OAUTH2 необходим для реализации унифицированной аутентификации и авторизации для нескольких микросервисов. Отправляя определенный тип grant type в OAUTH服务для центральной аутентификации и авторизации, получается access_token . Этот токен доверяет другим микросервисам. Мы можем использовать access_token для последующего доступа, тем самым реализуя унифицированную аутентификацию и авторизацию для микросервисов.
Этот пример содержит четыре основных частях:
discovery-service : базовый модуль для регистрации и обнаружения услугauth-server : Центр сертификации и авторизации OAUTH2order-service : обычный микросервис, используемый для проверки аутентификации и авторизацииapi-gateway : Border Gateway (все микросервисы за ним)Роли в OAuth2:
Resource Server : ресурсы, уполномоченные для доступаAuthotization Server : центр авторизации сертификации OAuth2Resource Owner : пользовательClient : клиенты, использующие API (такие как Android, iOS, веб -приложения)Тип гранта:
Authorization Code : используется между серверными приложениямиImplicit : Используется в мобильных приложениях или в веб -приложениях (эти приложения находятся на устройстве пользователя, такие как регулирование WeChat на мобильном телефоне для аутентификации и авторизации)Resource Owner Password Credentials(password) : приложение напрямую доверяется (все разработано компанией, и этот пример используетсяClient Credentials : используется в API API приложения.1. Основная среда
Используйте Postgres в качестве хранилища учетных записей, Redis в качестве хранилища Token и запускайте Postgres и Redis на сервере с помощью docker-compose .
Redis: Image: Someersbn/Redis: Последние порты: - "6379: 6379" Тома: -/srv/docker/redis:/var/lib/redis: z restart: allwaypostgresql: restart: всегда изображение: someersbn/postgresql: 9.6-2 ports: - - db_pass = yunfei - db_name = order volumes: -/srv/docker/postgresql:/var/lib/postgresql: z
2. Аут-сервер
2.1 Конфигурация службы OAuth2
Redis используется для хранения token . После перезапуска службы нет необходимости повторно зарабатывать token .
@Configuration @enyableauthorizationserverpublic class AutorrizationserverConfig Extends AuthorizationServerConfigurerAdapter {@Autowired Private AuthenticationManager AuthenticationManager; @Autowired private redisconnectionFactory ConnectionFactory; @Bean public redistokenstore tokenstore () {return new Redistokenstore (connectionFactory); } @Override public void configure (AuthorizationServerEndPointSconfigurer Endpoints) Throws Exception {endpoints. AuthenticationManager (AuthenticationManager) .tokenstore (tokenStore ()); } @Override public void configure (AuthortizationServerseCertoCerfigurer Security) Throws Exception {Security .tokenKeyAccess ("armitall ()") .CHECKTOKENACCESS ("isAuthenticated ()"); } @Override public void configure (clientDetailsServiceConfigurer клиентов), выбросы исключения {client.inmemory () .withclient ("android") .scopes ("xx") // Сфера здесь бесполезны, вы можете установить .secret ("android"). . и () .withClient ("webApp") .scopes ("xx") .authorizedgranttypes ("Imtiace"); }}2.2 Конфигурация службы ресурсов
auth-server предоставляет информацию пользователя, поэтому auth-server также является Resource Server
@Configuration @enablerSourceserVerpublic Class ResourceserverConfig Extends resourcesserverConfigurerAdapter {@Override public void configure (httpsecurity http) Обращает исключение {http .csrf (). Divable () .exceptionhandling () .authenticationEntryPoint ((запрос, ответ) ->. response.senderror (httpservletresponse.sc_unauthorized)). и () .authorizerequests (). anyRequest (). Authenticated (). и () .httpbasic (); }} @Restcontrollerpublic class usercontroller {@getmapping ("/user") public pronical user (основной пользователь) {return user; }}2.3 Конфигурация безопасности
@ConfigurationPublic Class SecurityConfig Extends WebseCurityConfigurerAdapter {@bean public userdetailsservice userdetailsservice () {return new domainuserdetailsservice (); } @Bean public passwordEncoder passwordEncoder () {return new bcryptpasswordencoder (); } @Override Protected void configure (AuthenticationManagerBuilder auth) Throws Exception {auth .UserDetailsService (userDetailsService ()) .PasswordEncoder (passwordEncoder ()); } @Bean Public SecurityEvaluationContexTextension SecurityEvaluationContexTextension () {return New SecurityEvaluationContexTextension (); } // нет пароля грант_тип @override @bean public authentication manage outentication managerbean () throws exception {return super.authentication managerbean (); }}2.4 Дизайн разрешения
Настройка разрешений用户(SysUser)角色(SysRole) Sysrole)权限(SysAuthotity) состоит多对多. Загрузите пользователей и разрешения через DomainUserDetailsService .
2.5 Конфигурация
Весна: Профили: Active: $ {spring_profiles_active: dev} Приложение: Имя: Auth-Server JPA: Open-In-View: True Database: Postgresql Show-Sql: True Hibernate: DDL-Auto: Обновление DataSource: Platform: PostGRES URL: JDBC: WostGRESQL: //192.168.140: Пароль: yunfei-класс-класс: org.postgresql.driver redis: хост: 192.168.1.140server: порт: 9999eureka: клиент: ServiceUrl: defaultzone: http: // $ {eureka.host:localhost}: $ {eureka.port: 8761}/eureka/logging.level.org.springframework.security: Debuglogging.leve.org.springframework: Devugug## очень важна. Oaathging: resource.2.6 Тестовые данные
Два пользователя инициализированы в data.sql admin -> ROLE_ADMIN -> query_demo , wyf -> ROLE_USER
3. заказ-сервис
3.1 Конфигурация службы ресурсов
@Configuration @enablerSourceserVerpublic Class ResourceserverConfig Extends resourcesserverConfigurerAdapter {@Override public void configure (httpsecurity http) Обращает исключение {http .csrf (). Divable () .exceptionhandling () .authenticationEntryPoint ((запрос, ответ) ->. response.senderror (httpservletresponse.sc_unauthorized)). и () .authorizerequests (). anyRequest (). Authenticated (). и () .httpbasic (); }}3.2 Конфигурация информации пользователя
order-service -это простой микросервис, который использует auth-server для аутентификации и авторизации. В файле конфигурации вы можете указать информацию пользователя по адресу auth-server :
Безопасность: oAuth2: ресурс: ID: Order-Service User-Info-Uri: http: // localhost: 8080/uaa/user prefend-toke-info: false
3.3 контроллер испытаний разрешений
Доступ доступен с authority без query-demo , то есть пользователь admin
@Restcontrollerpublic class democontroller {@getmapping ("/demo") @preauthorize ("hasauthority ('Query-demo')") public String getDemo () {return "good"; }}4 API-Gateway
api-gateway имеет 2 функции в этом примере:
implicit4.1 Выключите CSRF и включите поддержку клиента OAuth2
Configuration @enableOauth2ssopublic Class SecurityConfig Extens WebseCurityConfigurerAdapter {@Override Protected void configure (httpsecurity http) выбрасывает {http.csrf (). Disable (); }}4.2 Конфигурация
Zuul: Маршруты: UAA: PATH:/UAA/** SensitiveHeaders: ServiceId: Auth-Server Заказ:/Порядок/** SensitiveHeaders: ServiceId: Заказ-сервисный http: // localhost: 8080/uaa/oauth/Authorize Client-ID: webApp Resource: пользователь-info-uri: http: // localhost: 8080/uaa/user prefend-token-info: false
5 Демо
5.1 клиентские звонки
Используйте Postman , чтобы отправить запрос на http://localhost:8080/uaa/oauth/token , чтобы получить access_token (для пользователей администратора, таких как 7f9b54d4-fd25-4a2c-a848-ddf8f119230b )
Пользователь администратора
пользователь WYF
5.2 Вызов WebApp в API-Gateway
Пока нет тестов, и я добавлю их в следующий раз.
6 Адрес исходного кода
https://github.com/wiselyman/uaa-zuul
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.