当我们使用oauth2时,在thymeleaf客户端中注销

时间:2019-05-28 15:13:44

标签: spring-boot spring-security thymeleaf resttemplate spring-oauth2

我有3个应用程序,一个用于授权,一个具有资源(api剩余),另一个在百里香中消耗其余的客户端。

当我从客户端注销时,这似乎不是真正的注销,因为当我单击登录名时,该登录名即直接我...使用以前的用户。

我以Baeldung为例,他与我的相似,但存在相同的问题。

授权服务器 https://github.com/Baeldung/spring-security-oauth/tree/master/oauth-authorization-server

资源服务器 https://github.com/Baeldung/spring-security-oauth/tree/master/oauth-resource-server-1

胸腺客户 https://github.com/Baeldung/spring-security-oauth/tree/master/clients-thymeleaf/oauth-ui-authorization-code-thymeleaf

我在授权服务器中

@Controller
public class TokenController {

    @Resource(name = "tokenServices")
    private ConsumerTokenServices tokenServices;

    @Resource(name = "tokenStore")
    private TokenStore tokenStore;

    @RequestMapping(method = RequestMethod.POST, value = "/oauth/token/revokeById/{tokenId}")
    @ResponseBody
    public void revokeToken(HttpServletRequest request, @PathVariable String tokenId) {
        tokenServices.revokeToken(tokenId);
    }

    @RequestMapping(method = RequestMethod.GET, value = "/tokens")
    @ResponseBody
    public List<String> getTokens() {
        Collection<OAuth2AccessToken> tokens = tokenStore.findTokensByClientId("sampleClientId");
        return Optional.ofNullable(tokens).orElse(Collections.emptyList()).stream().map(OAuth2AccessToken::getValue).collect(Collectors.toList());
    }

    @RequestMapping(method = RequestMethod.POST, value = "/tokens/revokeRefreshToken/{tokenId:.*}")
    @ResponseBody
    public String revokeRefreshToken(@PathVariable String tokenId) {
        if (tokenStore instanceof JdbcTokenStore) {
            ((JdbcTokenStore) tokenStore).removeRefreshToken(tokenId);
        }
        return tokenId;
    }

}

在我的百里香客户中

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/").permitAll()
                .anyRequest().authenticated()
                .and()
                .oauth2Login()
                .and()
                .logout().logoutSuccessUrl("/");
    }

    @Bean
    public RestTemplate restTemplate(OAuth2AuthorizedClientService clientService) {
        RestTemplate restTemplate = new RestTemplate();
        List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors();
        if (CollectionUtils.isEmpty(interceptors)) {
            interceptors = new ArrayList<>();
        }
        interceptors.add(new AuthorizationHeaderInterceptor(clientService));
        restTemplate.setInterceptors(interceptors);
        return restTemplate;
    }

}

如何真正从百里香中注销(必须确定除去令牌吗?)

1 个答案:

答案 0 :(得分:0)

“安全性”必须位于应用程序的每一层上。但是我想在您的帖子中您指的是身份验证层。

如果您不希望所有人都可以使用REST API,则应向其添加身份验证层和至少一个CORS策略。考虑一下API密钥,OAuth或普通的旧用户名/密码验证。