Springboot繼承Keycloak實現(xiàn)單點登錄與退出功能
什么是 keycloak
keycloak是一個開源的進行身份認證和訪問控制的軟件。是由Red Hat基金會開發(fā)的,我們可以使用keycloak方便的向應(yīng)用程序和安全服務(wù)添加身份認證,非常的方便。基于 Java 開發(fā),支持多種數(shù)據(jù)庫。
由于網(wǎng)上博客大部分都只有登陸沒有退出,自己花了一些時間研究了一下,這里將相關(guān)內(nèi)容進行記錄,基于Keyclaok 20的版本,實現(xiàn)springboot服務(wù)單點登錄與退出
一、依賴
<!-- 在父工程中 --> <dependencyManagement> <dependencies> <!-- 導入依賴 --> <dependency> <groupId>org.keycloak.bom</groupId> <artifactId>keycloak-adapter-bom</artifactId> <version>22.0.1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 在子工程中 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.keycloak</groupId> <artifactId>keycloak-spring-security-adapter</artifactId> </dependency> </dependencies>
二、keycloak配置
這個是主要的,用設(shè)置攔截器實現(xiàn)登陸與退出
package com.example.basic.conf; import org.keycloak.KeycloakPrincipal; import org.keycloak.KeycloakSecurityContext; import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; import org.keycloak.adapters.springsecurity.KeycloakConfiguration; import org.keycloak.adapters.springsecurity.account.SimpleKeycloakAccount; import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider; import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; 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.core.Authentication; import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy; import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @KeycloakConfiguration @EnableGlobalMethodSecurity(prePostEnabled = true) public class KeycloakSecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); auth.authenticationProvider(keycloakAuthenticationProvider); } @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Bean public org.keycloak.adapters.KeycloakConfigResolver KeycloakConfigResolver() { return new KeycloakSpringBootConfigResolver(); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); http .logout() //攔截logout請求 .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .addLogoutHandler(keycloakLogoutHandler()) .logoutSuccessHandler(logoutSuccessHandler()) .deleteCookies("JSESSIONID") .and() //設(shè)置哪些可以忽略掉授權(quán) .authorizeRequests() .antMatchers("/user/login", "/token/generate", "/access/**", "/js/**","/css/**","/fonts/**", "/index.html", "/error").permitAll() //除了上面忽略掉授權(quán)請求,剩下所有必須經(jīng)過授權(quán)才可以訪問 .antMatchers("/**").authenticated() .and().cors() .and().csrf().disable(); } //處理logout自動跳轉(zhuǎn)請求 private LogoutSuccessHandler logoutSuccessHandler() { return new LogoutSuccessHandler() { @Override public void onLogoutSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { KeycloakAuthenticationToken keycloakAuthenticationToken = (KeycloakAuthenticationToken)authentication; KeycloakSecurityContext keycloakSecurityContext = keycloakAuthenticationToken.getAccount().getKeycloakSecurityContext(); String idTokenHint = keycloakSecurityContext.getIdTokenString(); String issuer = keycloakSecurityContext.getIdToken().getIssuer(); String keycloakBaseUrl = issuer + "/protocol/openid-connect/logout"; String postLogoutRedirectUri = httpServletRequest.getScheme() + "://" + httpServletRequest.getHeader("host"); String logoutUrl = keycloakBaseUrl + "?post_logout_redirect_uri=" + postLogoutRedirectUri + "&id_token_hint=" + idTokenHint; // Do logout by redirecting to Keycloak logout httpServletResponse.sendRedirect(logoutUrl); } }; } }
到此這篇關(guān)于Springboot繼承Keycloak實現(xiàn)單點登錄與退出功能的文章就介紹到這了,更多相關(guān)Springboot Keycloak單點登錄與退出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot容器加載時執(zhí)行特定操作(推薦)
這篇文章主要介紹了Spring Boot容器加載時執(zhí)行特定操作及spring內(nèi)置的事件,需要的朋友可以參考下2018-01-01Java使用ArrayList實現(xiàn)撲克牌的示例代碼
學習了關(guān)于集合類的知識,我們可以做一個小項目來加深對集合類知識的學習!本文就來利用ArrayList實現(xiàn)撲克牌發(fā)牌洗牌效果,需要的可以參考一下2022-10-10MybatisPlus實現(xiàn)insertBatchSomeColumn進行批量增加
本文主要介紹了MybatisPlus實現(xiàn)insertBatchSomeColumn進行批量增加,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03