package cc.mrbird.febs.auth.service.impl; import cc.mrbird.febs.auth.entity.OauthClientDetails; import cc.mrbird.febs.auth.mapper.OauthClientDetailsMapper; import cc.mrbird.febs.auth.service.OauthClientDetailsService; import cc.mrbird.febs.common.core.entity.QueryRequest; import cc.mrbird.febs.common.core.entity.constant.StringConstant; import cc.mrbird.febs.common.core.exception.FebsException; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * @author Yuuki */ @Slf4j @Service @RequiredArgsConstructor @Transactional(propagation = Propagation.SUPPORTS, readOnly = true) public class OauthClientDetailsServiceImpl extends ServiceImpl implements OauthClientDetailsService { private final PasswordEncoder passwordEncoder; private final RedisClientDetailsService redisClientDetailsService; @Override public IPage findOauthClientDetails(QueryRequest request, OauthClientDetails oauthClientDetails) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); if (StringUtils.isNotBlank(oauthClientDetails.getClientId())) { queryWrapper.eq(OauthClientDetails::getClientId, oauthClientDetails.getClientId()); } Page page = new Page<>(request.getPageNum(), request.getPageSize()); IPage result = this.page(page, queryWrapper); List records = new ArrayList<>(); result.getRecords().forEach(o -> { o.setOriginSecret(null); o.setClientSecret(null); records.add(o); }); result.setRecords(records); return result; } @Override public OauthClientDetails findById(String clientId) { return this.baseMapper.selectById(clientId); } @Override @Transactional(rollbackFor = Exception.class) public void createOauthClientDetails(OauthClientDetails oauthClientDetails) throws FebsException { OauthClientDetails byId = this.findById(oauthClientDetails.getClientId()); if (byId != null) { throw new FebsException("该Client已存在"); } oauthClientDetails.setOriginSecret(oauthClientDetails.getClientSecret()); oauthClientDetails.setClientSecret(passwordEncoder.encode(oauthClientDetails.getClientSecret())); boolean saved = this.save(oauthClientDetails); if (saved) { log.info("缓存Client -> {}", oauthClientDetails); this.redisClientDetailsService.loadClientByClientId(oauthClientDetails.getClientId()); } } @Override @Transactional(rollbackFor = Exception.class) public void updateOauthClientDetails(OauthClientDetails oauthClientDetails) { String clientId = oauthClientDetails.getClientId(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(OauthClientDetails::getClientId, oauthClientDetails.getClientId()); oauthClientDetails.setClientId(null); oauthClientDetails.setClientSecret(null); boolean updated = this.update(oauthClientDetails, queryWrapper); if (updated) { log.info("更新Client -> {}", oauthClientDetails); this.redisClientDetailsService.removeRedisCache(clientId); this.redisClientDetailsService.loadClientByClientId(clientId); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteOauthClientDetails(String clientIds) { Object[] clientIdArray = StringUtils.splitByWholeSeparatorPreserveAllTokens(clientIds, StringConstant.COMMA); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.in(OauthClientDetails::getClientId, clientIdArray); boolean removed = this.remove(queryWrapper); if (removed) { log.info("删除ClientId为({})的Client", clientIds); Arrays.stream(clientIdArray).forEach(c -> this.redisClientDetailsService.removeRedisCache(String.valueOf(c))); } } }