This commit is contained in:
parent
fe56edd54f
commit
9d790b6999
|
|
@ -27,17 +27,31 @@ public class DbService {
|
||||||
clients.add(new Client(2L, "b-client","b-secret","https://b.local.com/callback"));
|
clients.add(new Client(2L, "b-client","b-secret","https://b.local.com/callback"));
|
||||||
|
|
||||||
// 租户-客户端关系
|
// 租户-客户端关系
|
||||||
|
// 租户t1 可以登录 a b
|
||||||
|
// 租户t2 可以登录 a
|
||||||
tenantClients.add(new TenantClient(1L, 1L,1L));
|
tenantClients.add(new TenantClient(1L, 1L,1L));
|
||||||
tenantClients.add(new TenantClient(2L, 1L,2L));
|
tenantClients.add(new TenantClient(2L, 1L,2L));
|
||||||
tenantClients.add(new TenantClient(3L, 2L,1L));
|
tenantClients.add(new TenantClient(3L, 2L,1L));
|
||||||
|
|
||||||
// 为租户添加用户
|
// 为租户添加用户
|
||||||
|
// t1 u1 可登录 a b
|
||||||
users.add(new User(1L,1L,"u1","u1",true,false));
|
users.add(new User(1L,1L,"u1","u1",true,false));
|
||||||
users.add(new User(2L,1L,"u2","u2",false,false));
|
users.add(new User(2L,1L,"u2","u2",false,true));
|
||||||
users.add(new User(3L,2L,"u3","u3",false,false));
|
users.add(new User(3L,2L,"u3","u3",false,false));
|
||||||
|
users.add(new User(4L,2L,"u2","u2",false,false));
|
||||||
|
|
||||||
// 添加系统的普通用户
|
// 添加系统的普通用户
|
||||||
|
// t1 u2 可以登录 a
|
||||||
|
// t2 u3 可以登录 a
|
||||||
userClientAuthorities.add(new UserClientAuthorities(1L,2L,1L));
|
userClientAuthorities.add(new UserClientAuthorities(1L,2L,1L));
|
||||||
|
userClientAuthorities.add(new UserClientAuthorities(2L,3L,1L));
|
||||||
|
userClientAuthorities.add(new UserClientAuthorities(3L,4L,1L));
|
||||||
|
|
||||||
|
// 总结
|
||||||
|
// t1 u1 可以登录 a b
|
||||||
|
// t1 u2 可以登录 a
|
||||||
|
// t2 u3 可以登录 a
|
||||||
|
// t2 u2 可以登录 a
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -45,6 +59,7 @@ public class DbService {
|
||||||
public static class UserInfo {
|
public static class UserInfo {
|
||||||
public String userName;
|
public String userName;
|
||||||
public String password;
|
public String password;
|
||||||
|
public Boolean longToken = false;
|
||||||
public List<String> validClient;
|
public List<String> validClient;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -166,7 +181,7 @@ public class DbService {
|
||||||
|
|
||||||
userInfo.validClient = clientUrls;
|
userInfo.validClient = clientUrls;
|
||||||
}
|
}
|
||||||
|
userInfo.longToken = user.getLongToken();
|
||||||
return userInfo;
|
return userInfo;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.tuoheng.oauth.oidc.provider;
|
package com.tuoheng.oauth.oidc.provider;
|
||||||
|
|
||||||
import com.tuoheng.oauth.oidc.service.CustomUserDetailsService;
|
import com.tuoheng.oauth.oidc.service.CustomUserDetailsService;
|
||||||
|
import com.tuoheng.oauth.oidc.service.UserDetailsInfo;
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.security.authentication.AuthenticationProvider;
|
import org.springframework.security.authentication.AuthenticationProvider;
|
||||||
|
|
@ -48,18 +49,18 @@ public class TenantAwareAuthenticationProvider implements AuthenticationProvider
|
||||||
/**
|
/**
|
||||||
* 这边判断用户是否有权限
|
* 这边判断用户是否有权限
|
||||||
*/
|
*/
|
||||||
UserDetails userDetails = userDetailsService.loadUserByUsername(username,clientId,tenantCode);
|
UserDetailsInfo userDetails = userDetailsService.loadUserByUsername(username,clientId,tenantCode);
|
||||||
|
|
||||||
|
if (userDetails != null && passwordEncoder.matches(password, userDetails.getUserDetails().getPassword())) {
|
||||||
if (userDetails != null && passwordEncoder.matches(password, userDetails.getPassword())) {
|
|
||||||
System.out.println("用户认证成功");
|
System.out.println("用户认证成功");
|
||||||
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
|
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
|
||||||
userDetails, password, userDetails.getAuthorities());
|
userDetails, password, userDetails.getUserDetails().getAuthorities());
|
||||||
|
|
||||||
Map<String, Object> details = new HashMap<>();
|
Map<String, Object> details = new HashMap<>();
|
||||||
details.put("client_id", clientId);
|
details.put("client_id", clientId);
|
||||||
details.put("tenant_code", tenantCode);
|
details.put("tenant_code", tenantCode);
|
||||||
details.put("clientIds",userDetails.getAuthorities().toString());
|
details.put("clientIds",userDetails.getUserDetails().getAuthorities().toString());
|
||||||
|
details.put("isLongToken",userDetails.getIslongToken());
|
||||||
|
|
||||||
token.setDetails(details);
|
token.setDetails(details);
|
||||||
return token;
|
return token;
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||||
* @return
|
* @return
|
||||||
* @throws UsernameNotFoundException
|
* @throws UsernameNotFoundException
|
||||||
*/
|
*/
|
||||||
public UserDetails loadUserByUsername(String username,String clientId,String tenantCode) throws UsernameNotFoundException {
|
public UserDetailsInfo loadUserByUsername(String username,String clientId,String tenantCode) throws UsernameNotFoundException {
|
||||||
|
|
||||||
if(!dbService.isValidClientId(clientId)) {
|
if(!dbService.isValidClientId(clientId)) {
|
||||||
return null;
|
return null;
|
||||||
|
|
@ -46,7 +46,9 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||||
|
|
||||||
if(Objects.nonNull(userInfo)) {
|
if(Objects.nonNull(userInfo)) {
|
||||||
String[] authorities = userInfo.validClient.toArray(new String[0]);
|
String[] authorities = userInfo.validClient.toArray(new String[0]);
|
||||||
return org.springframework.security.core.userdetails.User.builder()
|
|
||||||
|
UserDetailsInfo userDetailsInfo = new UserDetailsInfo();
|
||||||
|
userDetailsInfo.userDetails = org.springframework.security.core.userdetails.User.builder()
|
||||||
.username(userInfo.userName)
|
.username(userInfo.userName)
|
||||||
.password(passwordEncoder.encode(userInfo.password))
|
.password(passwordEncoder.encode(userInfo.password))
|
||||||
.authorities(authorities)
|
.authorities(authorities)
|
||||||
|
|
@ -55,6 +57,8 @@ public class CustomUserDetailsService implements UserDetailsService {
|
||||||
.credentialsExpired(false)
|
.credentialsExpired(false)
|
||||||
.disabled(false)
|
.disabled(false)
|
||||||
.build();
|
.build();
|
||||||
|
userDetailsInfo.islongToken = userInfo.longToken;
|
||||||
|
return userDetailsInfo;
|
||||||
|
|
||||||
}else {
|
}else {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
package com.tuoheng.oauth.oidc.service;
|
||||||
|
|
||||||
|
import org.springframework.security.core.userdetails.User;
|
||||||
|
import org.springframework.security.core.userdetails.UserDetails;
|
||||||
|
|
||||||
|
public class UserDetailsInfo {
|
||||||
|
public UserDetails getUserDetails() {
|
||||||
|
return userDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setUserDetails(UserDetails userDetails) {
|
||||||
|
this.userDetails = userDetails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Boolean getIslongToken() {
|
||||||
|
return islongToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setIslongToken(Boolean islongToken) {
|
||||||
|
this.islongToken = islongToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
UserDetails userDetails;
|
||||||
|
Boolean islongToken;
|
||||||
|
}
|
||||||
|
|
@ -7,7 +7,10 @@ import org.springframework.security.oauth2.server.authorization.token.OAuth2Toke
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.time.Instant;
|
||||||
|
import java.time.temporal.ChronoUnit;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
public class CustomTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {
|
public class CustomTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingContext> {
|
||||||
|
|
@ -33,6 +36,12 @@ public class CustomTokenCustomizer implements OAuth2TokenCustomizer<JwtEncodingC
|
||||||
if(clientIds != null) {
|
if(clientIds != null) {
|
||||||
context.getClaims().claim("clientIds", clientIds);
|
context.getClaims().claim("clientIds", clientIds);
|
||||||
}
|
}
|
||||||
|
Boolean isLongToken = (Boolean) details.get("isLongToken");
|
||||||
|
if(Objects.equals(isLongToken, Boolean.TRUE)) {
|
||||||
|
Instant now = Instant.now();
|
||||||
|
Instant expiresAt = now.plus(30, ChronoUnit.DAYS);
|
||||||
|
context.getClaims().expiresAt(expiresAt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue