Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -1,6 +1,5 @@
|
|||||||
package com.budwk.app.sys.controller;
|
package com.budwk.app.sys.controller;
|
||||||
|
|
||||||
import cn.dev33.satoken.annotation.SaCheckLogin;
|
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.codec.Base64Encoder;
|
import cn.hutool.core.codec.Base64Encoder;
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
@@ -69,14 +68,49 @@ public class SysLoginController {
|
|||||||
@ApiOperation("用户本地登录页面")
|
@ApiOperation("用户本地登录页面")
|
||||||
@Filters
|
@Filters
|
||||||
public String login(HttpServletRequest req, HttpSession session) {
|
public String login(HttpServletRequest req, HttpSession session) {
|
||||||
return "beetl:/platform/sys/login.html";
|
return localLoginOrCas(req, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@At
|
@At
|
||||||
@Ok("re")
|
@Ok("re")
|
||||||
@Filters
|
@Filters
|
||||||
public String h5() {
|
public String h5(HttpServletRequest req, HttpSession session) {
|
||||||
return "beetl:/platform/sys/login.html";
|
return localLoginOrCas(req, session);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本地登录页入口处理。
|
||||||
|
* 参数说明:
|
||||||
|
* 1. req:当前登录页请求,用于读取请求地址、查询参数以及 CAS 回调后的登录跳转参数。
|
||||||
|
* 2. session:当前会话,用于读取 CAS 客户端写入的认证断言。
|
||||||
|
* 返回值为 Nutz re 视图字符串:未开启 SSO 或已通过 CAS 认证时返回本地登录页,开启 SSO 且未认证时返回 CAS 登录重定向地址。
|
||||||
|
*/
|
||||||
|
private String localLoginOrCas(HttpServletRequest req, HttpSession session) {
|
||||||
|
if (!conf.getBoolean("cas.enable", false)) {
|
||||||
|
return "beetl:/platform/sys/login.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
Assertion assertion = (Assertion) session.getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
|
||||||
|
if (assertion != null && assertion.getPrincipal() != null) {
|
||||||
|
// CAS 已认证只代表允许访问本地登录页,不在这里自动完成系统登录,避免访问 /platform/login 时被带到首页。
|
||||||
|
return "beetl:/platform/sys/login.html";
|
||||||
|
}
|
||||||
|
|
||||||
|
return ">>:" + buildCasLoginUrl(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构建 CAS 登录地址。
|
||||||
|
* 参数说明:
|
||||||
|
* 1. req:当前请求,用于把原始访问地址作为 redirect 参数带回系统。
|
||||||
|
* 返回值为完整 CAS 登录 URL,CAS 认证成功后会回调到 cas.client-call-back-url。
|
||||||
|
*/
|
||||||
|
private String buildCasLoginUrl(HttpServletRequest req) {
|
||||||
|
String requestURI = req.getRequestURI();
|
||||||
|
String query = req.getQueryString();
|
||||||
|
String redirect = StrUtil.isNotBlank(query) ? requestURI + "?" + query : requestURI;
|
||||||
|
String callBackUrl = conf.get("cas.client-host-url") + conf.get("cas.client-call-back-url") + "?redirect=" + URLEncoder.encode(redirect, StandardCharsets.UTF_8);
|
||||||
|
return conf.get("cas.server-login-url") + "?service=" + URLEncoder.encode(callBackUrl, StandardCharsets.UTF_8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -17,10 +17,12 @@ import com.budwk.app.sys.services.SysUnitService;
|
|||||||
import com.budwk.app.sys.services.SysUserService;
|
import com.budwk.app.sys.services.SysUserService;
|
||||||
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
|
||||||
import com.budwk.app.web.commons.base.Globals;
|
import com.budwk.app.web.commons.base.Globals;
|
||||||
|
import org.nutz.aop.interceptor.ioc.TransAop;
|
||||||
import org.nutz.dao.Chain;
|
import org.nutz.dao.Chain;
|
||||||
import org.nutz.dao.Cnd;
|
import org.nutz.dao.Cnd;
|
||||||
import org.nutz.dao.Sqls;
|
import org.nutz.dao.Sqls;
|
||||||
import org.nutz.dao.sql.Sql;
|
import org.nutz.dao.sql.Sql;
|
||||||
|
import org.nutz.ioc.aop.Aop;
|
||||||
import org.nutz.ioc.loader.annotation.Inject;
|
import org.nutz.ioc.loader.annotation.Inject;
|
||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
import org.nutz.lang.Lang;
|
import org.nutz.lang.Lang;
|
||||||
@@ -150,6 +152,21 @@ public class SysUserController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@At("/resetAllPwd")
|
||||||
|
@Ok("json")
|
||||||
|
@SaCheckPermission("sys.manager.user.edit")
|
||||||
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
|
@SLog(tag = "重置所有用户密码", msg = "排除superadmin后批量重置用户密码")
|
||||||
|
public Object resetAllPwd() {
|
||||||
|
try {
|
||||||
|
// 批量重置只返回影响人数,避免把所有用户的新密码暴露到页面或日志中。
|
||||||
|
int count = sysUserService.resetAllUserPwdExcludeSuperadmin();
|
||||||
|
return Result.success().addData(count);
|
||||||
|
} catch (Exception e) {
|
||||||
|
return Result.error();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@At("/delete/?")
|
@At("/delete/?")
|
||||||
@Ok("json")
|
@Ok("json")
|
||||||
@SaCheckPermission("sys.manager.user.delete")
|
@SaCheckPermission("sys.manager.user.delete")
|
||||||
|
|||||||
@@ -78,6 +78,14 @@ public interface SysUserService extends BaseService<Sys_user> {
|
|||||||
*/
|
*/
|
||||||
void deleteByIds(String[] userIds);
|
void deleteByIds(String[] userIds);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置所有普通用户密码,系统内置 superadmin 账号不参与重置。
|
||||||
|
* 返回值为本次实际完成密码重置的用户数量,便于前端提示管理员操作影响范围。
|
||||||
|
*
|
||||||
|
* @return 已重置密码的用户数量
|
||||||
|
*/
|
||||||
|
int resetAllUserPwdExcludeSuperadmin();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过用户ID和菜单父ID获取下级权限菜单
|
* 通过用户ID和菜单父ID获取下级权限菜单
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.nutz.ioc.loader.annotation.Inject;
|
|||||||
import org.nutz.ioc.loader.annotation.IocBean;
|
import org.nutz.ioc.loader.annotation.IocBean;
|
||||||
import org.nutz.lang.Lang;
|
import org.nutz.lang.Lang;
|
||||||
import org.nutz.lang.Strings;
|
import org.nutz.lang.Strings;
|
||||||
|
import org.nutz.lang.random.R;
|
||||||
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
|
import org.nutz.plugins.wkcache.annotation.CacheDefaults;
|
||||||
import org.nutz.plugins.wkcache.annotation.CacheRemove;
|
import org.nutz.plugins.wkcache.annotation.CacheRemove;
|
||||||
import org.nutz.plugins.wkcache.annotation.CacheRemoveAll;
|
import org.nutz.plugins.wkcache.annotation.CacheRemoveAll;
|
||||||
@@ -220,6 +221,26 @@ public class SysUserServiceImpl extends BaseServiceImpl<Sys_user> implements Sys
|
|||||||
dao().clear("sys_user", Cnd.where("id", "in", userIds));
|
dao().clear("sys_user", Cnd.where("id", "in", userIds));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量重置普通用户密码。
|
||||||
|
* 业务边界:superadmin 为系统内置管理员账号,必须保持原密码不被批量操作影响。
|
||||||
|
*
|
||||||
|
* @return 实际重置密码的用户数量
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Aop(TransAop.READ_COMMITTED)
|
||||||
|
public int resetAllUserPwdExcludeSuperadmin() {
|
||||||
|
List<Sys_user> users = this.query(Cnd.where("loginname", "!=", "superadmin"));
|
||||||
|
for (Sys_user user : users) {
|
||||||
|
String pwd = PwdUtil.generate(12);
|
||||||
|
String salt = R.UU32();
|
||||||
|
String encryptPwd = PwdUtil.getPassword(pwd, salt);
|
||||||
|
this.update(Chain.make("password", encryptPwd).add("salt", salt), Cnd.where("id", "=", user.getId()));
|
||||||
|
}
|
||||||
|
this.clearCache();
|
||||||
|
return users.size();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param userId
|
* @param userId
|
||||||
* @param pid
|
* @param pid
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ layout("/layouts/platform.html"){
|
|||||||
<i class="ti-plus"></i>
|
<i class="ti-plus"></i>
|
||||||
新建用户
|
新建用户
|
||||||
</el-button>
|
</el-button>
|
||||||
|
<el-button size="small" @click="resetAllPwd" :loading="resetAllPwdLoading" type="warning">
|
||||||
|
<i class="ti-reload"></i>
|
||||||
|
重置所有用户密码
|
||||||
|
</el-button>
|
||||||
</table-tool>
|
</table-tool>
|
||||||
<el-table
|
<el-table
|
||||||
:key="tableKey"
|
:key="tableKey"
|
||||||
@@ -208,6 +212,7 @@ layout("/layouts/platform.html"){
|
|||||||
addDialogVisible: false,
|
addDialogVisible: false,
|
||||||
editDialogVisible: false,
|
editDialogVisible: false,
|
||||||
roleDialogVisible: false,
|
roleDialogVisible: false,
|
||||||
|
resetAllPwdLoading: false,
|
||||||
treeData: {
|
treeData: {
|
||||||
label: "name",
|
label: "name",
|
||||||
children: "zones",
|
children: "zones",
|
||||||
@@ -321,6 +326,26 @@ layout("/layouts/platform.html"){
|
|||||||
this.formData = {} //打开新增窗口,表单先清空
|
this.formData = {} //打开新增窗口,表单先清空
|
||||||
if (this.$refs["addForm"]) this.$refs["addForm"].resetFields()
|
if (this.$refs["addForm"]) this.$refs["addForm"].resetFields()
|
||||||
},
|
},
|
||||||
|
resetAllPwd() {
|
||||||
|
this.$confirm("此操作将重置除 superadmin 外所有用户的密码,确定继续?", "提示", {
|
||||||
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
})
|
||||||
|
.then(() => {
|
||||||
|
this.resetAllPwdLoading = true
|
||||||
|
this.$axios.post("/platform/sys/user/resetAllPwd", {}).then((res) => {
|
||||||
|
if (res.code === 0) {
|
||||||
|
this.$alert("已重置 " + res.data + " 个用户的密码", "重置完成", {
|
||||||
|
confirmButtonText: "确定"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}).finally(() => {
|
||||||
|
this.resetAllPwdLoading = false
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.catch(() => {})
|
||||||
|
},
|
||||||
doAdd() {
|
doAdd() {
|
||||||
this.$refs["addForm"].validate((valid) => {
|
this.$refs["addForm"].validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
|
|||||||
Reference in New Issue
Block a user