spring oauth2 让某个账号token过期

终于要折腾oauth2了,感觉平常顺便玩玩还真没什么难度,但对于一些定制功能,什么N种账号类型,什么自定义返回体之类云云。浪费个几小时弄出下面一玩意,算是补充一下知识,在网上搜了一圈感觉也别人说--让某个账号token过期(带redis)。

打开工具看到那几个存在redis的令牌,顺便删一个,要不登录不了,要不访问不了,删不全就是麻烦,让他自己带token访问自己登出倒是简单,但对于管理权限系统就需求就不够了,就好像我要一个账号没有权限登录,但这个账号已经获取到token了,token没过期之前他还是有他本来该有的权限去操作。。。直接干掉token,让他什么都做不了。我稍微封装了一下工具,只要带着账号的基本信息就可以删除(username,scope,client_id)。


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.security.oauth2.provider.token.store.redis.JdkSerializationStrategy;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.TreeSet;

/**
 * 玩转oauth2 工具
 */
@Component
public class Oauth2Util {
    @Autowired
    private RedisConnectionFactory connectionFactory;

    public static Oauth2Util autowiredStatic;

    @PostConstruct
    public void init() {
        autowiredStatic = this;
        autowiredStatic.connectionFactory = this.connectionFactory;
    }

    private static JdkSerializationStrategy serializationStrategy = new JdkSerializationStrategy();

    /**
     * 根据username,client_id和scope获取该用户的auth_to_access的key值
     *
     * @param name
     * @param client_id
     * @param scope
     * @return
     */
    public static String getAuthToAccess(String name, String client_id, String scope) {
        String tempdd = null;
        Map<String, String> values = new LinkedHashMap();
        values.put("username", name.toUpperCase());
        values.put("client_id", client_id);
        values.put("scope", OAuth2Utils.formatParameterList(new TreeSet(Collections.singleton(scope))));
        try {
            MessageDigest digest = MessageDigest.getInstance("MD5");
            byte[] bytes = digest.digest(values.toString().getBytes("UTF-8"));
            tempdd = String.format("%032x", new BigInteger(1, bytes));
        } catch (NoSuchAlgorithmException var4) {
            throw new IllegalStateException("MD5 algorithm not available.  Fatal (should be in the JDK).", var4);
        } catch (UnsupportedEncodingException var5) {
            throw new IllegalStateException("UTF-8 encoding not available.  Fatal (should be in the JDK).", var5);
        }
        return tempdd;
    }

