Фреймворк Spring Security позволяет реализовать авторизацию в приложении при помощи протокола OAuth 2.0. Провайдерами авторизации могут быть как общедоступные сервисы, вроде Google, Facebook или GitHub, так и персональные, реализованные, например, при помощи Apereo CAS.
Настройка поддержки OAuth 2.0 в сервере CAS
По умолчанию поддержка OAuth 2.0 в сервере CAS отключена, но её легко включить. Для этого в проект сервера потребуется добавить зависимость org.apereo.cas:cas-server-support-oauth-webflow:
1 2 3 4 5 |
<dependency> <groupId>org.apereo.cas</groupId> <artifactId>cas-server-support-oauth-webflow</artifactId> <version>${cas.version}</version> </dependency> |
Так же требуется настроить сервис, который будет использовать OAuth-авторизацию:
1 2 3 4 5 6 7 8 9 |
{ "@class" : "org.apereo.cas.support.oauth.services.OAuthRegisteredService", "clientId": "clientid", "clientSecret": "clientSecret", "serviceId" : "^https?://example.com/.*", "name" : "OAuthService", "jsonFormat" : true, "id" : 100 } |
Обратите внимание на то, что свойство jsonFormat должно иметь значение true, так как Spring Security ожидает получить JSON при запросе ключа доступа.
Настройка Spring Security в клиентском приложении
В клиентском приложении на основе Spring Boot понадобятся две зависимости:
1 2 3 4 5 6 7 8 9 10 |
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-oauth2-client</artifactId> </dependency> </dependencies> |
Допустим, наш сервер CAS имеет адрес example.com/cas, сконфигурируем поддержку OAuth в приложении согласно документации CAS и Spring Security:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
spring: security: oauth2: client: provider: cas: # provider_id authorization-uri: http://example.com/cas/oauth2.0/authorize token-uri: http://example.com/cas/oauth2.0/accessToken user-info-uri: http://example.com/cas/oauth2.0/profile user-name-attribute: id registration: cas: # registration_id same as provider_id client-id: clientid client-name: CAS Server client-secret: clientSecret authorization-grant-type: authorization_code redirect-uri-template: http://example.com/login/oauth2/code/cas # url with provider_id scope: - PROFILE |
Значения свойств client-id и client-secret должны соответствовать таковым в настройках сервиса в CAS. Обратите внимание, что в приведённом выше коде файла свойств в качестве provider_id и registration_id указано значение cas; по факту оно может быть любым, важно чтобы значения provider_id и registration_id совпадали. Так же идентификатор провайдера фигурирует в адресе перенаправления при успешной авторизации: redirect-uri-template: http://example.com/login/oauth2/code/cas.
Осталось включить поддержку OAuth в Spring Security:
1 2 3 4 5 6 7 8 9 10 |
public class DefaultWebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .anyRequest().authenticated() .and() .oauth2Login();// enables OAuth 2.0 support } } |