spring boot oauth2單點登錄(二)客戶端信息存儲

相關文章

1积暖、spring boot oauth2單點登錄(一)-前后端分離例子
2、spring boot oauth2單點登錄(二)-客戶端信息存儲
3爹橱、spring boot oauth2單點登錄(三)-token存儲方式
4、spring boot oauth2單點登錄(四)-code存儲方式

源碼地址

后端:https://gitee.com/fengchangxin/sso
前端:https://gitee.com/fengchangxin/sso-page

準備

后端:三個spring boot應用阁吝,auth(授權管理)崔赌,client1(客戶端應用1),client2(客戶端應用2)淆珊。
前端:三個Vue項目夺饲,auth,client1,client2往声。分別對應三個后端應用擂找。
工具:nginx
域名:oauth.com,client1.com浩销,client2.com贯涎,分別對應三個系統(tǒng)。
開發(fā)環(huán)境:先在host文件添加上面三個域名慢洋。
端口:
后端服務auth(8080)塘雳,client1(8081),client2(8082)普筹。
前端auth(8083)败明,client1(8084),client2(8085)太防。
依賴:

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>

測試地址:
client1:http://client1.com/client1Page/#/home
client2:http://client2.com/client2Page/#/home
登錄用戶:admin/123456

備注:此篇文章對應的授權中心服務是:auth-db妻顶。
spring boot oauth2單點登錄(一)-實現(xiàn)例子通過這篇文章搭建了開發(fā)環(huán)境單點登錄,不過用戶信息和客戶端信息都是存儲在內存的蜒车,現(xiàn)在把這些信息存儲在數(shù)據(jù)庫盈包。

1、用戶信息

實現(xiàn)UserDetailsService接口的loadUserByUsername方法醇王,用戶登錄時通過此接口查詢數(shù)據(jù)庫返回賬戶密碼等信息呢燥。并在WebSecurityConfiguration添加配置。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //TODO 在這里進行數(shù)據(jù)庫查詢獲取用戶信息
        UserDetails user = User.withUsername("admin").password(passwordEncoder.encode("123456")).authorities("ADMIN", "USER").build();
        return user;
    }
}
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder);
    }

2寓娩、客戶端信息

2.1默認實現(xiàn)

框架有默認的實現(xiàn)叛氨,我們只要在AuthorizationServerConfiguration配置好使用即可,數(shù)據(jù)庫表結構在resources下oauth.sql棘伴。需要注意的是在oauth_client_details表存儲的client_secret是經過PasswordEncoder加密處理的數(shù)據(jù)寞埠,不然無法登錄。
使用默認實現(xiàn)需要引入jdbc依賴:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
    @Autowired
    private DataSource dataSource;
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.allowFormAuthenticationForClients()
                .checkTokenAccess("isAuthenticated()")
                .tokenKeyAccess("isAuthenticated()");
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(new JdbcClientDetailsServiceBuilder().dataSource(dataSource)
                .passwordEncoder(passwordEncoder).build());
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        super.configure(endpoints);
    }

}

2.2自定義實現(xiàn)

若表結構不符合要求焊夸,想要改變表結構仁连,不想用默認的實現(xiàn),那可以根據(jù)自己的需求來實現(xiàn)阱穗,主要是實現(xiàn)ClientDetailsService接口饭冬,并把結果組裝成BaseClientDetails返回。
舉個例子揪阶,自定義一張表client_details_test昌抠,結構和oauth_client_details一樣,多加了一個Id字段鲁僚,然后實現(xiàn)ClientDetailsService接口炊苫,需要注意的是這個實現(xiàn)類的bean名稱不能使用默認裁厅,需要重新命名。

