mirror of
https://gitcode.com/gh_mirrors/hy/Hydro.git
synced 2026-10-20 01:38:19 +08:00
用户权限管理
This commit is contained in:
1 parent
c2f9bf8c53
commit
4ec2a46877
11 files changed
+172
-75
No files matched your search
+25
-16
@@ -1,13 +1,11 @@
|
||||
const system = require('../model/system');
|
||||
const user = require('../model/user');
|
||||
const builtin = require('../model/builtin');
|
||||
const { Route, Handler } = require('../service/server');
|
||||
const { PERM_ADMIN } = require('../permission');
|
||||
const { PERM_MANAGE } = require('../permission');
|
||||
const { RoleAlreadyExistError, ValidationError } = require('../error');
|
||||
|
||||
class ManageHandler extends Handler {
|
||||
async prepare() {
|
||||
this.checkPerm(PERM_ADMIN);
|
||||
this.checkPerm(PERM_MANAGE);
|
||||
this.system = await user.getById(0);
|
||||
}
|
||||
}
|
||||
@@ -43,20 +41,22 @@ class ManageEditHandler extends ManageHandler {
|
||||
class ManageUserHandler extends ManageHandler {
|
||||
async get() {
|
||||
const uids = [];
|
||||
const [rudocs, udocs, roles] = await Promise.all([
|
||||
system.get(),
|
||||
user.getMulti({ role: { $neq: 'default' } }).toArray(),
|
||||
const rudocs = {};
|
||||
const [udocs, roles, system] = await Promise.all([
|
||||
user.getMulti({ role: { $ne: 'default' } }).toArray(),
|
||||
user.getRoles(),
|
||||
user.getById(0),
|
||||
]);
|
||||
for (const role of roles) rudocs[role._id] = [];
|
||||
for (const udoc of udocs) {
|
||||
uids.push(udoc._id);
|
||||
rudocs[udoc.role].push(udoc);
|
||||
}
|
||||
const roles_with_text = roles.map((role) => [role, role]);
|
||||
const rolesSelect = roles.map((role) => [role._id, role._id]);
|
||||
const udict = await user.getList(uids);
|
||||
this.response.template = 'domain_manage_user.html';
|
||||
this.response.body = {
|
||||
roles, roles_with_text, rudocs, udict,
|
||||
roles, rolesSelect, rudocs, udict, system,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -68,9 +68,12 @@ class ManageUserHandler extends ManageHandler {
|
||||
|
||||
class ManagePermissionHandler extends ManageHandler {
|
||||
async get() {
|
||||
const roles = await user.getRoles();
|
||||
const [roles, system] = await Promise.all([
|
||||
user.getRoles(),
|
||||
user.getById(0),
|
||||
]);
|
||||
this.response.template = 'domain_manage_permission.html';
|
||||
this.response.body = { roles };
|
||||
this.response.body = { roles, system };
|
||||
}
|
||||
|
||||
async post({ roles }) {
|
||||
@@ -88,21 +91,27 @@ class ManagePermissionHandler extends ManageHandler {
|
||||
|
||||
class ManageRoleHandler extends ManageHandler {
|
||||
async get() {
|
||||
const roles = await user.getRoles();
|
||||
const [roles, system] = await Promise.all([
|
||||
user.getRoles(),
|
||||
user.getById(0),
|
||||
]);
|
||||
this.response.template = 'domain_manage_role.html';
|
||||
this.response.body = { roles };
|
||||
this.response.body = { roles, system };
|
||||
}
|
||||
|
||||
async postAdd({ role }) {
|
||||
const r = await user.getRole(role);
|
||||
const [r, u] = await Promise.all([
|
||||
user.getRole(role),
|
||||
user.getRole('default'),
|
||||
]);
|
||||
if (r) throw new RoleAlreadyExistError(role);
|
||||
await user.addRole(role, builtin.PERM_DEFAULT);
|
||||
await user.addRole(role, u.perm);
|
||||
this.back();
|
||||
}
|
||||
|
||||
async postDelete({ roles }) {
|
||||
for (const role of roles) {
|
||||
if (['admin', 'default', 'guest'].includes(role)) {
|
||||
if (['root', 'default', 'guest'].includes(role)) {
|
||||
throw new ValidationError('role');
|
||||
}
|
||||
}
|
||||
|
||||
+10
-3
@@ -30,6 +30,7 @@ class UserLoginHandler extends Handler {
|
||||
this.response.redirect = referer.endsWith('/login') ? '/' : referer;
|
||||
}
|
||||
}
|
||||
|
||||
class UserLogoutHandler extends Handler {
|
||||
async prepare() {
|
||||
this.checkPerm(PERM_LOGGEDIN);
|
||||
@@ -44,6 +45,7 @@ class UserLogoutHandler extends Handler {
|
||||
this.response.body = {};
|
||||
}
|
||||
}
|
||||
|
||||
class UserRegisterHandler extends Handler {
|
||||
async prepare() {
|
||||
this.checkPerm(PERM_REGISTER_USER);
|
||||
@@ -71,6 +73,7 @@ class UserRegisterHandler extends Handler {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class UserRegisterWithCodeHandler extends Handler {
|
||||
async prepare() {
|
||||
this.checkPerm(PERM_REGISTER_USER);
|
||||
@@ -99,6 +102,7 @@ class UserRegisterWithCodeHandler extends Handler {
|
||||
this.response.redirect = '/';
|
||||
}
|
||||
}
|
||||
|
||||
class UserLostPassHandler extends Handler {
|
||||
constructor(ctx) {
|
||||
if (!options.smtp.user) throw new SystemError('Cannot send mail');
|
||||
@@ -123,6 +127,7 @@ class UserLostPassHandler extends Handler {
|
||||
this.response.template = 'user_lostpass_mail_sent.html';
|
||||
}
|
||||
}
|
||||
|
||||
class UserLostPassWithCodeHandler extends Handler {
|
||||
async get({ code }) {
|
||||
const tdoc = await token.get(code, token.TYPE_LOSTPASS);
|
||||
@@ -140,6 +145,7 @@ class UserLostPassWithCodeHandler extends Handler {
|
||||
this.response.redirect = '/';
|
||||
}
|
||||
}
|
||||
|
||||
class UserDetailHandler extends Handler {
|
||||
constructor(ctx) {
|
||||
super(ctx);
|
||||
@@ -154,6 +160,7 @@ class UserDetailHandler extends Handler {
|
||||
this.response.body = { isSelfProfile, udoc, sdoc };
|
||||
}
|
||||
}
|
||||
|
||||
class UserSearchHandler extends Handler {
|
||||
async get({ q, exactMatch = false }) {
|
||||
let udocs;
|
||||
@@ -161,7 +168,7 @@ class UserSearchHandler extends Handler {
|
||||
else udocs = await user.getPrefixList(q, 20);
|
||||
try {
|
||||
const udoc = await user.getById(parseInt(q));
|
||||
if (udoc) udocs.insert(0, udoc);
|
||||
if (udoc) udocs.push(udoc);
|
||||
} catch (e) {
|
||||
/* Ignore */
|
||||
}
|
||||
@@ -170,7 +177,7 @@ class UserSearchHandler extends Handler {
|
||||
udocs[i].gravatar_url = misc.gravatar_url[udocs[i].gravatar];
|
||||
}
|
||||
}
|
||||
this.response.body = { udocs };
|
||||
this.response.body = udocs;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -180,5 +187,5 @@ Route('/register/:code', UserRegisterWithCodeHandler);
|
||||
Route('/logout', UserLogoutHandler);
|
||||
Route('/lostpass', UserLostPassHandler);
|
||||
Route('/lostpass/:code', UserLostPassWithCodeHandler);
|
||||
Route('/user/:uid', UserDetailHandler);
|
||||
Route('/user/search', UserSearchHandler);
|
||||
Route('/user/:uid', UserDetailHandler);
|
||||
Reference in new issue
Block a user