В настоящее время я работаю с архитектурой весенних облачных микросервисов, у меня есть сервер авторизации oauth2, серверы zuul, eureka discovery и resources.Zuul Proxy также имеет UI клиента угловой.я делаю sso на сервере zuul, и он работает нормально, я могу получить токены доступа и ретрансляцию на нисходящие сервисы.Мой вопрос заключается в том, когда я захожу с помощью sso после закрытия браузера, логин не сохраняется.я также попытался использовать запомнить меня на сервере oauth2, который делает вход в систему сохраняется на сервере oauth2, но не в клиенте (zuul и angular ui).как мне сохранить логин в клиенте?
Сервер авторизации.
@Configuration
@EnableAuthorizationServer
public class OAuth2Configuration extends
AuthorizationServerConfigurerAdapter{
@Autowired
@Qualifier("authenticationManagerBean")
private AuthenticationManager authenticationManager;
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private DataSource dataSource;
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.jdbc(dataSource);
}
@Bean
@Primary
public DefaultTokenServices tokenServices() {
final DefaultTokenServices defaultTokenServices = new
DefaultTokenServices();
defaultTokenServices.setTokenStore(tokenStore());
defaultTokenServices.setSupportRefreshToken(true);
return defaultTokenServices;
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer
endpoints) throws Exception {
final TokenEnhancerChain tokenEnhancerChain = new TokenEnhancerChain();
tokenEnhancerChain.setTokenEnhancers(Arrays.asList(tokenEnhancer(), accessTokenConverter())); endpoints.tokenStore(tokenStore()).tokenEnhancer(tokenEnhancerChain).authenticationManager(authenticationManager);
endpoints.userDetailsService(userDetailsService);
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
public TokenEnhancer tokenEnhancer() {
return new CustomTokenEnhancer();
}
@Bean
protected JwtAccessTokenConverter accessTokenConverter() {
KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("securekeys.jks"), "secure123".toCharArray());
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setKeyPair(keyStoreKeyFactory.getKeyPair("securekeys"));
return converter;
}
}
zuul (API-шлюз с угловой)
@EnableZuulProxy
@EnableOAuth2Sso
@Configuration
public class OauthConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.httpBasic().disable()
.logout().and()
.authorizeRequests()
.antMatchers("/index.html","/*.js","/*.js.map", "/home", "/login"
,"/").permitAll()
.anyRequest().authenticated()
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
@Bean
public OAuth2RestOperations
restOperations(OAuth2ProtectedResourceDetails
resource,OAuth2ClientContext context) {
return new OAuth2RestTemplate(resource, context);
}
}
@Configuration
public class JwtConfiguration {
@Autowired
JwtAccessTokenConverter jwtAccessTokenConverter;
@Bean
@Qualifier("tokenStore")
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter);
}
@Bean
protected JwtAccessTokenConverter jwtTokenEnhancer() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
Resource resource = new ClassPathResource("public.cert");
String publicKey = null;
try {
publicKey = new String(FileCopyUtils.copyToByteArray(resource.getInputStream()));
} catch (IOException e) {
throw new RuntimeException(e);
}
converter.setVerifierKey(publicKey);
return converter;
}
}
public class ViewController {
@GetMapping(value = "/{path:[^\\.]*}")
public String redirect() {
return "forward:/index.html";
}
}
zuul (application.yml)
spring:
application:
name: zuul-proxy
server:
port: 8080
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://localhost:8761/eureka
security:
oauth2:
client:
client-id: clientid
client-secret: secret
access-token-uri: http://localhost:8081/authserver/oauth/token
user-authorization-uri:
http://localhost:8081/authserver/oauth/authorize
resource:
jwt:
key-value:
-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIUDSFZSDAQEAqqgETvajhbRgnr/Gypwo/eJ95Df5l+0rOQzzHtt5KHCJRm86WmncAGMfGHcqYxFH3YBB14ZTU/bzMHun/qFxqxM720OFVAJQMdoO6UFXXOp9vHiQib/qCNeU8Y1QWTeqkUJ6AorPsHqH0VVbp1RdW0YBT4PRC2rZkfQlSIqs81INA3tFZt25Z10dU0Plb0vQIGs2gZ3AL2q8VTd7z4k5GY6CF7IJ53W6LbNNup0Vbln4H2CNn1wYLRKIEXhvRxhQpJepC6nNeCvr/8BeY/GxT6xRStIfwLIWkRZVJoJVhkDS9vkV6mSckXZu11OcQ0eiH34BxVB4/b0kvknUoioEgQIDAQAB
-----END PUBLIC KEY-----
zuul:
prefix: /api
sensitive-headers:
routes:
m1-service:
path: /M1/**
service-id: m1-service
m2-service:
path: /M2/**
service-id: m2-service
m3-service:
path: /M3/**
service-id: m3-service