springcloud-sso單點登陸(三)

單點登陸的實現(xiàn)方式有多種:
1椎椰、基于cas來做
2离咐、spring cloud oauth2的spring全家桶
3绊汹、自定義jwt(不推薦)
下面我們基于spring全家桶來做一個單點登陸系統(tǒng)2019年12月23日最新springboot版本2.2.2.RELEASE腿倚;由于篇幅問題昏滴,我們分成兩篇文章。
基于上一篇http://www.reibang.com/p/80b125ea8e76
源碼:https://github.com/xcocean/spring-cloud-sso
第三篇是對springcloud-sso的額外補充

前言

關(guān)于springcloud中的異常累颂,可以在網(wǎng)關(guān)中處理滞详,也可以在當前服務(wù)中攔截處理,返回統(tǒng)一結(jié)果紊馏。推薦既在網(wǎng)關(guān)中處理料饥,也在元服務(wù)中處理。

1朱监、token自定義key

oauth2默認的token生成是UUID岸啡,使用jwt一大推又不好,所以我們自定義登陸成功生成的access_token赌朋。自定義TokenEnhancer即可凰狞。

CustomTokenEnhancer.java
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.token.TokenEnhancer;

import java.util.HashMap;
import java.util.Map;

public class CustomTokenEnhancer implements TokenEnhancer {
    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken,
                                     OAuth2Authentication authentication) {
        if (accessToken instanceof DefaultOAuth2AccessToken) {
            DefaultOAuth2AccessToken token = ((DefaultOAuth2AccessToken) accessToken);
            //自定義自己的 access_token
            token.setValue(customToken());
            OAuth2RefreshToken refreshToken = token.getRefreshToken();
            if (refreshToken instanceof DefaultOAuth2RefreshToken) {
                //自定義生成的 refreshToken
                token.setRefreshToken(new DefaultOAuth2RefreshToken(customRefreshToken()));
            }
            Map<String, Object> additionalInformation = new HashMap<String, Object>();
            additionalInformation.put("client_id", authentication.getOAuth2Request().getClientId());
            token.setAdditionalInformation(additionalInformation);
            return token;
        }
        return accessToken;
    }

    private static int i = 0;
    private static int j = 0;

    /**
     * 自定義token的值
     * 集群的時候注意不要生成重復的值即可
     */
    private String customToken() {
        i = i + 1;
        return "666" + i;
    }

    /**
     * 自定義token的值
     * 集群的時候注意不要生成重復的值即可
     */
    private String customRefreshToken() {
        j = j + 1;
        return "888" + i;
    }
}
AuthorizationServerConfiguration.java中注入
     // 注入自定義令牌生成
    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new CustomTokenEnhancer();
    }
    // ...

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                // 用于支持密碼模式
                .authenticationManager(authenticationManager)
                .tokenStore(tokenStore())
                // 自定義token生成規(guī)則
                .tokenEnhancer(tokenEnhancer())
                .userDetailsService(userDetailsService);
    }

效果如下:


image.png

2、刷新令牌

刷新令牌的原理是再次調(diào)用登陸UserDetailsService需要授權(quán)注入沛慢。在上一篇文章中講到的AuthorizationServerConfiguration.java中注入我們自定義的UserDetailsServiceImpl

    // 我們自定義的登陸UserDetailsService
    @Autowired
    private UserDetailsServiceImpl userDetailsService;
// .....
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints
                // 用于支持密碼模式
                .authenticationManager(authenticationManager)
                .tokenStore(tokenStore())
                // 此處注入我們自定義的userDetailsService用于token的刷新
                .userDetailsService(userDetailsService);
    }

如果想刷新令牌赡若,還是調(diào)用獲取token的url,只需將grant_type換成refresh_token团甲,post請求如下:

http://localhost:9000/oauth/token
參數(shù):
refresh_token:49eb4217-062f-47bc-956a-5d3f4684418a
client_id:client
client_secret:secret
grant_type:refresh_token

結(jié)果如下:


image.png

3逾冬、注銷的實現(xiàn)

注銷直接調(diào)用consumerTokenServices.revokeToken(token)即可,該注銷將把tokenrefresh_token一并移除掉躺苦,可觀察redis的值身腻。

    @Autowired
    private ConsumerTokenServices consumerTokenServices;

    @GetMapping("/user/logout")
    public ResponseResult<Void> logout(HttpServletRequest request) {
        // 獲取 token
        String token = request.getParameter("access_token");
        if (token == null) {
            token = request.getHeader("authorization").split(" ")[1];
        }
        // 刪除 token 以注銷
        consumerTokenServices.revokeToken(token);
        return new ResponseResult<Void>(CodeStatus.OK, "用戶已注銷");
    }

然后GET調(diào)用:http://localhost:8080/user/logout?access_token=7ed1b398-6db5-477b-80e7-783de1bf72d7

image.png

4、檢查令牌是否有效

直接Get訪問即可:http://localhost:9000/oauth/check_token?token=2580d87d-f162-4f19-8a8f-238a4f91ae54

image.png

無效時:
image.png

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匹厘,一起剝皮案震驚了整個濱河市嘀趟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愈诚,老刑警劉巖她按,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牛隅,死亡現(xiàn)場離奇詭異,居然都是意外死亡酌泰,警方通過查閱死者的電腦和手機媒佣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陵刹,“玉大人默伍,你說我怎么就攤上這事∷ニ觯” “怎么了也糊?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碘耳。 經(jīng)常有香客問我显设,道長框弛,這世上最難降的妖魔是什么辛辨? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮瑟枫,結(jié)果婚禮上斗搞,老公的妹妹穿的比我還像新娘。我一直安慰自己慷妙,他們只是感情好僻焚,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膝擂,像睡著了一般虑啤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上架馋,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天狞山,我揣著相機與錄音,去河邊找鬼叉寂。 笑死萍启,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的屏鳍。 我是一名探鬼主播勘纯,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钓瞭!你這毒婦竟也來了驳遵?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤山涡,失蹤者是張志新(化名)和其女友劉穎堤结,沒想到半個月后搏讶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡霍殴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年媒惕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片来庭。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡妒蔚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出月弛,到底是詐尸還是另有隱情肴盏,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布帽衙,位于F島的核電站菜皂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厉萝。R本人自食惡果不足惜恍飘,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谴垫。 院中可真熱鬧章母,春花似錦、人聲如沸翩剪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽前弯。三九已至蚪缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恕出,已是汗流浹背询枚。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留剃根,地道東北人哩盲。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像狈醉,于是被迫代替她去往敵國和親廉油。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容