Spring-Boot 2.1.4.Release + Angular 6(两个独立的应用程序)。
我已经将UI和API都部署到了PCF。我们正在使用自定义SSO(auth_code流),该SSO已绑定到PCF API服务器作为服务代理。
Angular UI应用程序具有分别在PCF或localhost API上运行的代理和本地代理。当我在本地或PCF上运行两个应用程序时,没有问题,但是当我将本地UI指向PCF API时,我得到403。
在UI上处理将用户重定向到SSO登录!因此,禁用了spring-boot上的autoMagicConfiguration。基本上,我是在手动调用/ authorize,/ token和/ userinfo enpdoints,然后在SecurityContext上设置主体。
@Configuration
@EnableWebSecurity
@Order(value = 0)
public class SsoConfiguration extends WebSecurityConfigurerAdapter {
@Bean
@Order(0)
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf()
.disable()
.authorizeRequests()
.antMatchers(Constants.AUTH_WHITELIST)
.permitAll()
.anyRequest()
.authenticated();
}
@Override
public void configure(WebSecurity web) {
web.ignoring().antMatchers(Constants.SWAGGER_WHITELIST);
}
}
LoginService
public CustomUser login(LoginRequest request) throws JSONException {
ServiceConfiguration configuration =
cacheService.getConfigurations(Enums.ServiceName.SSO);
String token = getToken(configuration, request);
CustomUser user = userRepository.getUser(configuration, token);
cacheService.getCachedUser(user);
Authentication authentication =
new UsernamePasswordAuthenticationToken(user, null,
user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
return user;
}
public void logout(HttpServletRequest request, HttpServletResponse response)
{
Authentication authentication =
SecurityContextHolder.getContext().getAuthentication();
if (authentication != null) {
new SecurityContextLogoutHandler().logout(request, response,
authentication);
cacheService.clearCachedUser((CustomUser )
authentication.getPrincipal());
}
}
LoginRequest包含authCode并从SSO登录获取,并重定向uri以进行后续调用(/ token和/ userinfo)
CustomUser实施UserDetails以及SSO返回的其他字段
以下是从UI => API调用安全端点的屏幕截图: 1)PCF到PCF。 2)本地主机到本地主机。 3)PCF的本地主机这是UI 上的代理,UI httpClient 使用了Post / Get方法,我们使用Redis进行缓存,我注意到当我登录用户,它在Redis中添加了会话。除非我手动清除Redis或致电
,否则会话不会在注销时被删除。@CacheEvict(cacheNames = "my-cache", allEntries = true)
这可能是因为会议吗?