Spring-Boot 403对已认证用户的访问被拒绝

时间:2019-10-03 16:12:36

标签: spring-boot authentication spring-security single-sign-on spring-security-oauth2

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。  PCF to PCF 2)本地主机到本地主机。 Localhost to Localhost. 3)PCF的本地主机Localhost to PCF这是UI UI Proxies上的代理,UI httpClient enter image description here使用了Post / Get方法,我们使用Redis进行缓存,我注意到当我登录用户,它在Redis中添加了会话。除非我手动清除Redis或致电

,否则会话不会在注销时被删除。
@CacheEvict(cacheNames = "my-cache", allEntries = true)

我尝试通过updating app.properties禁用Redis会话

但是无论如何它似乎正在Redis中设置会话。 SSO

这可能是因为会议吗?

0 个答案:

没有答案