ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -108,7 +108,6 @@ * @return */ @Anonymous @GetMapping("/getSsoAuthUrl") public AjaxResult getSsoAuthUrl() { String uuid = UUID.randomUUID().toString(); ruoyi-admin/src/main/resources/application-druid.yml
@@ -103,6 +103,13 @@ # 是否开启swagger enabled: true # 日志配置 logging: file-location: /javaWork/lims-ruoyi level: com.ruoyi: info org.springframework: warn minio: endpoint: http://114.132.189.42/ port: 7019 ruoyi-admin/src/main/resources/application-prod.yml
@@ -98,6 +98,13 @@ cache-enabled: false log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl # 日志配置 logging: file-location: /javaWork/lims-ruoyi level: com.ruoyi: info org.springframework: warn # Swagger配置 swagger: # 是否开启swagger ruoyi-admin/src/main/resources/application-test.yml
@@ -99,6 +99,13 @@ cache-enabled: false log-impl: # org.apache.ibatis.logging.stdout.StdOutImpl # 日志配置 logging: file-location: /center-lims/Java level: com.ruoyi: info org.springframework: warn # Swagger配置 swagger: # 是否开启swagger ruoyi-admin/src/main/resources/application.yml
@@ -31,13 +31,6 @@ # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: file-location: /javaWork/lims-ruoyi level: com.ruoyi: info org.springframework: warn # 用户配置 user: password: @@ -95,7 +88,7 @@ # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* #集团统一登录测试库 #集团统一登录 sso: url: clientId: ruoyi-admin/src/main/resources/i18n/messages.properties
@@ -1,38 +1,40 @@ #错误消息 not.null=* 必须填写 user.jcaptcha.error=验证码错误 user.jcaptcha.expire=验证码已失效 user.not.exists=用户不存在/密码错误 user.password.not.match=用户不存在/密码错误 user.password.retry.limit.count=密码输入错误{0}次 user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟 user.password.delete=对不起,您的账号已被删除 user.blocked=用户已封禁,请联系管理员 role.blocked=角色已封禁,请联系管理员 login.blocked=很遗憾,访问IP已被列入系统黑名单 user.logout.success=退出成功 #\u9519\u8BEF\u6D88\u606F not.null=* \u5FC5\u987B\u586B\u5199 user.jcaptcha.error=\u9A8C\u8BC1\u7801\u9519\u8BEF user.jcaptcha.expire=\u9A8C\u8BC1\u7801\u5DF2\u5931\u6548 user.not.exists=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF user.password.not.match=\u7528\u6237\u4E0D\u5B58\u5728/\u5BC6\u7801\u9519\u8BEF user.password.retry.limit.count=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21 user.password.retry.limit.exceed=\u5BC6\u7801\u8F93\u5165\u9519\u8BEF{0}\u6B21\uFF0C\u5E10\u6237\u9501\u5B9A{1}\u5206\u949F user.password.delete=\u5BF9\u4E0D\u8D77\uFF0C\u60A8\u7684\u8D26\u53F7\u5DF2\u88AB\u5220\u9664 user.blocked=\u7528\u6237\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 role.blocked=\u89D2\u8272\u5DF2\u5C01\u7981\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458 login.blocked=\u5F88\u9057\u61BE\uFF0C\u8BBF\u95EEIP\u5DF2\u88AB\u5217\u5165\u7CFB\u7EDF\u9ED1\u540D\u5355 user.logout.success=\u9000\u51FA\u6210\u529F user.single.logout.success=\u5355\u70B9\u767B\u5F55\u9000\u51FA\u6210\u529F length.not.valid=长度必须在{min}到{max}个字符之间 length.not.valid=\u957F\u5EA6\u5FC5\u987B\u5728{min}\u5230{max}\u4E2A\u5B57\u7B26\u4E4B\u95F4 user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头 user.password.not.valid=* 5-50个字符 user.username.not.valid=* 2\u523020\u4E2A\u6C49\u5B57\u3001\u5B57\u6BCD\u3001\u6570\u5B57\u6216\u4E0B\u5212\u7EBF\u7EC4\u6210\uFF0C\u4E14\u5FC5\u987B\u4EE5\u975E\u6570\u5B57\u5F00\u5934 user.password.not.valid=* 5-50\u4E2A\u5B57\u7B26 user.email.not.valid=邮箱格式错误 user.mobile.phone.number.not.valid=手机号格式错误 user.login.success=登录成功 user.register.success=注册成功 user.notfound=请重新登录 user.forcelogout=管理员强制退出,请重新登录 user.unknown.error=未知错误,请重新登录 user.email.not.valid=\u90AE\u7BB1\u683C\u5F0F\u9519\u8BEF user.mobile.phone.number.not.valid=\u624B\u673A\u53F7\u683C\u5F0F\u9519\u8BEF user.login.success=\u767B\u5F55\u6210\u529F user.single.login.success=\u5355\u70B9\u767B\u5F55\u6210\u529F user.register.success=\u6CE8\u518C\u6210\u529F user.notfound=\u8BF7\u91CD\u65B0\u767B\u5F55 user.forcelogout=\u7BA1\u7406\u5458\u5F3A\u5236\u9000\u51FA\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 user.unknown.error=\u672A\u77E5\u9519\u8BEF\uFF0C\u8BF7\u91CD\u65B0\u767B\u5F55 ##文件上传消息 upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB! upload.filename.exceed.length=上传的文件名最长{0}个字符 ##\u6587\u4EF6\u4E0A\u4F20\u6D88\u606F upload.exceed.maxSize=\u4E0A\u4F20\u7684\u6587\u4EF6\u5927\u5C0F\u8D85\u51FA\u9650\u5236\u7684\u6587\u4EF6\u5927\u5C0F\uFF01<br/>\u5141\u8BB8\u7684\u6587\u4EF6\u6700\u5927\u5927\u5C0F\u662F\uFF1A{0}MB\uFF01 upload.filename.exceed.length=\u4E0A\u4F20\u7684\u6587\u4EF6\u540D\u6700\u957F{0}\u4E2A\u5B57\u7B26 ##权限 no.permission=您没有数据的权限,请联系管理员添加权限 [{0}] no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}] no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}] no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}] no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}] no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}] ##\u6743\u9650 no.permission=\u60A8\u6CA1\u6709\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] no.create.permission=\u60A8\u6CA1\u6709\u521B\u5EFA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] no.update.permission=\u60A8\u6CA1\u6709\u4FEE\u6539\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] no.delete.permission=\u60A8\u6CA1\u6709\u5220\u9664\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] no.export.permission=\u60A8\u6CA1\u6709\u5BFC\u51FA\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] no.view.permission=\u60A8\u6CA1\u6709\u67E5\u770B\u6570\u636E\u7684\u6743\u9650\uFF0C\u8BF7\u8054\u7CFB\u7BA1\u7406\u5458\u6DFB\u52A0\u6743\u9650 [{0}] ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -111,7 +111,7 @@ .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 requests.antMatchers("/login", "/register", "/captchaImage").permitAll() requests.antMatchers("/login", "/register", "/captchaImage", "/getSsoAuthUrl", "/loginBySSO").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**", "/img/**", "/word/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll() ruoyi-framework/src/main/java/com/ruoyi/framework/security/handle/LogoutSuccessHandlerImpl.java
@@ -4,8 +4,12 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.ruoyi.common.config.SsoBean; import com.ruoyi.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import com.alibaba.fastjson2.JSON; @@ -29,6 +33,10 @@ { @Autowired private TokenService tokenService; @Autowired private RedisTemplate redisTemplate; @Autowired private SsoBean ssoBean; /** * 退出处理 @@ -40,14 +48,24 @@ throws IOException, ServletException { LoginUser loginUser = tokenService.getLoginUser(request); String loginOutUrl = null; if (StringUtils.isNotNull(loginUser)) { String userName = loginUser.getUsername(); // 删除用户缓存记录 tokenService.delLoginUser(loginUser.getToken()); // 记录用户退出日志 // 清除单点登录信息 Object idToken = redisTemplate.opsForValue().get("ssoOauthToken:idToken:" + userName); if (idToken != null) { loginOutUrl = ssoBean.getUrl() + "/oauth2/sessions/logout?id_token_hint=" + idToken; redisTemplate.delete("ssoOauthToken:idToken:" + SecurityUtils.getUsername()); AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.single.logout.success"))); } else { AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, MessageUtils.message("user.logout.success"))); } ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success")))); } ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.success(MessageUtils.message("user.logout.success"), loginOutUrl))); } } ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -4,11 +4,12 @@ import javax.net.ssl.SSLContext; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.PropertyNamingStrategy; import com.alibaba.fastjson.parser.ParserConfig; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.config.SsoBean; import com.ruoyi.common.core.domain.entity.User; import com.ruoyi.framework.model.SsoOauthTokenModel; import com.ruoyi.framework.model.SsoUserInfoModel; import com.ruoyi.system.mapper.UserMapper; import lombok.extern.slf4j.Slf4j; import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; @@ -24,6 +25,7 @@ import org.apache.http.ssl.TrustStrategy; import org.apache.http.util.EntityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -60,6 +62,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 登录校验方法 @@ -80,13 +83,19 @@ private RedisCache redisCache; @Autowired private ISysUserService userService; private ISysUserService sysUserService; @Autowired private ISysConfigService configService; @Autowired private SsoBean ssoBean; @Autowired private RedisTemplate redisTemplate; @Autowired private UserMapper userMapper; /** * 登录验证 @@ -212,7 +221,7 @@ sysUser.setUserId(userId); sysUser.setLoginIp(IpUtils.getIpAddr()); sysUser.setLoginDate(DateUtils.getNowDate()); userService.updateUserProfile(sysUser); sysUserService.updateUserProfile(sysUser); } /** @@ -238,6 +247,8 @@ AsyncManager.me().execute(AsyncFactory.recordLogininfor(userInfo.getEmployeeId(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.single.login.success"))); redisTemplate.opsForValue().set("ssoOauthToken:idToken:" + userInfo.getEmployeeId(), tokenModel.getId_token(), 3, TimeUnit.DAYS); // 生成token return tokenService.createToken(null); }