@Service("clientDetailsManager")
public class ClientDetailsServiceImpl implements ClientDetailsService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        //TODO 自定義實現(xiàn)數(shù)據(jù)庫查詢
        String sql = "select client_id,client_secret,resource_ids, scope, authorized_grant_types, web_server_redirect_uri, " +
                "authorities, access_token_validity, refresh_token_validity, additional_information, autoapprove from client_details_test where client_id=?";
        return jdbcTemplate.queryForObject(sql,new ClientDetailsTestRowMapper(),clientId);
    }

    private static class ClientDetailsTestRowMapper implements RowMapper<ClientDetails> {
        @Override
        public ClientDetails mapRow(ResultSet rs, int i) throws SQLException {
            BaseClientDetails details = new BaseClientDetails(rs.getString(1), rs.getString(3), rs.getString(4),
                    rs.getString(5), rs.getString(7), rs.getString(6));
            details.setClientSecret(rs.getString(2));
            if (rs.getObject(8) != null) {
                details.setAccessTokenValiditySeconds(rs.getInt(8));
            }
            if (rs.getObject(9) != null) {
                details.setRefreshTokenValiditySeconds(rs.getInt(9));
            }
            String scopes = rs.getString(11);
            if (scopes != null) {
                details.setAutoApproveScopes(StringUtils.commaDelimitedListToSet(scopes));
            }
            return details;
        }
    }
}

然后在AuthorizationServerConfiguration中配置侨艾。

    @Autowired
    private ClientDetailsService clientDetailsManager;
    //自定義實現(xiàn)
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(clientDetailsManager);
    }

總結:上面客戶端信息的兩種方式而選一执虹,根據(jù)實際情況選擇,默認實現(xiàn)表結構唠梨、表名是不可以變化的袋励,自定義實現(xiàn)可以結合mybatis等其他數(shù)據(jù)庫框架來靈活使用,表結構名稱等都可以自己設計姻成,比較靈活。而用戶登錄信息接口UserDetailsService也有默認實現(xiàn)愿棋,比如數(shù)據(jù)庫實現(xiàn)JdbcDaoImpl科展。
結合文章開頭列出的第一篇文章和此篇文章,就滿足了一般的單機應用糠雨,但對于集群部署的應用還是不夠才睹,token和授權碼code都是存在內存中,集群部署的會出問題甘邀,下列文章解決此問題琅攘。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市松邪,隨后出現(xiàn)的幾起案子坞琴,更是在濱河造成了極大的恐慌,老刑警劉巖逗抑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剧辐,死亡現(xiàn)場離奇詭異,居然都是意外死亡邮府,警方通過查閱死者的電腦和手機荧关,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褂傀,“玉大人忍啤,你說我怎么就攤上這事∠杀伲” “怎么了同波?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長叠国。 經常有香客問我参萄,道長,這世上最難降的妖魔是什么煎饼? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任讹挎,我火速辦了婚禮校赤,結果婚禮上,老公的妹妹穿的比我還像新娘筒溃。我一直安慰自己马篮,他們只是感情好,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布怜奖。 她就那樣靜靜地躺著浑测,像睡著了一般。 火紅的嫁衣襯著肌膚如雪歪玲。 梳的紋絲不亂的頭發(fā)上迁央,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音滥崩,去河邊找鬼岖圈。 笑死,一個胖子當著我的面吹牛钙皮,可吹牛的內容都是我干的蜂科。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼短条,長吁一口氣:“原來是場噩夢啊……” “哼导匣!你這毒婦竟也來了?” 一聲冷哼從身側響起茸时,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤贡定,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后可都,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厕氨,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年汹粤,在試婚紗的時候發(fā)現(xiàn)自己被綠了命斧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡嘱兼,死狀恐怖国葬,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情芹壕,我是刑警寧澤汇四,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站踢涌,受9級特大地震影響通孽,放射性物質發(fā)生泄漏。R本人自食惡果不足惜睁壁,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一背苦、第九天 我趴在偏房一處隱蔽的房頂上張望互捌。 院中可真熱鬧,春花似錦行剂、人聲如沸秕噪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腌巾。三九已至,卻和暖如春铲觉,著一層夾襖步出監(jiān)牢的瞬間澈蝙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工撵幽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灯荧,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓并齐,卻偏偏與公主長得像漏麦,于是被迫代替她去往敵國和親客税。 傳聞我的和親對象是個殘疾皇子况褪,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353