下面我将为您详细讲解“SpringBoot整合Keycloak实现单点登录的示例代码”的完整攻略。
1. 准备工作
在开始整合之前,我们需要准备以下工具和环境:
- JDK 1.8或以上版本
- Maven
- Keycloak服务器
- IntelliJ IDEA或Eclipse等IDE
2. 创建Spring Boot项目
首先,我们需要创建一个Spring Boot项目。在IDE中选择创建一个Maven项目,并添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
3. 配置Keycloak
完成项目创建后,我们需要配置Keycloak服务器,以便Spring Boot应用程序可以使用它来管理用户身份验证和授权。我们需要在Keycloak中创建一个Realm和一个Client,并在Realm中添加一个用户。
在Keycloak中创建Realm和Client的步骤如下:
1.登录到Keycloak管理控制台。
2.点击左侧导航栏上的“Add Realm”按钮并输入Realm的名称。
3.在Realm中创建一个客户端。要创建客户端,请点击左侧导航栏上的“Clients”选项卡,然后点击“Add Client”按钮。创建完成后,请确保记下Client的“Client ID”和“Client Secret”,稍后在Spring Boot应用程序中将需要这些值。
4.在Realm中添加一个用户。要添加用户,请点击左侧导航栏上的“Users”选项卡,然后点击“Add User”按钮。在新用户的页面上输入用户名和密码後,点击“Save”。
4. 配置Spring Boot
Spring Boot整合Keycloak的主要步骤如下所示。
1.在application.properties文件中添加以下配置:
keycloak.auth-server-url=http://localhost:8080/auth
keycloak.realm=demo
keycloak.resource=spring-boot-keycloak-demo
keycloak.credentials.secret=YOUR_CLIENT_SECRET
其中,auth-server-url需要替换为您的Keycloak服务器地址,realm需要替换为您在Keycloak中创建的Realm的名称,resource需要替换为您在Keycloak中创建的Client的Client ID,secret需要替换为您在Keycloak中创建的Client的Client Secret。
- 在Spring Boot应用程序的主要配置类中添加以下代码段:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) {
KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
public KeycloakConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.authorizeRequests()
.antMatchers("/products/**").hasRole("USER")
.anyRequest().permitAll();
}
}
这段代码设置了Keycloak的身份验证提供程序和授权映射器,以及Keycloak配置解析器,并配置了Spring Security的HttpSecurity以保护我们的API。
5. 示例代码
下面是两个实际的示例代码,用于演示如何使用Spring Boot和Keycloak实现单点登录。
示例一:保护API
在这个示例中,我们创建了一个简单的RESTful API,需要通过Keycloak进行身份验证和授权才能访问。
首先,我们创建了Product类,供我们在API中使用:
public class Product {
private String id;
private String name;
private double price;
public Product(String id, String name, double price) {
this.id = id;
this.name = name;
this.price = price;
}
// getters and setters
}
接着,我们创建了ProductController:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/{id}")
public Product getProduct(@PathVariable String id) {
return new Product(id, "Product " + id, Math.random() * 100);
}
}
在这个示例中,我们通过添加@PreAuthorize("hasRole('ROLE_USER')")
注解来限制只有ROLE_USER(在Keycloak中定义)的用户才能访问API:
@RestController
@RequestMapping("/products")
public class ProductController {
@GetMapping("/{id}")
@PreAuthorize("hasRole('ROLE_USER')")
public Product getProduct(@PathVariable String id) {
return new Product(id, "Product " + id, Math.random() * 100);
}
}
最后,我们可以使用以下curl命令测试API:
$ curl -i http://localhost:8080/products/001 -H "Authorization: Bearer {token}"
其中,{token}需要替换为您在Keycloak中创建的用户的Bearer token。
示例二:使用Keycloak进行身份验证和授权
在这个示例中,我们创建了一个简单的登录页面,并使用Keycloak进行身份验证和授权。
首先,我们创建了一个简单的HTML登录页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<form method="post" action="/login">
<label for="username">Username:</label>
<input type="text" id="username" name="username"><br><br>
<label for="password">Password:</label>
<input type="password" id="password" name="password"><br><br>
<input type="submit" value="Submit">
</form>
</body>
</html>
接着,我们创建了一个LoginController:
@Controller
public class LoginController {
@GetMapping("/login")
public String login() {
return "login";
}
}
然后,我们需要使用KeycloakAuthenticationProcessingFilter
,该过滤器将处理来自Keycloak的身份验证和令牌,并将其存储为安全上下文。我们将其添加到Spring Boot的安全配置中:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http.addFilterBefore(keycloakAuthenticationProcessingFilter(), UsernamePasswordAuthenticationFilter.class);
http.authorizeRequests().anyRequest().authenticated();
}
}
最后,我们使用以下curl命令测试登录页面:
$ curl -i http://localhost:8080/login
这将在控制台中显示Logging in with username 'user' and password 'password'。完成后,我们可以使用以下命令获取用户的Bearer token:
$ curl -X POST \
http://localhost:8080/auth/realms/demo/protocol/openid-connect/token \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'username=user&password=password&grant_type=password&client_id=spring-boot-keycloak-demo&client_secret=YOUR_CLIENT_SECRET'
其中,client_secret需要替换为您在Keycloak中创建的Client的Client Secret。请求完成后,将返回一个JSON响应。我们需要从响应中提取access_token,它将用作使用Spring Boot应用程序时的Bearer token:
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6I...",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6I...",
"token_type": "Bearer",
"not-before-policy": 0,
"session_state": "ed4d7934-7dfe-41dc-aa00-eae7e5c31560",
"scope": "openid"
}
至此,我们已经完成了整个过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Keycloak实现单点登录的示例代码 - Python技术站