最整潔的 Spring Security OAuth2 的 SSO 單點登錄 示例

大體介紹

  • 在本教程中还蹲,我們將討論如何使用Spring Security OAuth和Spring Boot實現(xiàn)SSO(單點登錄)。

  • 我們將使用三個單獨的應(yīng)用程序:

授權(quán)服務(wù)器 - 這是中央身份驗證機制
兩個使用SSO的客戶端程序

  • 簡單來說壁袄,當用戶試圖訪問需要認證的頁面的時候,他們將被重定向到授權(quán)服務(wù)器進行身份驗證,認證成功后才能訪問缸剪。

我們將使用OAuth2中的授權(quán)碼模式來進行身份驗證策添。


客戶端程序

我們先從客戶端應(yīng)用程序開始配置;我們將使用最簡單的Spring Boot配置來完成材部。

Maven依賴

首先,我們需要在pom.xml中加入以下的依賴項:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.0.1.RELEASE</version>
</dependency>
Security相關(guān)配置

下面是在客戶端中關(guān)鍵的Security配置內(nèi)容唯竹,主要繼承WebSecurityConfigurerAdapter

@Configuration
@EnableOAuth2Sso
public class UiSecurityConfig extends WebSecurityConfigurerAdapter {
     
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
          .authorizeRequests()
          .antMatchers("/", "/login**")
          .permitAll()
          .anyRequest()
          .authenticated();
    }
}
  • antMatcher("/**") 表示匹配以/開頭的路由
  • .authorizeRequests()表示以authorizeRequests開始進行驗證
  • .antMatchers("/", "/login**").permitAll() 表示允許/(首頁)和/login開頭的路由通過乐导,因為我們驗證之前要允許別人訪問這些頁面。
  • .anyRequest().authenticated()表示其它的路由都需要經(jīng)過驗證

我們這個客戶端程序還有一個核心的點摩窃,就是我們要加上@EnableOAuth2Sso注解兽叮,以表明是一個SSO應(yīng)用配置。

接下來就是啟動文件的配置:

server:
    port: 8082
security:
  basic:
    enabled: false
  oauth2:
    client:
      clientId: SampleClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
    resource:
      userInfoUri: http://localhost:8081/auth/user/me

我們在controller定義一個路由猾愿,訪問 http://127.0.0.1:8082/admin/ 會直接訪問不通鹦聪。接下來,我們繼續(xù)配置認證服務(wù)器蒂秘,讓程序可以繼續(xù)泽本。

@RestController
@RequestMapping("/admin")
@Validated
public class AdminController {
    @RequestMapping(value="/")
    public PageInfo listByPage() {
        return  "這是一個分頁列表程序";
    }
}

認證服務(wù)器

接下來我們來討論怎么配置認證服務(wù)器相關(guān)的內(nèi)容。

Maven 依賴配置

首先姻僧,我們需要在pom.xml文件中加入以下的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.3.RELEASE</version>
</dependency>
認證配置

在這里我要重點理解將授權(quán)服務(wù)器和資源服務(wù)器一起運行规丽,作為一個應(yīng)用程序來部署蒲牧。

首先,我們先配置資源服務(wù)器赌莺,在啟動類中冰抢,加入@EnableResourceServer注解:

@SpringBootApplication
@EnableResourceServer
public class AuthorizationServerApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(AuthorizationServerApplication.class, args);
    }
}

然后配置我們的認證服務(wù)器:

@Configuration
@EnableAuthorizationServer
public class AuthServerConfig extends AuthorizationServerConfigurerAdapter {
     
    @Autowired
    private BCryptPasswordEncoder passwordEncoder;
 
    @Override
    public void configure(
      AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
        oauthServer.tokenKeyAccess("permitAll()")
          .checkTokenAccess("isAuthenticated()");
    }
 
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
          .withClient("SampleClientId")
          .secret(passwordEncoder.encode("secret"))
          .authorizedGrantTypes("authorization_code")
          .scopes("user_info")
          .autoApprove(true) 
          .redirectUris("http://localhost:8081/login","http://localhost:8083/login"); //有多個客戶端程序可以繼續(xù)加
    }
}

請出注意,我們這里使用的是authorization_code授權(quán)模式艘狭。

另外挎扰,請注意autoApprove設(shè)置為true,那么我們就不會被重定向巢音,并且可以提升為手動批準任何的scopes遵倦。

認證信息相關(guān)配置

首先,在我們的application.yml配置如下基本信息

server:
  port: 8081
  servlet:
    context-path : /auth

現(xiàn)在官撼,我們配置一些登錄信息梧躺。

@Configuration
@Order(1)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatchers()
          .antMatchers("/login", "/oauth/authorize")
          .and()
          .authorizeRequests()
          .anyRequest().authenticated()
          .and()
          .formLogin().permitAll();
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("john")
            .password(passwordEncoder().encode("123"))
            .roles("USER");
    }
     
    @Bean
    public BCryptPasswordEncoder passwordEncoder(){ 
        return new BCryptPasswordEncoder(); 
    }
}

@Order(1)代表優(yōu)先執(zhí)行,這里代表先執(zhí)行SecurityConfig的配置傲绣,在執(zhí)行AuthServerConfig的配置掠哥。
withUserpassword代表相關(guān)的認證信息,該信息可以結(jié)合實際情況在數(shù)據(jù)庫等途徑取出斜筐。
BCryptPasswordEncoder對密碼進行加密龙致。

認證信息

最后,我們可以建立一個路由來獲取用戶的認證相關(guān)的信息顷链。

@RestController
public class UserController {
    @GetMapping("/user/me")
    public Principal user(Principal principal) {
        return principal;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末目代,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗤练,更是在濱河造成了極大的恐慌榛了,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煞抬,死亡現(xiàn)場離奇詭異霜大,居然都是意外死亡,警方通過查閱死者的電腦和手機革答,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進店門战坤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人残拐,你說我怎么就攤上這事途茫。” “怎么了溪食?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵囊卜,是天一觀的道長。 經(jīng)常有香客問我,道長栅组,這世上最難降的妖魔是什么雀瓢? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮玉掸,結(jié)果婚禮上刃麸,老公的妹妹穿的比我還像新娘。我一直安慰自己排截,他們只是感情好嫌蚤,可當我...
    茶點故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布辐益。 她就那樣靜靜地躺著断傲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪智政。 梳的紋絲不亂的頭發(fā)上认罩,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機與錄音续捂,去河邊找鬼垦垂。 笑死,一個胖子當著我的面吹牛牙瓢,可吹牛的內(nèi)容都是我干的劫拗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼矾克,長吁一口氣:“原來是場噩夢啊……” “哼页慷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胁附,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤酒繁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后控妻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體州袒,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年弓候,在試婚紗的時候發(fā)現(xiàn)自己被綠了郎哭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡菇存,死狀恐怖夸研,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撰筷,我是刑警寧澤陈惰,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響抬闯,放射性物質(zhì)發(fā)生泄漏井辆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一溶握、第九天 我趴在偏房一處隱蔽的房頂上張望杯缺。 院中可真熱鬧,春花似錦睡榆、人聲如沸萍肆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽塘揣。三九已至,卻和暖如春宿崭,著一層夾襖步出監(jiān)牢的瞬間亲铡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工葡兑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奖蔓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓讹堤,卻偏偏與公主長得像吆鹤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子洲守,可洞房花燭夜當晚...
    茶點故事閱讀 45,446評論 2 359

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