Полная разработка с единым входом на основе нескольких строк конфигурации Spring Cloud.

сервер Spring Безопасность maven

Концепция единого входа

Единый вход (Single Sign On), называемый SSO, является одним из наиболее популярных решений для корпоративной бизнес-интеграции. Определение SSO заключается в том, что в системах с несколькими приложениями пользователям необходимо войти в систему только один раз, чтобы получить доступ ко всем взаимно доверенным системам приложений. Логика входа показана выше

Реализация Spring Family Bucket

Технический отбор:

Spring Boot
Spring Cloud 
Spring Security oAuth2

Клиент:

maven-зависимости

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
</dependency>

Аннотация EnableOAuth2Sso

Конфигурация начального класса @@EnableOAuth2Sso


@SpringBootApplication
public class PigSsoClientDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(PigSsoClientDemoApplication.class, args);
    }

}

конфигурационный файл

security:
  oauth2:
    client:
      client-id: pig
      client-secret: pig
      user-authorization-uri: http://localhost:3000/oauth/authorize
      access-token-uri: http://localhost:3000/oauth/token
      scope: server
    resource:
      jwt:
        key-uri: http://localhost:3000/oauth/token_key
  sessions: never

Сервер аутентификации единого входа

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

@Configuration
@Order(Integer.MIN_VALUE)
@EnableAuthorizationServer
public class PigAuthorizationConfig extends AuthorizationServerConfigurerAdapter {

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                .withClient(authServerConfig.getClientId())
                .secret(authServerConfig.getClientSecret())
                .authorizedGrantTypes(SecurityConstants.REFRESH_TOKEN, SecurityConstants.PASSWORD,SecurityConstants.AUTHORIZATION_CODE)
                .scopes(authServerConfig.getScope());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints
                .tokenStore(new RedisTokenStore(redisConnectionFactory))
                .accessTokenConverter(jwtAccessTokenConverter())
                .authenticationManager(authenticationManager)
                .exceptionTranslator(pigWebResponseExceptionTranslator)
                .reuseRefreshTokens(false)
                .userDetailsService(userDetailsService);
    }

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security
                .allowFormAuthenticationForClients()
                .tokenKeyAccess("isAuthenticated()")
                .checkTokenAccess("permitAll()");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public JwtAccessTokenConverter jwtAccessTokenConverter() {
        JwtAccessTokenConverter jwtAccessTokenConverter = new JwtAccessTokenConverter();
        jwtAccessTokenConverter.setSigningKey(CommonConstant.SIGN_KEY);
        return jwtAccessTokenConverter;
    }

}

Полный опыт настройки

  1. Доступ к index.html клиента единого входа
  2. Обычная аутентификация перенаправлена ​​на сервер единого входа
  3. Введите пароль учетной записи и перенаправьте на ресурс клиентского индекса исходного запроса.

Суммировать

  • Проблема с сервером клиентского доступа 403? Пользователь должен иметь полномочия ROLE_USER, а конкретную ошибку можно просмотреть в журнале.
  • Обнаружена возможная CSRF - параметр состояния присутствовал, но состояние не может быть найдено, в настоящее время разрешается путем установки сеанса: никогда или cotext-path
  • Пожалуйста, обратитесь к исходному кодуgitee.com/log4j/Разработайте аутентификацию и авторизацию на уровне предприятия на основе Spring Cloud и Spring Security Oauth2.0, предоставьте общий мониторинг служб, отслеживание ссылок, анализ журналов, управление кешем, планирование задач и т. д.