    /**
     * 清理指定账号的token,让其token强行删除,无法访问。
     *
     * @param name
     * @param client_id
     * @param scope
     */
    public static void removeTokenAccess(String name, String client_id, String scope) {

        //首先获取auth_to_access的key
        String key = getAuthToAccess(name, client_id, scope);
        //再通过key获取到当前的令牌信息
        byte[] serializedKey7 = serializationStrategy.serialize("auth_to_access:" + key);

        RedisConnection conn = autowiredStatic.connectionFactory.getConnection();
        byte[] bytes = null;
        try {
            bytes = conn.get(serializedKey7);
            conn.del(serializedKey7);

        } finally {
            conn.close();
        }
        OAuth2AccessToken accessToken = serializationStrategy.deserialize(bytes,
                OAuth2AccessToken.class);
        if(accessToken==null){
            return;
        }
        //再删除令牌信息
        byte[] serializedKey = serializationStrategy.serialize("access:" + accessToken.getValue());
        byte[] serializedKey2 = serializationStrategy.serialize("access_to_refresh:" + accessToken.getValue());
        byte[] serializedKey3 = serializationStrategy.serialize("auth:" + accessToken.getValue());
        byte[] serializedKey4 = serializationStrategy.serialize("refresh:" + accessToken.getRefreshToken());
        byte[] serializedKey5 = serializationStrategy.serialize("refresh_auth:" + accessToken.getRefreshToken());
        byte[] serializedKey6 = serializationStrategy.serialize("refresh_to_access:" + accessToken.getRefreshToken());
        conn = autowiredStatic.connectionFactory.getConnection();
        try {
            conn.del(serializedKey7);
            conn.del(serializedKey);
            conn.del(serializedKey2);
            conn.del(serializedKey3);
            conn.del(serializedKey4);
            conn.del(serializedKey5);
            conn.del(serializedKey6);
        } finally {
            conn.close();
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以使用Spring Security OAuth2来获取token。以下是基本的步骤: 1. 首先,您需要添加所需的依赖项。在您的项目的pom.xml文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-oauth2-client</artifactId> </dependency> ``` 2. 在application.properties或application.yml文件中配置OAuth2客户端的信息。例如: ```yaml spring: security: oauth2: client: registration: my-client-id: client-id: your-client-id client-secret: your-client-secret provider: your-authorization-server ``` 请替换`my-client-id`,`your-client-id`,`your-client-secret`和`your-authorization-server`为您的实际值。 3. 在您的代码中,您可以使用`RestTemplate`或`WebClient`来发送请求并获取token。以下是使用`RestTemplate`的示例代码: ```java import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import org.springframework.http.RequestEntity; import org.springframework.http.ResponseEntity; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientManager; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProvider; import org.springframework.security.oauth2.client.OAuth2AuthorizedClientProviderBuilder; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.OAuth2AccessToken; import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationCodeGrantRequest; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponse; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import java.net.URI; import java.util.Collections; @RestController public class OAuth2Controller { private final ClientRegistrationRepository clientRegistrationRepository; private final OAuth2AuthorizedClientManager authorizedClientManager; public OAuth2Controller(ClientRegistrationRepository clientRegistrationRepository, OAuth2AuthorizedClientManager authorizedClientManager) { this.clientRegistrationRepository = clientRegistrationRepository; this.authorizedClientManager = authorizedClientManager; } @GetMapping("/oauth2/token") public String getToken() { // 获取ClientRegistration ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("my-client-id"); // 构建OAuth2AuthorizationRequest OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode() .clientId(clientRegistration.getClientId()) .authorizationUri(clientRegistration.getProviderDetails().getAuthorizationUri()) .redirectUri(URI.create("http://localhost:8080/oauth2/callback")) .scopes(clientRegistration.getScopes()) .state("state") .build(); // 构建OAuth2AuthorizationResponse OAuth2AuthorizationResponse authorizationResponse = OAuth2AuthorizationResponse.success("authorization-code") .redirectUri("http://localhost:8080/oauth2/callback") .state("state") .build(); // 构建OAuth2AuthorizationCodeGrantRequest OAuth2AuthorizationCodeGrantRequest authorizationCodeGrantRequest = new OAuth2AuthorizationCodeGrantRequest( clientRegistration, authorizationRequest, authorizationResponse); // 构建OAuth2AuthorizedClientProvider OAuth2AuthorizedClientProvider authorizedClientProvider = OAuth2AuthorizedClientProviderBuilder.builder() .authorizationCode() .build(); // 获取OAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient = authorizedClientManager.authorize(authorizationCodeGrantRequest); // 构建请求头 HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setBearerAuth(authorizedClient.getAccessToken().getTokenValue()); // 发送请求并获取响应 RequestEntity<Void> requestEntity = new RequestEntity<>(headers, HttpMethod.GET, URI.create("http://api.example.com/resource")); ResponseEntity<String> responseEntity = new RestTemplate().exchange(requestEntity, String.class); return responseEntity.getBody(); } } ``` 请确保替换`my-client-id`和`http://localhost:8080/oauth2/callback`为实际值。在这个例子中,我们模拟了一个授权码授权流程来获取token,并使用token发送请求并获取资源的响应。 这只是一个简单的示例,实际的实现可能会有所不同,具体取决于您的认证服务器和需求。您可以根据您的情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值