Внедрение авторизации OAuth 2.0 с помощью Spring Security OAuth

Spring Boot Java Spring Java EE

Введение в OAuth 2.0

OAuth 2.0Это лицензионное соглашение промышленного уровня. OAuth 2.0 унаследован от OAuth 1.0, созданного в 2006 году. OAuth 2.0 стремится помочь разработчикам упростить авторизацию и предоставить специальные процессы авторизации для веб-приложений, настольных приложений, мобильных приложений и встроенных приложений.

OAuth 2.0 is the industry-standard protocol for authorization. OAuth 2.0 supersedes the work done on the original OAuth protocol created in 2006. OAuth 2.0 focuses on client developer simplicity while providing specific authorization flows for web applications, desktop applications, mobile phones, and living room devices.

Четыре роли OAuth 2.0

Для простоты понимания, обычно используемые使用微信登录Например

  • Resource Owner

    Владелец ресурса, личная информация, установленная на WeChat каждого пользователя, соответствующего WeChat, принадлежит каждому пользователю и не принадлежит Tencent.

  • Resource Server

    Сервер ресурсов обычно представляет собой REST API для некоторых операций (добавление, удаление, изменение и запрос) пользовательских данных, таких как интерфейс WeChat для получения основной информации о пользователе.

  • Client Application

    Сторонний клиент, по сравнению с WeChat, представляет собой приложение, разработанное различными общедоступными учетными записями WeChat.认证服务器Доступ после авторизации资源服务器REST API для получения базовой информации, такой как аватар пользователя, пол, регион и т. д.

  • Authorization Server

    Сервер аутентификации проверяет, является ли сторонний клиент законным. Если это законно, токен выдается клиенту, и третья сторона использует токен для вызова API сервера ресурсов.

Четыре метода авторизации (тип гранта)

  • anthorization_code

    Тип кода авторизации, применимый к приложению веб-сервера. Схема такова: клиент звонит первым/oauth/authorize/Войдите в интерфейс авторизации пользователя и вернитесь после авторизации пользователяcode, клиент то по коду иappSecretПолучатьaccess token.

  • implicitУпрощенный тип имеет меньше шагов для получения кода авторизации, чем тип кода авторизации. После авторизации клиентского приложения сервер аутентификации напрямую поместит токен доступа в URL-адрес клиента. Клиент анализирует URL-адрес, чтобы получить токен. Этот метод на самом деле не очень безопасный, вы можете пройтиhttps защищенный каналиСократить срок действия токена доступаприходят с меньшим риском.

  • password

    Тип пароля.Клиентское приложение получает токен доступа через имя пользователя и пароль. Это подходит для сервера ресурсов, сервера аутентификации и клиента, чтобы иметь полные доверительные отношения, потому что пользователю необходимо отправить имя пользователя и пароль пользователя непосредственно в клиентское приложение, а клиентское приложение получает токен через отправленное имя пользователя и пароль. пользователем, а затем обращается к ресурсу сервера ресурсов. Например, Alipay может войти в систему напрямую, используя имя пользователя и пароль Taobao, потому что они принадлежат одной и той же компании.полное доверие.

  • client_credentials

    Тип клиента — метод, не требующий участия пользователя и используемый для стыковки между разными сервисами. Например, приложение, разработанное вами, должно вызывать службу поставщика услуг кодов проверки SMS, службу поставщика картографических услуг и службу поставщика услуг push-сообщений мобильного телефона. Когда вам нужно позвонить в службу, вы можете напрямую обратиться к поставщику услуг.appIDиappSecretЧтобы получить токен, после получения токена вы можете напрямую позвонить в службу.

другие понятия

  • scope: к каким областям сервера ресурсов осуществляется доступ.
  • refresh token: когда срок действия токена доступа истечет, вы сможете снова получить токен доступа с помощью токена обновления.

выполнить

Иногда сервер ресурсов и сервер аутентификации являются двумя разными приложениями. Иногда сервер ресурсов и сервер аутентификации находятся в одном приложении. Разница заключается в том, должен ли сервер ресурсов проверять действительность токена. а последний не нужен. Здесь реализован последний.

Конфигурация безопасности приложения

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
                .and().csrf().disable()
                .authorizeRequests().anyRequest().authenticated();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        super.configure(web);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("lyt").password("lyt").authorities("ROLE_USER")
                .and().withUser("admin").password("admin").authorities("ROLE_ADMIN");
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
}

Конфигурация сервера аутентификации

@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration  extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory().withClient("client")
                .scopes("read","write")
                .secret("secret")
                .authorizedGrantTypes("authorization_code","password","implicit","client_credentials");}

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        super.configure(security);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
       endpoints.authenticationManager(authenticationManager);
    }

    @Autowired
    @Qualifier("authenticationManagerBean")
    private AuthenticationManager authenticationManager;
}

Конфигурация сервера ресурсов

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableResourceServer
@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
	@Override
	public void configure(HttpSecurity http) throws Exception {
		http.antMatcher("/oauth2/api/**").authorizeRequests()
			.antMatchers(HttpMethod.GET, "/read/**").access("#oauth2.hasScope('read')")
			.antMatchers(HttpMethod.POST, "/write/**").access("#oauth2.hasScope('write')")
			.antMatchers(HttpMethod.PUT, "/write/**").access("#oauth2.hasScope('write')")
			.antMatchers(HttpMethod.DELETE, "/write/**").access("#oauth2.hasScope('write')");
	}

}

сервер ресурсовfilter-orderнастраивать

нуждаться вapplication.ymlУстановите порядок фильтрации на 3, пожалуйста, обратитесь к конкретным причинамСсылка на сайт

Предотвращение конфликтов файлов cookie

Во избежание конфликта между файлом cookie сервера аутентификации и файлом cookie клиента и возникновения ошибки лучше всего изменитьcookie nameили установитьcontextPath.

контрольная работа

postmanМетод аутентификации OAuth 2.0 представлен в .После получения токена вы можете добавить аутентификацию в http-запрос, чтобы запросить REST API сервера ресурсов.

  • Информация о клиенте

输入图片说明
Информация о клиенте

  • Разрешить

输入图片说明
Разрешить

  • приобретенный токен

输入图片说明
приобретенный токен

  • Доступ к API сервера ресурсов

输入图片说明
Доступ к API сервера ресурсов

Наконец

тестовый кодгитхаб-адрес. Если вы заинтересованы, вы можете подписаться на общедоступную учетную запись WeChat, чтобы получать последние push-статьи.

输入图片说明
Добро пожаловать в публичный аккаунт WeChat