能否给出一个使用Spring Security、JWT和OAuth2.0实现简单SSO(单点登录)功能的Java代码示例?
时间: 2024-12-26 08:28:41 浏览: 5
在Java中,通过Spring Security、JWT(JSON Web Tokens)和OAuth2.0实现简单的Single Sign-On (SSO) 需要以下几个步骤:
首先,你需要添加相应的依赖到你的`pom.xml`文件中:
```xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>
<!-- 如果使用的是OAuth2服务器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
</dependencies>
```
然后,创建一个JWT服务,例如:
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
public class JwtUtil {
private static final String SECRET_KEY = "your-secret-key";
// ...其他方法
public static String createToken(User user) {
return Jwts.builder()
.setSubject(user.getUsername())
.setAudience("your-audience") // 应该是客户端的URL
.claim("authorities", user.getAuthorities().toString()) // 添加用户角色信息
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
}
```
接着,在Spring Security配置里启用JWT并处理登录:
```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtUtil jwtUtil;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/login").permitAll() // 允许直接访问登录接口
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login")
.defaultSuccessUrl("/protected")
.permitAll()
.and()
.csrf().disable(); // 关闭CSRF保护
http.headers().frameOptions().disable(); // 可能需要关闭浏览器内嵌框架的支持
}
@Bean
public AuthenticationProvider authenticationProvider() {
return new JWTAuthenticationProvider(jwtUtil);
}
// JWT相关的处理
// ...
}
```
最后,创建一个JWT认证器:
```java
@Component
public class JWTAuthenticationProvider implements AuthenticationProvider {
private JwtUtil jwtUtil;
public JWTAuthenticationProvider(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
}
@Override
public UserDetailsService getUserDetailsService(Authentication token) {
String username = getTokenUsername(token);
// 这里你可以从数据库验证用户名和密码或JWT的有效性
return userService.loadUserByUsername(username);
}
// Token解析等其他逻辑...
}
```
在这个例子中,当用户成功登录后,服务器会返回一个JWT令牌给客户端,客户端需要将这个令牌存储起来并在后续请求中附带在Authorization头。服务器端会检查这个JWT来验证用户的权限。
阅读全文