在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/網(wǎng)絡(luò)安全/ 如何更新redis中存儲的spring security oauth2認(rèn)證后的t

如何更新redis中存儲的spring security oauth2認(rèn)證后的token相關(guān)信息(用戶信息等)

最近發(fā)現(xiàn)自己的工程中,修改了UserDetails中的用戶信息后,再用access_token獲取用戶信息后,發(fā)現(xiàn)總是獲取的第一次登錄時存儲的信息,不是修改后的信息,后來才發(fā)現(xiàn)是沒有更新redis中的信息。
oauth2配置:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.approval.ApprovalStore;
import org.springframework.security.oauth2.provider.approval.TokenApprovalStore;
import org.springframework.security.oauth2.provider.approval.TokenStoreUserApprovalHandler;
import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
import org.springframework.security.oauth2.provider.request.DefaultOAuth2RequestFactory;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;

import javax.sql.DataSource;

/**
 *
 */
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(-1)
public class OAuth2SecurityConfiguration extends WebSecurityConfigurerAdapter
{

    @Autowired
    private DataSource dataSource;

    @Autowired
    private RedisConnectionFactory connectionFactory;

    @Autowired
    private PasswdAuthenticationProvider passwdAuthenticationProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    {
        auth.authenticationProvider(passwdAuthenticationProvider);
    }


    @Override
    protected void configure(HttpSecurity http) throws Exception
    {
        http.requestMatchers().antMatchers(HttpMethod.OPTIONS, "/oauth/token").and().csrf().disable();
    }

    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception
    {
        return super.authenticationManagerBean();
    }

    @Bean
    public ClientDetailsService clientDetailsService()
    {
        return new JdbcClientDetailsService(dataSource);
    }

    @Bean
    public TokenStore tokenStore()
    {
        RedisTokenStore redis = new RedisTokenStore(connectionFactory);
        return redis;
    }

    @Bean
    @Autowired
    public TokenStoreUserApprovalHandler userApprovalHandler(TokenStore tokenStore)
    {
        TokenStoreUserApprovalHandler handler = new TokenStoreUserApprovalHandler();
        handler.setTokenStore(tokenStore);
        handler.setRequestFactory(new DefaultOAuth2RequestFactory(clientDetailsService()));
        handler.setClientDetailsService(clientDetailsService());
        return handler;
    }

    @Bean
    @Autowired
    public ApprovalStore approvalStore(TokenStore tokenStore) throws Exception
    {
        TokenApprovalStore store = new TokenApprovalStore();
        store.setTokenStore(tokenStore);
        return store;
    }

}

獲取認(rèn)證后的信息:

Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            Object principal = authentication == null ? null : authentication.getPrincipal();

修改的就是principal 中的信息,但沒有修改redis中的信息,本想直接操作redis中存儲的對象,但擔(dān)心打亂spring security自身存儲的數(shù)據(jù)結(jié)構(gòu),苦苦尋找并自己研究了兩天,始終沒能找到答案,希望在這里問題可以得到解決。

回答
編輯回答
使勁操

不負(fù)有心人??!,最終還是自己找出解決辦法,閱讀了spring security源碼后,發(fā)現(xiàn)信息是在Tokenstone接口中新增的,由于該接口沒有提供修改方法,所以重寫了新增的方法,覆蓋了redis中的信息。

@Autowired
private TokenStore tokenStore;
@Autowired
private RedisConnectionFactory connectionFactory;
private AuthenticationKeyGenerator authenticationKeyGenerator=new 
DefaultAuthenticationKeyGenerator();

private JdkSerializationStrategy serializationStrategy=new JdkSerializationStrategy();

 //更新redis中的token相關(guān)信息
    OAuth2Authentication authentication = (OAuth2Authentication)SecurityContextHolder.getContext().getAuthentication();
    String key = authenticationKeyGenerator.extractKey(authentication);
    byte[] serializedKey =  serializationStrategy.serialize("auth_to_access:" + key);
    byte[] bytes = null;
    RedisConnection conn = connectionFactory.getConnection();
    try {
        bytes = conn.get(serializedKey);
    } finally {
        conn.close();
    }
    OAuth2AccessToken accessToken =serializationStrategy.deserialize(bytes, 
    OAuth2AccessToken.class);
    tokenStore.storeAccessToken(accessToken, authentication);
2017年2月19日 16:23