springboot集成钉钉登入+ Spring Security
时间: 2025-01-03 10:28:55 浏览: 19
### Spring Boot 整合钉钉登录与 Spring Security
为了在 Spring Boot 中实现钉钉登录并将其与 Spring Security 结合使用,需要完成几个关键步骤。这不仅涉及添加必要的依赖项,还需要配置 OAuth2 客户端支持以及自定义认证流程。
#### 添加 Maven 或 Gradle 依赖
首先,在 `pom.xml` 文件中加入如下依赖:
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<!-- 如果使用 Thymeleaf -->
<dependency>
<groupId>org.thymeleaf.extras</groupId>
<artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>
```
对于使用 Gradle 的项目,则应在 build.gradle 文件内添加对应的依赖声明[^1]。
#### 配置 application.yml
接着修改项目的 `application.yml` 来指定钉钉作为OAuth2提供商的相关参数:
```yaml
spring:
security:
oauth2:
client:
registration:
dingtalk:
client-id: YOUR_CLIENT_ID
client-secret: YOUR_SECRET_KEY
scope: snsapi_login
redirect-uri-template: "{baseUrl}/login/oauth2/code/{registrationId}"
provider:
dingtalk:
authorization-uri: https://oapi.dingtalk.com/connect/qrconnect?appid={clientId}&response_type=code&scope=snsapi_login&state={state}#wechat_redirect
token-uri: https://oapi.dingtalk.com/suite/grant_token?suite_key={clientSecret}
user-info-uri: https://oapi.dingtalk.com/user/getuserinfo?access_token={accessToken}&code={code}
jwk-set-uri: null
```
请注意替换上述占位符为实际的应用程序ID (`YOUR_CLIENT_ID`) 和密钥(`YOUR_SECRET_KEY`) 值[^2]。
#### 自定义 UserDetailsService
创建一个实现了 `UserDetailsServiceImpl` 接口的服务类用于处理来自 DingTalk API 返回的数据,并映射到本地用户实体上。此服务负责解析从DingTalk获取的信息并转换成适合Spring Security使用的格式。
```java
@Service
public class CustomUserService implements UserService {
@Override
public UserDetails loadUserByUserId(String userId) throws UsernameNotFoundException {
// 调用钉钉API查询用户详情...
// 构建返回的User对象
return new org.springframework.security.core.userdetails.User(
"dingtalk_user", "", true, true, true, true,
AuthorityUtils.createAuthorityList("ROLE_USER"));
}
}
```
#### 修改SecurityConfig
最后一步是在现有的 `WebSecurityConfigurerAdapter` 子类里注册新的过滤器链以便能够识别由DingTalk发起的身份验证请求。
```java
@EnableWebSecurity
@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
private final OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter;
@Autowired
public SecurityConfiguration(OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter){
this.oAuth2ClientAuthenticationProcessingFilter = oAuth2ClientAuthenticationProcessingFilter;
}
protected void configure(HttpSecurity http) throws Exception{
http.authorizeRequests()
.anyRequest().authenticated()// 所有请求都需要经过身份验证
.and()
.oauth2Login(oauth2 ->
oauth2.loginPage("/oauth2/authorization/dingtalk") // 设置默认跳转至钉钉授权页面
.userInfoEndpoint(userInfo-> userInfo.userService(new CustomUserService()))
)
;
}
}
```
以上就是将 Spring Boot、DingTalk 登录和 Spring Security 进行整合的大致过程[^3]。
阅读全文