!447 发布 5.1.1 大量代码优化与bug修复 建议升级
Merge pull request !447 from 疯狂的狮子Li/dev
| | |
| | | <configuration default="false" name="ruoyi-monitor-admin" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> |
| | | <deployment type="dockerfile"> |
| | | <settings> |
| | | <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.1.0" /> |
| | | <option name="imageTag" value="ruoyi/ruoyi-monitor-admin:5.1.1" /> |
| | | <option name="buildOnly" value="true" /> |
| | | <option name="sourceFilePath" value="ruoyi-extend/ruoyi-monitor-admin/Dockerfile" /> |
| | | </settings> |
| | |
| | | <configuration default="false" name="ruoyi-powerjob-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> |
| | | <deployment type="dockerfile"> |
| | | <settings> |
| | | <option name="imageTag" value="ruoyi/ruoyi-powerjob-server:5.1.0" /> |
| | | <option name="imageTag" value="ruoyi/ruoyi-powerjob-server:5.1.1" /> |
| | | <option name="buildOnly" value="true" /> |
| | | <option name="sourceFilePath" value="ruoyi-extend/ruoyi-powerjob-server/Dockerfile" /> |
| | | </settings> |
| | |
| | | <configuration default="false" name="ruoyi-server" type="docker-deploy" factoryName="dockerfile" server-name="Docker"> |
| | | <deployment type="dockerfile"> |
| | | <settings> |
| | | <option name="imageTag" value="ruoyi/ruoyi-server:5.1.0" /> |
| | | <option name="imageTag" value="ruoyi/ruoyi-server:5.1.1" /> |
| | | <option name="buildOnly" value="true" /> |
| | | <option name="sourceFilePath" value="ruoyi-admin/Dockerfile" /> |
| | | </settings> |
| | |
| | | [](https://gitee.com/dromara/RuoYi-Vue-Plus/blob/master/LICENSE) |
| | | [](https://www.jetbrains.com/?from=RuoYi-Vue-Plus) |
| | | <br> |
| | | [](https://gitee.com/dromara/RuoYi-Vue-Plus) |
| | | []() |
| | | [](https://gitee.com/dromara/RuoYi-Vue-Plus) |
| | | []() |
| | | []() |
| | | []() |
| | | []() |
| | | |
| | | > RuoYi-Vue-Plus æ¯éå RuoYi-Vue é对 `åå¸å¼é群ä¸å¤ç§æ·` åºæ¯å
¨æ¹ä½å级(ä¸å
¼å®¹åæ¡æ¶) |
| | | |
| | |
| | | <description>RuoYi-Vue-Pluså¤ç§æ·ç®¡çç³»ç»</description> |
| | | |
| | | <properties> |
| | | <revision>5.1.0</revision> |
| | | <revision>5.1.1</revision> |
| | | <spring-boot.version>3.1.5</spring-boot.version> |
| | | <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
| | | <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> |
| | |
| | | <properties> |
| | | <!-- ç¯å¢æ è¯ï¼éè¦ä¸é
ç½®æä»¶çåç§°ç¸å¯¹åº --> |
| | | <profiles.active>local</profiles.active> |
| | | <logging.level>debug</logging.level> |
| | | <logging.level>info</logging.level> |
| | | </properties> |
| | | </profile> |
| | | <profile> |
| | |
| | | <properties> |
| | | <!-- ç¯å¢æ è¯ï¼éè¦ä¸é
ç½®æä»¶çåç§°ç¸å¯¹åº --> |
| | | <profiles.active>dev</profiles.active> |
| | | <logging.level>debug</logging.level> |
| | | <logging.level>info</logging.level> |
| | | </properties> |
| | | <activation> |
| | | <!-- é»è®¤ç¯å¢ --> |
| | |
| | | import org.dromara.common.core.domain.R; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.RegisterBody; |
| | | import org.dromara.common.core.utils.MapstructUtils; |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.StreamUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.core.domain.model.SocialLoginBody; |
| | | import org.dromara.common.core.utils.*; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.social.config.properties.SocialLoginConfigProperties; |
| | | import org.dromara.common.social.config.properties.SocialProperties; |
| | | import org.dromara.common.social.utils.SocialUtils; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | import org.dromara.system.domain.SysClient; |
| | | import org.dromara.system.domain.bo.SysTenantBo; |
| | | import org.dromara.system.domain.vo.SysTenantVo; |
| | |
| | | |
| | | import java.net.URL; |
| | | import java.util.List; |
| | | import java.util.concurrent.ScheduledExecutorService; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | /** |
| | | * è®¤è¯ |
| | |
| | | private final ISysTenantService tenantService; |
| | | private final ISysSocialService socialUserService; |
| | | private final ISysClientService clientService; |
| | | private final ScheduledExecutorService scheduledExecutorService; |
| | | |
| | | |
| | | /** |
| | | * ç»å½æ¹æ³ |
| | | * |
| | | * @param loginBody ç»å½ä¿¡æ¯ |
| | | * @param body ç»å½ä¿¡æ¯ |
| | | * @return ç»æ |
| | | */ |
| | | @PostMapping("/login") |
| | | public R<LoginVo> login(@Validated @RequestBody LoginBody loginBody) { |
| | | public R<LoginVo> login(@Validated @RequestBody String body) { |
| | | LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | // ææç±»åå客æ·ç«¯id |
| | | String clientId = loginBody.getClientId(); |
| | | String grantType = loginBody.getGrantType(); |
| | |
| | | // æ ¡éªç§æ· |
| | | loginService.checkTenant(loginBody.getTenantId()); |
| | | // ç»å½ |
| | | return R.ok(IAuthStrategy.login(loginBody, client)); |
| | | LoginVo loginVo = IAuthStrategy.login(body, client, grantType); |
| | | |
| | | Long userId = LoginHelper.getUserId(); |
| | | scheduledExecutorService.schedule(() -> { |
| | | WebSocketUtils.sendMessage(userId, "欢è¿ç»å½RuoYi-Vue-Plusåå°ç®¡çç³»ç»"); |
| | | }, 3, TimeUnit.SECONDS); |
| | | return R.ok(loginVo); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @return ç»æ |
| | | */ |
| | | @PostMapping("/social/callback") |
| | | public R<Void> socialCallback(@RequestBody LoginBody loginBody) { |
| | | public R<Void> socialCallback(@RequestBody SocialLoginBody loginBody) { |
| | | // è·åç¬¬ä¸æ¹ç»å½ä¿¡æ¯ |
| | | AuthResponse<AuthUser> response = SocialUtils.loginAuth(loginBody, socialProperties); |
| | | AuthResponse<AuthUser> response = SocialUtils.loginAuth( |
| | | loginBody.getSource(), loginBody.getSocialCode(), |
| | | loginBody.getSocialState(), socialProperties); |
| | | AuthUser authUserData = response.getData(); |
| | | // 夿ææååºæ¯å¦æå |
| | | if (!response.ok()) { |
| | |
| | | package org.dromara.web.service; |
| | | |
| | | |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.system.domain.SysClient; |
| | |
| | | /** |
| | | * ç»å½ |
| | | */ |
| | | static LoginVo login(LoginBody loginBody, SysClient client) { |
| | | static LoginVo login(String body, SysClient client, String grantType) { |
| | | // ææç±»åå客æ·ç«¯id |
| | | String clientId = loginBody.getClientId(); |
| | | String grantType = loginBody.getGrantType(); |
| | | String beanName = grantType + BASE_NAME; |
| | | if (!SpringUtils.containsBean(beanName)) { |
| | | throw new ServiceException("ææç±»å䏿£ç¡®!"); |
| | | } |
| | | IAuthStrategy instance = SpringUtils.getBean(beanName); |
| | | instance.validate(loginBody); |
| | | return instance.login(clientId, loginBody, client); |
| | | return instance.login(body, client); |
| | | } |
| | | |
| | | /** |
| | | * åæ°æ ¡éª |
| | | */ |
| | | void validate(LoginBody loginBody); |
| | | |
| | | /** |
| | | * ç»å½ |
| | | */ |
| | | LoginVo login(String clientId, LoginBody loginBody, SysClient client); |
| | | LoginVo login(String body, SysClient client); |
| | | |
| | | } |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.constant.GlobalConstants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.EmailLoginBody; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.enums.LoginType; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.EmailGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | |
| | | private final SysUserMapper userMapper; |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, EmailGroup.class); |
| | | } |
| | | |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | public LoginVo login(String body, SysClient client) { |
| | | EmailLoginBody loginBody = JsonUtils.parseObject(body, EmailLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | String tenantId = loginBody.getTenantId(); |
| | | String email = loginBody.getEmail(); |
| | | String emailCode = loginBody.getEmailCode(); |
| | |
| | | // ä¾å¦: åå°ç¨æ·30åéè¿æ appç¨æ·1å¤©è¿æ |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // çætoken |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | return loginVo; |
| | | } |
| | | |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.constant.GlobalConstants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.domain.model.PasswordLoginBody; |
| | | import org.dromara.common.core.enums.LoginType; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | | import org.dromara.common.core.exception.user.CaptchaException; |
| | |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.PasswordGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | |
| | | private final SysUserMapper userMapper; |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, PasswordGroup.class); |
| | | } |
| | | |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | public LoginVo login(String body, SysClient client) { |
| | | PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | String tenantId = loginBody.getTenantId(); |
| | | String username = loginBody.getUsername(); |
| | | String password = loginBody.getPassword(); |
| | |
| | | // ä¾å¦: åå°ç¨æ·30åéè¿æ appç¨æ·1å¤©è¿æ |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // çætoken |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | return loginVo; |
| | | } |
| | | |
| | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.constant.GlobalConstants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.domain.model.SmsLoginBody; |
| | | import org.dromara.common.core.enums.LoginType; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | | import org.dromara.common.core.exception.user.CaptchaExpireException; |
| | |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.SmsGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | |
| | | private final SysUserMapper userMapper; |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, SmsGroup.class); |
| | | } |
| | | |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | public LoginVo login(String body, SysClient client) { |
| | | SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | String tenantId = loginBody.getTenantId(); |
| | | String phonenumber = loginBody.getPhonenumber(); |
| | | String smsCode = loginBody.getSmsCode(); |
| | |
| | | // ä¾å¦: åå°ç¨æ·30åéè¿æ appç¨æ·1å¤©è¿æ |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // çætoken |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | return loginVo; |
| | | } |
| | | |
| | |
| | | import me.zhyd.oauth.model.AuthResponse; |
| | | import me.zhyd.oauth.model.AuthUser; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.domain.model.SocialLoginBody; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | | import org.dromara.common.core.exception.user.UserException; |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.SocialGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.social.config.properties.SocialProperties; |
| | | import org.dromara.common.social.utils.SocialUtils; |
| | |
| | | private final SysUserMapper userMapper; |
| | | private final SysLoginService loginService; |
| | | |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, SocialGroup.class); |
| | | } |
| | | |
| | | /** |
| | | * ç»å½-ç¬¬ä¸æ¹ææç»å½ |
| | | * |
| | | * @param clientId 客æ·ç«¯id |
| | | * @param loginBody ç»å½ä¿¡æ¯ |
| | | * @param body ç»å½ä¿¡æ¯ |
| | | * @param client 客æ·ç«¯ä¿¡æ¯ |
| | | */ |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | AuthResponse<AuthUser> response = SocialUtils.loginAuth(loginBody, socialProperties); |
| | | public LoginVo login(String body, SysClient client) { |
| | | SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | AuthResponse<AuthUser> response = SocialUtils.loginAuth( |
| | | loginBody.getSource(), loginBody.getSocialCode(), |
| | | loginBody.getSocialState(), socialProperties); |
| | | if (!response.ok()) { |
| | | throw new ServiceException(response.getMsg()); |
| | | } |
| | |
| | | // ä¾å¦: åå°ç¨æ·30åéè¿æ appç¨æ·1å¤©è¿æ |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // çætoken |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | return loginVo; |
| | | } |
| | | |
| | |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.constant.Constants; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.domain.model.XcxLoginBody; |
| | | import org.dromara.common.core.domain.model.XcxLoginUser; |
| | | import org.dromara.common.core.enums.UserStatus; |
| | | import org.dromara.common.core.utils.MessageUtils; |
| | | import org.dromara.common.core.utils.ValidatorUtils; |
| | | import org.dromara.common.core.validate.auth.WechatGroup; |
| | | import org.dromara.common.json.utils.JsonUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.system.domain.SysClient; |
| | | import org.dromara.system.domain.vo.SysUserVo; |
| | |
| | | private final SysLoginService loginService; |
| | | |
| | | @Override |
| | | public void validate(LoginBody loginBody) { |
| | | ValidatorUtils.validate(loginBody, WechatGroup.class); |
| | | } |
| | | |
| | | @Override |
| | | public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { |
| | | public LoginVo login(String body, SysClient client) { |
| | | XcxLoginBody loginBody = JsonUtils.parseObject(body, XcxLoginBody.class); |
| | | ValidatorUtils.validate(loginBody); |
| | | // xcxCode 为 å°ç¨åºè°ç¨ wx.login ææåè·å |
| | | String xcxCode = loginBody.getXcxCode(); |
| | | // å¤ä¸ªå°ç¨åºè¯å«ä½¿ç¨ |
| | | String appid = loginBody.getAppid(); |
| | | |
| | | // todo 以ä¸èªè¡å®ç° |
| | | // æ ¡éª appid + appsrcret + xcxCode è°ç¨ç»å½åè¯æ ¡éªæ¥å£ è·å session_key ä¸ openid |
| | | String openid = ""; |
| | |
| | | // ä¾å¦: åå°ç¨æ·30åéè¿æ appç¨æ·1å¤©è¿æ |
| | | model.setTimeout(client.getTimeout()); |
| | | model.setActiveTimeout(client.getActiveTimeout()); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, clientId); |
| | | model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); |
| | | // çætoken |
| | | LoginHelper.login(loginUser, model); |
| | | |
| | |
| | | LoginVo loginVo = new LoginVo(); |
| | | loginVo.setAccessToken(StpUtil.getTokenValue()); |
| | | loginVo.setExpireIn(StpUtil.getTokenTimeout()); |
| | | loginVo.setClientId(clientId); |
| | | loginVo.setClientId(client.getClientId()); |
| | | loginVo.setOpenid(openid); |
| | | return loginVo; |
| | | } |
| | |
| | | sa-token: |
| | | # tokenåç§° (忶乿¯cookieåç§°) |
| | | token-name: Authorization |
| | | # tokenåºå®è¶
æ¶ è®¾ä¸ºä¸å¤© (å¿
å®è¿æ) åä½: ç§ |
| | | timeout: 604800 |
| | | # å¤ç«¯ä¸å token æææ 坿¥ç LoginHelper.loginByDevice æ¹æ³èªå®ä¹ |
| | | # tokenæä½æ´»è·æ¶é´ (æå®æ¶é´æ æä½å°±è¿æ) åä½: ç§ |
| | | active-timeout: 1800 |
| | | # æ¯å¦å
许åä¸è´¦å·å¹¶åç»å½ (为trueæ¶å
许ä¸èµ·ç»å½, 为falseæ¶æ°ç»å½æ¤ææ§ç»å½) |
| | | is-concurrent: true |
| | | # å¨å¤äººç»å½åä¸è´¦å·æ¶ï¼æ¯å¦å
±ç¨ä¸ä¸ªtoken (为trueæ¶ææç»å½å
±ç¨ä¸ä¸ªtoken, 为falseæ¶æ¯æ¬¡ç»å½æ°å»ºä¸ä¸ªtoken) |
| | |
| | | |
| | | --- # websocket |
| | | websocket: |
| | | # 妿å
³é éè¦åå端å¼å
³ä¸èµ·å
³é |
| | | enabled: true |
| | | # è·¯å¾ |
| | | path: /resource/websocket |
| | |
| | | </description> |
| | | |
| | | <properties> |
| | | <revision>5.1.0</revision> |
| | | <revision>5.1.1</revision> |
| | | </properties> |
| | | |
| | | <dependencyManagement> |
| | |
| | | import jakarta.validation.constraints.Email; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * é®ä»¶ç»å½å¯¹è±¡ |
| | |
| | | */ |
| | | |
| | | @Data |
| | | public class EmailLoginBody { |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | @NotBlank(message = "{tenant.number.not.blank}") |
| | | private String tenantId; |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class EmailLoginBody extends LoginBody { |
| | | |
| | | /** |
| | | * é®ç®± |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import jakarta.validation.constraints.Email; |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import org.dromara.common.core.constant.UserConstants; |
| | | import org.dromara.common.core.validate.auth.*; |
| | | import org.hibernate.validator.constraints.Length; |
| | | |
| | | import java.io.Serial; |
| | | import java.io.Serializable; |
| | | |
| | | /** |
| | | * ç¨æ·ç»å½å¯¹è±¡ |
| | |
| | | */ |
| | | |
| | | @Data |
| | | public class LoginBody { |
| | | public class LoginBody implements Serializable { |
| | | |
| | | @Serial |
| | | private static final long serialVersionUID = 1L; |
| | | |
| | | /** |
| | | * 客æ·ç«¯id |
| | | */ |
| | | @NotBlank(message = "{auth.clientid.not.blank}") |
| | | private String clientId; |
| | | |
| | | /** |
| | | * 客æ·ç«¯key |
| | | */ |
| | | private String clientKey; |
| | | |
| | | /** |
| | | * 客æ·ç«¯ç§é¥ |
| | | */ |
| | | private String clientSecret; |
| | | |
| | | /** |
| | | * ææç±»å |
| | |
| | | private String tenantId; |
| | | |
| | | /** |
| | | * ç¨æ·å |
| | | */ |
| | | @NotBlank(message = "{user.username.not.blank}", groups = {PasswordGroup.class}) |
| | | @Length(min = UserConstants.USERNAME_MIN_LENGTH, max = UserConstants.USERNAME_MAX_LENGTH, message = "{user.username.length.valid}", groups = {PasswordGroup.class}) |
| | | private String username; |
| | | |
| | | /** |
| | | * ç¨æ·å¯ç |
| | | */ |
| | | @NotBlank(message = "{user.password.not.blank}", groups = {PasswordGroup.class}) |
| | | @Length(min = UserConstants.PASSWORD_MIN_LENGTH, max = UserConstants.PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}", groups = {PasswordGroup.class}) |
| | | private String password; |
| | | |
| | | /** |
| | | * éªè¯ç |
| | | */ |
| | | private String code; |
| | |
| | | */ |
| | | private String uuid; |
| | | |
| | | /** |
| | | * ææºå· |
| | | */ |
| | | @NotBlank(message = "{user.phonenumber.not.blank}", groups = {SmsGroup.class}) |
| | | private String phonenumber; |
| | | |
| | | /** |
| | | * çä¿¡code |
| | | */ |
| | | @NotBlank(message = "{sms.code.not.blank}", groups = {SmsGroup.class}) |
| | | private String smsCode; |
| | | |
| | | /** |
| | | * é®ç®± |
| | | */ |
| | | @NotBlank(message = "{user.email.not.blank}", groups = {EmailGroup.class}) |
| | | @Email(message = "{user.email.not.valid}") |
| | | private String email; |
| | | |
| | | /** |
| | | * é®ç®±code |
| | | */ |
| | | @NotBlank(message = "{email.code.not.blank}", groups = {EmailGroup.class}) |
| | | private String emailCode; |
| | | |
| | | /** |
| | | * å°ç¨åºcode |
| | | */ |
| | | @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class}) |
| | | private String xcxCode; |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½å¹³å° |
| | | */ |
| | | @NotBlank(message = "{social.source.not.blank}" , groups = {SocialGroup.class}) |
| | | private String source; |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½code |
| | | */ |
| | | @NotBlank(message = "{social.code.not.blank}" , groups = {SocialGroup.class}) |
| | | private String socialCode; |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½socialState |
| | | */ |
| | | @NotBlank(message = "{social.state.not.blank}" , groups = {SocialGroup.class}) |
| | | private String socialState; |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.hibernate.validator.constraints.Length; |
| | | |
| | | import static org.dromara.common.core.constant.UserConstants.*; |
| | | |
| | | /** |
| | | * å¯ç ç»å½å¯¹è±¡ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class PasswordLoginBody extends LoginBody { |
| | | |
| | | /** |
| | | * ç¨æ·å |
| | | */ |
| | | @NotBlank(message = "{user.username.not.blank}") |
| | | @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") |
| | | private String username; |
| | | |
| | | /** |
| | | * ç¨æ·å¯ç |
| | | */ |
| | | @NotBlank(message = "{user.password.not.blank}") |
| | | @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") |
| | | private String password; |
| | | |
| | | } |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | import org.hibernate.validator.constraints.Length; |
| | | |
| | | import static org.dromara.common.core.constant.UserConstants.*; |
| | | |
| | | /** |
| | | * ç¨æ·æ³¨å对象 |
| | |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class RegisterBody extends LoginBody { |
| | | |
| | | /** |
| | | * ç¨æ·å |
| | | */ |
| | | @NotBlank(message = "{user.username.not.blank}") |
| | | @Length(min = USERNAME_MIN_LENGTH, max = USERNAME_MAX_LENGTH, message = "{user.username.length.valid}") |
| | | private String username; |
| | | |
| | | /** |
| | | * ç¨æ·å¯ç |
| | | */ |
| | | @NotBlank(message = "{user.password.not.blank}") |
| | | @Length(min = PASSWORD_MIN_LENGTH, max = PASSWORD_MAX_LENGTH, message = "{user.password.length.valid}") |
| | | private String password; |
| | | |
| | | private String userType; |
| | | |
| | | } |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import lombok.Data; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * çä¿¡ç»å½å¯¹è±¡ |
| | |
| | | */ |
| | | |
| | | @Data |
| | | public class SmsLoginBody { |
| | | |
| | | /** |
| | | * ç§æ·ID |
| | | */ |
| | | @NotBlank(message = "{tenant.number.not.blank}") |
| | | private String tenantId; |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class SmsLoginBody extends LoginBody { |
| | | |
| | | /** |
| | | * ææºå· |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * 䏿¹ç»å½å¯¹è±¡ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class SocialLoginBody extends LoginBody { |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½å¹³å° |
| | | */ |
| | | @NotBlank(message = "{social.source.not.blank}") |
| | | private String source; |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½code |
| | | */ |
| | | @NotBlank(message = "{social.code.not.blank}") |
| | | private String socialCode; |
| | | |
| | | /** |
| | | * ç¬¬ä¸æ¹ç»å½socialState |
| | | */ |
| | | @NotBlank(message = "{social.state.not.blank}") |
| | | private String socialState; |
| | | |
| | | } |
¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.common.core.domain.model; |
| | | |
| | | import jakarta.validation.constraints.NotBlank; |
| | | import lombok.Data; |
| | | import lombok.EqualsAndHashCode; |
| | | |
| | | /** |
| | | * 䏿¹ç»å½å¯¹è±¡ |
| | | * |
| | | * @author Lion Li |
| | | */ |
| | | |
| | | @Data |
| | | @EqualsAndHashCode(callSuper = true) |
| | | public class XcxLoginBody extends LoginBody { |
| | | |
| | | /** |
| | | * å°ç¨åºid(å¤ä¸ªå°ç¨åºæ¶ä½¿ç¨) |
| | | */ |
| | | private String appid; |
| | | |
| | | /** |
| | | * å°ç¨åºcode |
| | | */ |
| | | @NotBlank(message = "{xcx.code.not.blank}") |
| | | private String xcxCode; |
| | | |
| | | } |
| | |
| | | return UNKNOWN; |
| | | } |
| | | // å
ç½ä¸æ¥è¯¢ |
| | | ip = "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); |
| | | ip = StringUtils.contains(ip, "0:0:0:0:0:0:0:1") ? "127.0.0.1" : HtmlUtil.cleanHtmlTag(ip); |
| | | if (NetUtil.isInnerIP(ip)) { |
| | | return "å
ç½IP"; |
| | | } |
| | |
| | | <dependency> |
| | | <groupId>tech.powerjob</groupId> |
| | | <artifactId>powerjob-worker-spring-boot-starter</artifactId> |
| | | <exclusions> |
| | | <exclusion> |
| | | <artifactId>powerjob-remote-impl-akka</artifactId> |
| | | <groupId>tech.powerjob</groupId> |
| | | </exclusion> |
| | | </exclusions> |
| | | </dependency> |
| | | <dependency> |
| | | <groupId>tech.powerjob</groupId> |
| | |
| | | import cn.hutool.core.util.ArrayUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import com.alibaba.ttl.TransmittableThreadLocal; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.utils.ServletUtils; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | |
| | | String ip = ServletUtils.getClientIP(); |
| | | operLog.setOperIp(ip); |
| | | operLog.setOperUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255)); |
| | | operLog.setOperName(LoginHelper.getUsername()); |
| | | LoginUser loginUser = LoginHelper.getLoginUser(); |
| | | operLog.setOperName(loginUser.getUsername()); |
| | | operLog.setDeptName(loginUser.getDeptName()); |
| | | |
| | | if (e != null) { |
| | | operLog.setStatus(BusinessStatus.FAIL.ordinal()); |
| | |
| | | /** |
| | | * èªå®æ°æ®æé |
| | | */ |
| | | CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", ""), |
| | | CUSTOM("2", " #{#deptName} IN ( #{@sdss.getRoleCustom( #user.roleId )} ) ", " 1 = 0 "), |
| | | |
| | | /** |
| | | * é¨é¨æ°æ®æé |
| | | */ |
| | | DEPT("3", " #{#deptName} = #{#user.deptId} ", ""), |
| | | DEPT("3", " #{#deptName} = #{#user.deptId} ", " 1 = 0 "), |
| | | |
| | | /** |
| | | * é¨é¨å以䏿°æ®æé |
| | | */ |
| | | DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", ""), |
| | | DEPT_AND_CHILD("4", " #{#deptName} IN ( #{@sdss.getDeptAndChild( #user.deptId )} )", " 1 = 0 "), |
| | | |
| | | /** |
| | | * ä»
æ¬äººæ°æ®æé |
| | |
| | | |
| | | import cn.hutool.core.annotation.AnnotationUtil; |
| | | import cn.hutool.core.collection.CollUtil; |
| | | import cn.hutool.core.collection.ConcurrentHashSet; |
| | | import cn.hutool.core.util.ArrayUtil; |
| | | import cn.hutool.core.util.ClassUtil; |
| | | import cn.hutool.core.util.ObjectUtil; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import net.sf.jsqlparser.JSQLParserException; |
| | | import net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.expression.Parenthesis; |
| | | import net.sf.jsqlparser.expression.operators.conditional.AndExpression; |
| | | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
| | | import org.dromara.common.core.domain.dto.RoleDTO; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.core.exception.ServiceException; |
| | |
| | | import org.dromara.common.mybatis.enums.DataScopeType; |
| | | import org.dromara.common.mybatis.helper.DataPermissionHelper; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import net.sf.jsqlparser.JSQLParserException; |
| | | import net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.expression.Parenthesis; |
| | | import net.sf.jsqlparser.expression.operators.conditional.AndExpression; |
| | | import net.sf.jsqlparser.parser.CCJSqlParserUtil; |
| | | import org.springframework.context.expression.BeanFactoryResolver; |
| | | import org.springframework.expression.BeanResolver; |
| | | import org.springframework.expression.ExpressionParser; |
| | |
| | | private final Map<String, DataPermission> dataPermissionCacheMap = new ConcurrentHashMap<>(); |
| | | |
| | | /** |
| | | * æ ææ³¨è§£æ¹æ³ç¼åç¨äºå¿«éè¿å |
| | | */ |
| | | private final Set<String> invalidCacheSet = new ConcurrentHashSet<>(); |
| | | |
| | | /** |
| | | * spel è§£æå¨ |
| | | */ |
| | | private final ExpressionParser parser = new SpelExpressionParser(); |
| | |
| | | |
| | | public Expression getSqlSegment(Expression where, String mappedStatementId, boolean isSelect) { |
| | | DataColumn[] dataColumns = findAnnotation(mappedStatementId); |
| | | if (ArrayUtil.isEmpty(dataColumns)) { |
| | | invalidCacheSet.add(mappedStatementId); |
| | | return where; |
| | | } |
| | | LoginUser currentUser = DataPermissionHelper.getVariable("user"); |
| | | if (ObjectUtil.isNull(currentUser)) { |
| | | currentUser = LoginHelper.getLoginUser(); |
| | |
| | | return ""; |
| | | } |
| | | |
| | | private DataColumn[] findAnnotation(String mappedStatementId) { |
| | | public DataColumn[] findAnnotation(String mappedStatementId) { |
| | | StringBuilder sb = new StringBuilder(mappedStatementId); |
| | | int index = sb.lastIndexOf("."); |
| | | String clazzName = sb.substring(0, index); |
| | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * æ¯å¦ä¸ºæ ææ¹æ³ æ æ°æ®æé |
| | | */ |
| | | public boolean isInvalid(String mappedStatementId) { |
| | | return invalidCacheSet.contains(mappedStatementId); |
| | | } |
| | | } |
| | |
| | | package org.dromara.common.mybatis.interceptor; |
| | | |
| | | import cn.hutool.core.collection.ConcurrentHashSet; |
| | | import cn.hutool.core.util.ArrayUtil; |
| | | import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; |
| | | import com.baomidou.mybatisplus.core.toolkit.PluginUtils; |
| | | import com.baomidou.mybatisplus.extension.parser.JsqlParserSupport; |
| | | import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; |
| | | import org.dromara.common.mybatis.annotation.DataColumn; |
| | | import org.dromara.common.mybatis.handler.PlusDataPermissionHandler; |
| | | import net.sf.jsqlparser.expression.Expression; |
| | | import net.sf.jsqlparser.statement.delete.Delete; |
| | |
| | | import java.sql.Connection; |
| | | import java.sql.SQLException; |
| | | import java.util.List; |
| | | import java.util.Set; |
| | | |
| | | /** |
| | | * æ°æ®æéæ¦æªå¨ |
| | |
| | | public class PlusDataPermissionInterceptor extends JsqlParserSupport implements InnerInterceptor { |
| | | |
| | | private final PlusDataPermissionHandler dataPermissionHandler = new PlusDataPermissionHandler(); |
| | | /** |
| | | * æ ææ³¨è§£æ¹æ³ç¼åç¨äºå¿«éè¿å |
| | | */ |
| | | private final Set<String> invalidCacheSet = new ConcurrentHashSet<>(); |
| | | |
| | | @Override |
| | | public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) throws SQLException { |
| | |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦æ æ æ æ°æ®æé注解 |
| | | if (dataPermissionHandler.isInvalid(ms.getId())) { |
| | | if (invalidCacheSet.contains(ms.getId())) { |
| | | return; |
| | | } |
| | | DataColumn[] dataColumns = dataPermissionHandler.findAnnotation(ms.getId()); |
| | | if (ArrayUtil.isEmpty(dataColumns)) { |
| | | invalidCacheSet.add(ms.getId()); |
| | | return; |
| | | } |
| | | // è§£æ sql åé
å¯¹åºæ¹æ³ |
| | |
| | | if (InterceptorIgnoreHelper.willIgnoreDataPermission(ms.getId())) { |
| | | return; |
| | | } |
| | | // æ£æ¥æ¯å¦æ æ æ æ°æ®æé注解 |
| | | if (invalidCacheSet.contains(ms.getId())) { |
| | | return; |
| | | } |
| | | DataColumn[] dataColumns = dataPermissionHandler.findAnnotation(ms.getId()); |
| | | if (ArrayUtil.isEmpty(dataColumns)) { |
| | | invalidCacheSet.add(ms.getId()); |
| | | return; |
| | | } |
| | | PluginUtils.MPBoundSql mpBs = mpSh.mPBoundSql(); |
| | | mpBs.sql(parserMulti(mpBs.sql(), ms.getId())); |
| | | } |
| | |
| | | * redisé群é
ç½® yml |
| | | * |
| | | * --- # redis é群é
ç½®(åæºä¸é群åªè½å¼å¯ä¸ä¸ªå¦ä¸ä¸ªéè¦æ³¨éæ) |
| | | * spring: |
| | | * spring.data: |
| | | * redis: |
| | | * cluster: |
| | | * nodes: |
| | |
| | | * # è¿æ¥è¶
æ¶æ¶é´ |
| | | * timeout: 10s |
| | | * # æ¯å¦å¼å¯ssl |
| | | * ssl: false |
| | | * ssl.enabled: false |
| | | * |
| | | * redisson: |
| | | * # çº¿ç¨æ± æ°é |
| | |
| | | |
| | | // ææçå½±å ç¨äºä¸´æ¶æµè¯ |
| | | // if (log.isDebugEnabled()) { |
| | | // log.debug("å©ä½æææ¶é´: {}", StpUtil.getTokenTimeout()); |
| | | // log.debug("ä¸´æ¶æææ¶é´: {}", StpUtil.getTokenActivityTimeout()); |
| | | // log.info("å©ä½æææ¶é´: {}", StpUtil.getTokenTimeout()); |
| | | // log.info("ä¸´æ¶æææ¶é´: {}", StpUtil.getTokenActivityTimeout()); |
| | | // } |
| | | |
| | | }); |
| | |
| | | @JsonSerialize(using = SensitiveHandler.class) |
| | | public @interface Sensitive { |
| | | SensitiveStrategy strategy(); |
| | | |
| | | String roleKey() default ""; |
| | | |
| | | String perms() default ""; |
| | | } |
| | |
| | | /** |
| | | * æ¯å¦è±æ |
| | | */ |
| | | boolean isSensitive(); |
| | | boolean isSensitive(String roleKey, String perms); |
| | | |
| | | } |
| | |
| | | public class SensitiveHandler extends JsonSerializer<String> implements ContextualSerializer { |
| | | |
| | | private SensitiveStrategy strategy; |
| | | private String roleKey; |
| | | private String perms; |
| | | |
| | | @Override |
| | | public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException { |
| | | try { |
| | | SensitiveService sensitiveService = SpringUtils.getBean(SensitiveService.class); |
| | | if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive()) { |
| | | if (ObjectUtil.isNotNull(sensitiveService) && sensitiveService.isSensitive(roleKey, perms)) { |
| | | gen.writeString(strategy.desensitizer().apply(value)); |
| | | } else { |
| | | gen.writeString(value); |
| | |
| | | Sensitive annotation = property.getAnnotation(Sensitive.class); |
| | | if (Objects.nonNull(annotation) && Objects.equals(String.class, property.getType().getRawClass())) { |
| | | this.strategy = annotation.strategy(); |
| | | this.roleKey = annotation.roleKey(); |
| | | this.perms = annotation.perms(); |
| | | return this; |
| | | } |
| | | return prov.findValueSerializer(property.getType(), property); |
| | |
| | | throw new AuthException(object.getStr("message")); |
| | | } |
| | | return AuthUser.builder() |
| | | .uuid(object.getStr("id")) |
| | | .uuid(object.getStr("userId")) |
| | | .username(object.getStr("username")) |
| | | .nickname(object.getStr("name")) |
| | | .nickname(object.getStr("displayName")) |
| | | .avatar(object.getStr("avatar_url")) |
| | | .blog(object.getStr("web_url")) |
| | | .company(object.getStr("organization")) |
| | |
| | | import me.zhyd.oauth.model.AuthResponse; |
| | | import me.zhyd.oauth.model.AuthUser; |
| | | import me.zhyd.oauth.request.*; |
| | | import org.dromara.common.core.domain.model.LoginBody; |
| | | import org.dromara.common.core.utils.SpringUtils; |
| | | import org.dromara.common.social.config.properties.SocialLoginConfigProperties; |
| | | import org.dromara.common.social.config.properties.SocialProperties; |
| | |
| | | private static final AuthRedisStateCache STATE_CACHE = SpringUtils.getBean(AuthRedisStateCache.class); |
| | | |
| | | @SuppressWarnings("unchecked") |
| | | public static AuthResponse<AuthUser> loginAuth(LoginBody loginBody, SocialProperties socialProperties) throws AuthException { |
| | | AuthRequest authRequest = getAuthRequest(loginBody.getSource(), socialProperties); |
| | | public static AuthResponse<AuthUser> loginAuth(String source, String code, String state, SocialProperties socialProperties) throws AuthException { |
| | | AuthRequest authRequest = getAuthRequest(source, socialProperties); |
| | | AuthCallback callback = new AuthCallback(); |
| | | callback.setCode(loginBody.getSocialCode()); |
| | | callback.setState(loginBody.getSocialState()); |
| | | callback.setCode(code); |
| | | callback.setState(state); |
| | | return authRequest.login(callback); |
| | | } |
| | | |
| | |
| | | |
| | | @Override |
| | | public Expression getTenantId() { |
| | | String tenantId = LoginHelper.getTenantId(); |
| | | String tenantId = TenantHelper.getTenantId(); |
| | | if (StringUtils.isBlank(tenantId)) { |
| | | log.error("æ æ³è·åææçç§æ·id -> Null"); |
| | | return new NullValue(); |
| | | } |
| | | String dynamicTenantId = TenantHelper.getDynamic(); |
| | | if (StringUtils.isNotBlank(dynamicTenantId)) { |
| | | // è¿åå¨æç§æ· |
| | | return new StringValue(dynamicTenantId); |
| | | } |
| | | // è¿ååºå®ç§æ· |
| | | return new StringValue(tenantId); |
| | |
| | | if (StringUtils.isBlank(tenantId)) { |
| | | log.error("æ æ³è·åææçç§æ·id -> Null"); |
| | | } |
| | | if (StringUtils.startsWith(name, tenantId)) { |
| | | if (StringUtils.startsWith(name, tenantId + "")) { |
| | | // 妿åå¨åç´æ¥è¿å |
| | | return super.map(name); |
| | | } |
| | |
| | | if (StringUtils.isBlank(tenantId)) { |
| | | log.error("æ æ³è·åææçç§æ·id -> Null"); |
| | | } |
| | | if (StringUtils.startsWith(unmap, tenantId)) { |
| | | if (StringUtils.startsWith(unmap, tenantId + "")) { |
| | | // 妿åå¨åå é¤ |
| | | return unmap.substring((tenantId + ":").length()); |
| | | } |
| | |
| | | BufferedReader reader = request.getReader(); |
| | | jsonParam = IoUtil.read(reader); |
| | | } |
| | | log.debug("[PLUS]å¼å§è¯·æ± => URL[{}],åæ°ç±»å[json],åæ°:[{}]", url, jsonParam); |
| | | log.info("[PLUS]å¼å§è¯·æ± => URL[{}],åæ°ç±»å[json],åæ°:[{}]", url, jsonParam); |
| | | } else { |
| | | Map<String, String[]> parameterMap = request.getParameterMap(); |
| | | if (MapUtil.isNotEmpty(parameterMap)) { |
| | | String parameters = JsonUtils.toJsonString(parameterMap); |
| | | log.debug("[PLUS]å¼å§è¯·æ± => URL[{}],åæ°ç±»å[param],åæ°:[{}]", url, parameters); |
| | | log.info("[PLUS]å¼å§è¯·æ± => URL[{}],åæ°ç±»å[param],åæ°:[{}]", url, parameters); |
| | | } else { |
| | | log.debug("[PLUS]å¼å§è¯·æ± => URL[{}],æ åæ°", url); |
| | | log.info("[PLUS]å¼å§è¯·æ± => URL[{}],æ åæ°", url); |
| | | } |
| | | } |
| | | |
| | |
| | | if (!prodProfile.equals(SpringUtils.getActiveProfile())) { |
| | | StopWatch stopWatch = invokeTimeTL.get(); |
| | | stopWatch.stop(); |
| | | log.debug("[PLUS]ç»æè¯·æ± => URL[{}],èæ¶:[{}]毫ç§", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); |
| | | log.info("[PLUS]ç»æè¯·æ± => URL[{}],èæ¶:[{}]毫ç§", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime()); |
| | | invokeTimeTL.remove(); |
| | | } |
| | | } |
| | |
| | | package org.dromara.common.websocket.handler; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.websocket.dto.WebSocketMessageDto; |
| | | import org.dromara.common.websocket.holder.WebSocketSessionHolder; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.web.socket.*; |
| | | import org.springframework.web.socket.handler.AbstractWebSocketHandler; |
| | | |
| | |
| | | @Override |
| | | protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception { |
| | | LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); |
| | | log.info("PlusWebSocketHandler, è¿æ¥ï¼" + session.getId() + "ï¼å·²æ¶å°æ¶æ¯:" + message.getPayload()); |
| | | List<Long> userIds = List.of(loginUser.getUserId()); |
| | | WebSocketMessageDto webSocketMessageDto = new WebSocketMessageDto(); |
| | | webSocketMessageDto.setSessionKeys(userIds); |
| | |
| | | import lombok.AccessLevel; |
| | | import lombok.NoArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.dromara.common.core.domain.model.LoginUser; |
| | | import org.dromara.common.redis.utils.RedisUtils; |
| | | import org.dromara.common.websocket.dto.WebSocketMessageDto; |
| | | import org.dromara.common.websocket.holder.WebSocketSessionHolder; |
| | |
| | | import java.util.List; |
| | | import java.util.function.Consumer; |
| | | |
| | | import static org.dromara.common.websocket.constant.WebSocketConstants.LOGIN_USER_KEY; |
| | | import static org.dromara.common.websocket.constant.WebSocketConstants.WEB_SOCKET_TOPIC; |
| | | |
| | | /** |
| | |
| | | * @param message æ¶æ¯å
容 |
| | | */ |
| | | public static void publishAll(String message) { |
| | | WebSocketSessionHolder.getSessionsAll().forEach(key -> { |
| | | WebSocketUtils.sendMessage(key, message); |
| | | }); |
| | | WebSocketMessageDto broadcastMessage = new WebSocketMessageDto(); |
| | | broadcastMessage.setMessage(message); |
| | | RedisUtils.publish(WEB_SOCKET_TOPIC, broadcastMessage, consumer -> { |
| | |
| | | log.error("[send] sessionä¼è¯å·²ç»å
³é"); |
| | | } else { |
| | | try { |
| | | // è·åå½åä¼è¯ä¸çç¨æ· |
| | | LoginUser loginUser = (LoginUser) session.getAttributes().get(LOGIN_USER_KEY); |
| | | session.sendMessage(message); |
| | | log.info("[send] sessionId: {},userId:{},userType:{},message:{}", session.getId(), loginUser.getUserId(), loginUser.getUserType(), message); |
| | | } catch (IOException e) { |
| | | log.error("[send] session({}) åéæ¶æ¯({}) å¼å¸¸", session, message, e); |
| | | } |
| | |
| | | /** |
| | | * çµè¯ |
| | | */ |
| | | @Sensitive(strategy = SensitiveStrategy.PHONE) |
| | | @Sensitive(strategy = SensitiveStrategy.PHONE, roleKey = "common") |
| | | private String phone; |
| | | |
| | | /** |
| | | * å°å |
| | | */ |
| | | @Sensitive(strategy = SensitiveStrategy.ADDRESS) |
| | | @Sensitive(strategy = SensitiveStrategy.ADDRESS, perms = "system:user:query") |
| | | private String address; |
| | | |
| | | /** |
| | | * é®ç®± |
| | | */ |
| | | @Sensitive(strategy = SensitiveStrategy.EMAIL) |
| | | @Sensitive(strategy = SensitiveStrategy.EMAIL, roleKey = "common", perms = "system:user:query1") |
| | | private String email; |
| | | |
| | | /** |
| | | * é¶è¡å¡ |
| | | */ |
| | | @Sensitive(strategy = SensitiveStrategy.BANK_CARD) |
| | | @Sensitive(strategy = SensitiveStrategy.BANK_CARD, roleKey = "common1", perms = "system:user:query") |
| | | private String bankCard; |
| | | |
| | | } |
| | |
| | | */ |
| | | @SaCheckPermission("tool:gen:list") |
| | | @GetMapping(value = "/column/{tableId}") |
| | | public TableDataInfo<GenTableColumn> columnList(Long tableId) { |
| | | public TableDataInfo<GenTableColumn> columnList(@PathVariable("tableId") Long tableId) { |
| | | TableDataInfo<GenTableColumn> dataInfo = new TableDataInfo<>(); |
| | | List<GenTableColumn> list = genTableService.selectGenTableColumnListByTableId(tableId); |
| | | dataInfo.setRows(list); |
| | |
| | | <select id="selectDbTableColumnsByName" parameterType="String" resultMap="GenTableColumnResult"> |
| | | <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isMySql()"> |
| | | select column_name, |
| | | (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else null end) as is_required, |
| | | (case when (is_nullable = 'no' <![CDATA[ && ]]> column_key != 'PRI') then '1' else '0' end) as is_required, |
| | | (case when column_key = 'PRI' then '1' else '0' end) as is_pk, |
| | | ordinal_position as sort, |
| | | column_comment, |
| | |
| | | </if> |
| | | <if test="@org.dromara.common.mybatis.helper.DataBaseHelper@isOracle()"> |
| | | select lower(temp.column_name) as column_name, |
| | | (case when (temp.nullable = 'N' and temp.constraint_type != 'P') then '1' else null end) as is_required, |
| | | (case when (temp.nullable = 'N' and temp.constraint_type != 'P') then '1' else '0' end) as is_required, |
| | | (case when temp.constraint_type = 'P' then '1' else '0' end) as is_pk, |
| | | temp.column_id as sort, |
| | | temp.comments as column_comment, |
| | |
| | | <artifactId>ruoyi-common-encrypt</artifactId> |
| | | </dependency> |
| | | |
| | | <dependency> |
| | | <groupId>org.dromara</groupId> |
| | | <artifactId>ruoyi-common-websocket</artifactId> |
| | | </dependency> |
| | | |
| | | </dependencies> |
| | | |
| | | </project> |
| | |
| | | package org.dromara.system.controller.system; |
| | | |
| | | import cn.dev33.satoken.annotation.SaCheckPermission; |
| | | import org.dromara.common.log.annotation.Log; |
| | | import org.dromara.common.web.core.BaseController; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.dromara.common.core.domain.R; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.core.service.DictService; |
| | | import org.dromara.common.log.annotation.Log; |
| | | import org.dromara.common.log.enums.BusinessType; |
| | | import org.dromara.common.mybatis.core.page.PageQuery; |
| | | import org.dromara.common.mybatis.core.page.TableDataInfo; |
| | | import org.dromara.common.web.core.BaseController; |
| | | import org.dromara.common.websocket.utils.WebSocketUtils; |
| | | import org.dromara.system.domain.bo.SysNoticeBo; |
| | | import org.dromara.system.domain.vo.SysNoticeVo; |
| | | import org.dromara.system.service.ISysNoticeService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import org.springframework.validation.annotation.Validated; |
| | | import org.springframework.web.bind.annotation.*; |
| | | |
| | |
| | | public class SysNoticeController extends BaseController { |
| | | |
| | | private final ISysNoticeService noticeService; |
| | | private final DictService dictService; |
| | | |
| | | /** |
| | | * è·åéç¥å
¬åå表 |
| | |
| | | @Log(title = "éç¥å
Œ", businessType = BusinessType.INSERT) |
| | | @PostMapping |
| | | public R<Void> add(@Validated @RequestBody SysNoticeBo notice) { |
| | | return toAjax(noticeService.insertNotice(notice)); |
| | | int rows = noticeService.insertNotice(notice); |
| | | if (rows <= 0) { |
| | | return R.fail(); |
| | | } |
| | | String type = dictService.getDictLabel("sys_notice_type", notice.getNoticeType()); |
| | | WebSocketUtils.publishAll("[" + type + "] " + notice.getNoticeTitle()); |
| | | return R.ok(); |
| | | } |
| | | |
| | | /** |
| | |
| | | * å
é¾ååç¹æ®åç¬¦æ¿æ¢ |
| | | */ |
| | | public static String innerLinkReplaceEach(String path) { |
| | | return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, "."}, |
| | | new String[]{"", "", "", "/"}); |
| | | return StringUtils.replaceEach(path, new String[]{Constants.HTTP, Constants.HTTPS, Constants.WWW, ".", ":"}, |
| | | new String[]{"", "", "", "/", "/"}); |
| | | } |
| | | } |
| | |
| | | lqw.eq(ObjectUtil.isNotNull(bo.getParentId()), SysDept::getParentId, bo.getParentId()); |
| | | lqw.like(StringUtils.isNotBlank(bo.getDeptName()), SysDept::getDeptName, bo.getDeptName()); |
| | | lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysDept::getStatus, bo.getStatus()); |
| | | lqw.orderByAsc(SysDept::getDeptId); |
| | | lqw.orderByAsc(SysDept::getParentId); |
| | | lqw.orderByAsc(SysDept::getOrderNum); |
| | | lqw.orderByAsc(SysDept::getDeptId); |
| | | return lqw; |
| | | } |
| | | |
| | |
| | | for (Long id : ossIds) { |
| | | SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); |
| | | if (ObjectUtil.isNotNull(vo)) { |
| | | try { |
| | | list.add(this.matchingUrl(vo)); |
| | | } catch (Exception ignored) { |
| | | // 妿osså¼å¸¸æ æ³è¿æ¥åå°æ°æ®ç´æ¥è¿å |
| | | list.add(vo); |
| | | } |
| | | } |
| | | } |
| | | return list; |
| | |
| | | for (Long id : StringUtils.splitTo(ossIds, Convert::toLong)) { |
| | | SysOssVo vo = SpringUtils.getAopProxy(this).getById(id); |
| | | if (ObjectUtil.isNotNull(vo)) { |
| | | try { |
| | | list.add(this.matchingUrl(vo).getUrl()); |
| | | } catch (Exception ignored) { |
| | | // 妿osså¼å¸¸æ æ³è¿æ¥åå°æ°æ®ç´æ¥è¿å |
| | | list.add(vo.getUrl()); |
| | | } |
| | | } |
| | | } |
| | | return String.join(StringUtils.SEPARATOR, list); |
| | |
| | | .like(StringUtils.isNotBlank(bo.getRoleKey()), "r.role_key", bo.getRoleKey()) |
| | | .between(params.get("beginTime") != null && params.get("endTime") != null, |
| | | "r.create_time", params.get("beginTime"), params.get("endTime")) |
| | | .orderByAsc("r.role_sort").orderByAsc("r.create_time");; |
| | | .orderByAsc("r.role_sort").orderByAsc("r.create_time"); |
| | | ; |
| | | return wrapper; |
| | | } |
| | | |
| | |
| | | if (ObjectUtil.isNotNull(role.getRoleId()) && LoginHelper.isSuperAdmin(role.getRoleId())) { |
| | | throw new ServiceException("ä¸å
许æä½è¶
级管çåè§è²"); |
| | | } |
| | | String[] keys = new String[]{TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY}; |
| | | // æ°å¢ä¸å
è®¸ä½¿ç¨ ç®¡çåæ è¯ç¬¦ |
| | | if (ObjectUtil.isNull(role.getRoleId()) |
| | | && StringUtils.equalsAny(role.getRoleKey(), |
| | | TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) { |
| | | && StringUtils.equalsAny(role.getRoleKey(), keys)) { |
| | | throw new ServiceException("ä¸å
许使ç¨ç³»ç»å
置管çåè§è²æ è¯ç¬¦!"); |
| | | } |
| | | // ä¿®æ¹ä¸å
è®¸ä¿®æ¹ ç®¡çåæ è¯ç¬¦ |
| | | if (ObjectUtil.isNotNull(role.getRoleId())) { |
| | | SysRole sysRole = baseMapper.selectById(role.getRoleId()); |
| | | // 妿æ è¯ç¬¦ä¸ç¸ç å¤æä¸ºä¿®æ¹äºç®¡çåæ è¯ç¬¦ |
| | | if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey()) |
| | | && StringUtils.equalsAny(sysRole.getRoleKey(), |
| | | TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) { |
| | | if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())) { |
| | | if (StringUtils.equalsAny(sysRole.getRoleKey(), keys)) { |
| | | throw new ServiceException("ä¸å
许修æ¹ç³»ç»å
置管çåè§è²æ è¯ç¬¦!"); |
| | | } else if (StringUtils.equalsAny(role.getRoleKey(), keys)) { |
| | | throw new ServiceException("ä¸å
许使ç¨ç³»ç»å
置管çåè§è²æ è¯ç¬¦!"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | package org.dromara.system.service.impl; |
| | | |
| | | import cn.dev33.satoken.stp.StpUtil; |
| | | import org.dromara.common.core.utils.StringUtils; |
| | | import org.dromara.common.satoken.utils.LoginHelper; |
| | | import org.dromara.common.sensitive.core.SensitiveService; |
| | | import org.dromara.common.tenant.helper.TenantHelper; |
| | |
| | | * æ¯å¦è±æ |
| | | */ |
| | | @Override |
| | | public boolean isSensitive() { |
| | | public boolean isSensitive(String roleKey, String perms) { |
| | | if (!StpUtil.isLogin()) { |
| | | return true; |
| | | } |
| | | boolean roleExist = StringUtils.isNotBlank(roleKey); |
| | | boolean permsExist = StringUtils.isNotBlank(perms); |
| | | if (roleExist && permsExist) { |
| | | if (StpUtil.hasRole(roleKey) && StpUtil.hasPermission(perms)) { |
| | | return false; |
| | | } |
| | | } else if (roleExist && StpUtil.hasRole(roleKey)) { |
| | | return false; |
| | | } else if (permsExist && StpUtil.hasPermission(perms)) { |
| | | return false; |
| | | } |
| | | |
| | | if (TenantHelper.isEnable()) { |
| | | return !LoginHelper.isSuperAdmin() && !LoginHelper.isTenantAdmin(); |
| | | } |
| | |
| | | network_mode: "host" |
| | | |
| | | ruoyi-server1: |
| | | image: ruoyi/ruoyi-server:5.1.0 |
| | | image: ruoyi/ruoyi-server:5.1.1 |
| | | container_name: ruoyi-server1 |
| | | environment: |
| | | # æ¶åºä¸æµ· |
| | |
| | | network_mode: "host" |
| | | |
| | | ruoyi-server2: |
| | | image: ruoyi/ruoyi-server:5.1.0 |
| | | image: ruoyi/ruoyi-server:5.1.1 |
| | | container_name: ruoyi-server2 |
| | | environment: |
| | | # æ¶åºä¸æµ· |
| | |
| | | network_mode: "host" |
| | | |
| | | ruoyi-monitor-admin: |
| | | image: ruoyi/ruoyi-monitor-admin:5.1.0 |
| | | image: ruoyi/ruoyi-monitor-admin:5.1.1 |
| | | container_name: ruoyi-monitor-admin |
| | | environment: |
| | | # æ¶åºä¸æµ· |
| | |
| | | network_mode: "host" |
| | | |
| | | ruoyi-powerjob-server: |
| | | image: ruoyi/ruoyi-powerjob-server:5.1.0 |
| | | image: ruoyi/ruoyi-powerjob-server:5.1.1 |
| | | container_name: ruoyi-powerjob-server |
| | | environment: |
| | | # æ¶åºä¸æµ· |
| | |
| | | proxy_set_header X-Real-IP $remote_addr; |
| | | proxy_set_header REMOTE-HOST $remote_addr; |
| | | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| | | # websocketåæ° |
| | | proxy_http_version 1.1; |
| | | proxy_set_header Upgrade $http_upgrade; |
| | | proxy_set_header Connection "upgrade"; |
| | | proxy_pass http://server/; |
| | | } |
| | | |