結(jié)合springboot和keycloak做登陸驗證

前言

登陸是一個項目的基礎(chǔ)轿曙,幾乎任何項目都需要包括登陸模塊,網(wǎng)上大部分登陸都是使用的shrio僻孝,個人感覺這種東西很老拳芙,而且不好用,偶然之前發(fā)現(xiàn)了一個叫keycloak的sso開源項目皮璧, 感覺挺不錯的舟扎,這篇文章主要講解如何使用springboot和keycloak進行結(jié)合。

版本

  1. springboot: 1.4.3.RELEASE 版本
  2. keycloak: 2.5.1.Final 版本
  3. vue: 2.1.0 版本

項目搭建

  1. 首先搭建keycloak的服務(wù) (略)
  2. 編寫前端代碼(用vue2寫的簡單的一個spa悴务,略)
  3. 編寫springboot的服務(wù)(略)
  4. 加入核心依賴
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-tomcat8-adapter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-spring-security-adapter</artifactId>
        </dependency>
  1. 在springboot的配置文件中加入
keycloak:
       configurationFile: "classpath:keycloak.json"
  1. 在resources的目錄下加入 keycloak.json 配置文件
{
  "realm": "family",
  "bearer-only": true,
  "auth-server-url": "http://localhost:8080/auth",
  "ssl-required": "external",
  "resource": "family-app",
  "enable-cors": true
}
  1. 配置springmvc的跨域filter
@Configuration
public class CorsFilterConfig implements Filter {

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {}

  @Override
  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
      FilterChain filterChain) throws IOException, ServletException {
    HttpServletResponse res = (HttpServletResponse) servletResponse;
    res.setHeader("Access-Control-Allow-Origin", "*");
    res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
    res.setHeader("Access-Control-Max-Age", "1728000");
    res.setHeader("Access-Control-Allow-Headers",
        "Authorization, Content-Type, Accept, x-requested-with, Cache-Control");
    filterChain.doFilter(servletRequest, res);
  }

  @Override
  public void destroy() {}
}
  1. 配置keycloak和spring security結(jié)合的配置文件
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class KeycloakSecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

  @Autowired
  public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(keycloakAuthenticationProvider());
  }

  @Bean
  @Override
  protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
    return new NullAuthenticatedSessionStrategy();
  }

  @Bean
  public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean(
      KeycloakAuthenticationProcessingFilter filter) {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
    registrationBean.setEnabled(false);
    return registrationBean;
  }

  @Bean
  public FilterRegistrationBean keycloakPreAuthActionsFilterRegistrationBean(
      KeycloakPreAuthActionsFilter filter) {
    FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
    registrationBean.setEnabled(false);
    return registrationBean;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .sessionAuthenticationStrategy(sessionAuthenticationStrategy()).and()
        .addFilterBefore(keycloakPreAuthActionsFilter(), LogoutFilter.class)
        .addFilterBefore(keycloakAuthenticationProcessingFilter(), X509AuthenticationFilter.class)
        .exceptionHandling().authenticationEntryPoint(authenticationEntryPoint()).and()
        .authorizeRequests()
        .requestMatchers(CorsUtils::isCorsRequest).permitAll()
//        .antMatchers("/family/*").hasAnyAuthority("user").antMatchers("/admin/*").hasRole("ADMIN")
        .antMatchers("/**").authenticated()
        .anyRequest().permitAll();
  }
}
  1. 對應(yīng)的接口上增加可以執(zhí)行的用戶角色
@RequestMapping(value = "/all", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  @ResponseBody
  @PreAuthorize("hasAnyAuthority('user')")
  public List<Family> queryAllFamilyInfo() {
    return familyInfoService.queryAllFamilyInfo();
  }

遇到的坑

  1. 對應(yīng)keycloak的用戶權(quán)限需要使用 hasAnyAuthority而不是 hasAnyRole睹限,并且需要在KeycloakSecurityConfig類中加入@EnableGlobalMethodSecurity(prePostEnabled = true) 注解
  2. keycloak-spring-security-adapterspring-boot-adpater 兩個依賴不能同時使用
  3. cors的跨域的配置,需要CorsFilterConfig的filter類配合KeycloakSecurityConfig類中的 requestMatchers(CorsUtils::isCorsRequest).permitAll()一起使用

完整的項目地址(包括了簡單的前端和后端代碼讯檐,不會寫前端工三,前端代碼比較垃圾倾哺。。 需要完善 ):

https://github.com/dragontree101/springboot-keycloak-demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市医窿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秉颗,死亡現(xiàn)場離奇詭異蚕甥,居然都是意外死亡菇怀,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钥顽,“玉大人,你說我怎么就攤上這事奶浦“牟妫” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遥椿。 經(jīng)常有香客問我,道長碴裙,這世上最難降的妖魔是什么莺琳? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任娃肿,我火速辦了婚禮,結(jié)果婚禮上晒杈,老公的妹妹穿的比我還像新娘。我一直安慰自己粪般,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布稼钩。 她就那樣靜靜地躺著础拨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪塔沃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音,去河邊找鬼综液。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的士葫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼送悔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了荚藻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疾呻,失蹤者是張志新(化名)和其女友劉穎璃岳,沒想到半個月后犁柜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洲鸠,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袜匿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片更啄。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稚疹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出祭务,到底是詐尸還是另有隱情内狗,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布义锥,位于F島的核電站柳沙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拌倍。R本人自食惡果不足惜赂鲤,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柱恤。 院中可真熱鬧数初,春花似錦、人聲如沸梗顺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寺谤。三九已至仑鸥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間变屁,已是汗流浹背眼俊。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粟关,地道東北人泵琳。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親获列。 傳聞我的和親對象是個殘疾皇子谷市,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)击孩,斷路器迫悠,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 本文包括:1、Filter簡介2巩梢、Filter是如何實現(xiàn)攔截的创泄?3、Filter開發(fā)入門4括蝠、Filter的生命周期...
    廖少少閱讀 7,272評論 3 56
  • 工作到現(xiàn)在快要1年半了,一直沒有時間自己從頭搭建個框架,這個周末實在是無聊,真的不想打lol了,(黑色玫瑰開黑的喊...
    MacSam閱讀 6,147評論 7 20
  • 關(guān)于 springmvc 3.x 版本對ajax跨域請求訪問 ajax 請求后鞠抑,瀏覽器出現(xiàn)跨域的問題那么在當前環(huán)境...
    山水風情閱讀 510評論 0 0
  • 文/A 幸運點 韶華減歲夏風收,葉宿江東誤水流忌警。 漫卷寒云行日月搁拙,輕撩細浪數(shù)春秋。 飛來幾度紅塵雨法绵,沒入千年白鷺洲...
    A幸運點閱讀 487評論 5 13