Merge remote-tracking branch 'origin/master'

This commit is contained in:
Captain.B 2020-07-02 16:44:37 +08:00
commit b35a9540d7
3 changed files with 105 additions and 12 deletions

View File

@ -1,11 +1,15 @@
package io.metersphere.ldap.controller; package io.metersphere.ldap.controller;
import io.metersphere.base.domain.User; import io.metersphere.base.domain.User;
import io.metersphere.commons.constants.ParamConstants;
import io.metersphere.commons.exception.MSException;
import io.metersphere.controller.ResultHolder; import io.metersphere.controller.ResultHolder;
import io.metersphere.controller.request.LoginRequest; import io.metersphere.controller.request.LoginRequest;
import io.metersphere.ldap.service.LdapService; import io.metersphere.ldap.service.LdapService;
import io.metersphere.ldap.domain.LdapInfo; import io.metersphere.ldap.domain.LdapInfo;
import io.metersphere.service.SystemParameterService;
import io.metersphere.service.UserService; import io.metersphere.service.UserService;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils; import org.apache.shiro.SecurityUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -18,9 +22,17 @@ public class LdapController {
private UserService userService; private UserService userService;
@Resource @Resource
private LdapService ldapService; private LdapService ldapService;
@Resource
private SystemParameterService systemParameterService;
@PostMapping(value = "/signin") @PostMapping(value = "/signin")
public ResultHolder login(@RequestBody LoginRequest request) { public ResultHolder login(@RequestBody LoginRequest request) {
String isOpen = systemParameterService.getValue(ParamConstants.LDAP.OPEN.getValue());
if (StringUtils.isBlank(isOpen) || StringUtils.equals(Boolean.FALSE.toString(), isOpen)) {
MSException.throwException("LDAP 认证未启用!");
}
ldapService.authenticate(request); ldapService.authenticate(request);
SecurityUtils.getSubject().getSession().setAttribute("authenticate", "ldap"); SecurityUtils.getSubject().getSession().setAttribute("authenticate", "ldap");
@ -45,9 +57,14 @@ public class LdapController {
return userService.login(request); return userService.login(request);
} }
@PostMapping("/connect") @PostMapping("/test/connect")
public void testConnect(@RequestBody LdapInfo ldapInfo) { public void testConnect(@RequestBody LdapInfo ldapInfo) {
ldapService.testConnect(ldapInfo); ldapService.testConnect(ldapInfo);
} }
@PostMapping("/test/login")
public void testLogin(@RequestBody LoginRequest request) {
ldapService.authenticate(request);
}
} }

View File

@ -105,9 +105,12 @@ public class PersonRepoImpl implements PersonRepo {
String url = service.getValue(ParamConstants.LDAP.URL.getValue()); String url = service.getValue(ParamConstants.LDAP.URL.getValue());
String dn = service.getValue(ParamConstants.LDAP.DN.getValue()); String dn = service.getValue(ParamConstants.LDAP.DN.getValue());
String ou = service.getValue(ParamConstants.LDAP.OU.getValue()); String ou = service.getValue(ParamConstants.LDAP.OU.getValue());
String credentials = EncryptUtils.aesDecrypt(service.getValue(ParamConstants.LDAP.PASSWORD.getValue())).toString(); String password = service.getValue(ParamConstants.LDAP.PASSWORD.getValue());
preConnect(url, dn, ou, password);
String credentials = EncryptUtils.aesDecrypt(password).toString();
preConnect(url, dn, ou, credentials);
LdapContextSource sourceLdapCtx = new LdapContextSource(); LdapContextSource sourceLdapCtx = new LdapContextSource();
sourceLdapCtx.setUrl(url); sourceLdapCtx.setUrl(url);

View File

@ -27,33 +27,58 @@
<div> <div>
<el-button type="primary" size="small" :disabled="!show" @click="testConnection">测试连接</el-button> <el-button type="primary" size="small" :disabled="!show" @click="testConnection">测试连接</el-button>
<el-button type="primary" size="small" :disabled="!show">测试登录</el-button> <el-button type="primary" size="small" :disabled="!show" @click="testLogin">测试登录</el-button>
<el-button v-if="showEdit" size="small" @click="edit">编辑</el-button> <el-button v-if="showEdit" size="small" @click="edit">编辑</el-button>
<el-button type="success" v-if="showSave" size="small" @click="save('form')">保存</el-button> <el-button type="success" v-if="showSave" size="small" @click="save('form')">保存</el-button>
<el-button type="info" v-if="showCancel" size="small" @click="cancel">取消</el-button> <el-button type="info" v-if="showCancel" size="small" @click="cancel">取消</el-button>
</div> </div>
<el-dialog title="测试登录" :visible.sync="loginVisible" width="30%" destroy-on-close v-loading="result.loading">
<el-form :model="loginForm" :rules="loginFormRules" ref="loginForm" label-width="80px">
<el-form-item label="用户名" prop="username">
<el-input v-model="loginForm.username" autocomplete="off" placeholder="请输入用户名"/>
</el-form-item>
<el-form-item label="密码" prop="password" >
<el-input v-model="loginForm.password" autocomplete="new-password" placeholder="请输入密码" show-password/>
</el-form-item>
</el-form>
<span slot="footer">
<ms-dialog-footer
@cancel="loginVisible = false"
@confirm="login('loginForm')"/>
</span>
</el-dialog>
</el-card> </el-card>
</div> </div>
</template> </template>
<script> <script>
import MsDialogFooter from "../../common/components/MsDialogFooter";
export default { export default {
name: "LdapSetting", name: "LdapSetting",
components: {
MsDialogFooter
},
data() { data() {
return { return {
form: { form: {open: false},
open: false loginForm: {},
},
result: {}, result: {},
show: true, show: true,
showEdit: true, showEdit: true,
showSave: false, showSave: false,
showCancel: false, showCancel: false,
loginVisible: false,
rules: { rules: {
url: {required: true, message: '请输入LDAP地址', trigger: ['change']}, url: {required: true, message: '请输入LDAP地址', trigger: ['change','blur']},
dn: {required: true, message: '请输入DN', trigger: ['change']}, dn: {required: true, message: '请输入DN', trigger: ['change','blur']},
password: {required: true, message: '请输入密码', trigger: ['change']}, password: {required: true, message: '请输入密码', trigger: ['change','blur']},
ou: {required: true, message: '请输入OU', trigger: ['change']}, ou: {required: true, message: '请输入OU', trigger: ['change','blur']},
},
loginFormRules: {
username: {required: true, message: '请输入用户名', trigger: 'blur'},
password: {required: true, message: '请输入密码', trigger: 'blur'}
} }
} }
}, },
@ -65,6 +90,9 @@
this.result = this.$get("/system/ldap/info", response => { this.result = this.$get("/system/ldap/info", response => {
this.form = response.data; this.form = response.data;
this.form.open = this.form.open === 'true' ? true : false; this.form.open = this.form.open === 'true' ? true : false;
this.$nextTick(() => {
this.$refs.form.clearValidate();
})
}) })
}, },
edit() { edit() {
@ -81,10 +109,44 @@
this.init(); this.init();
}, },
testConnection() { testConnection() {
this.result = this.$post("/ldap/connect", this.form, response => { if (!this.checkParam()) {
return false;
}
this.result = this.$post("/ldap/test/connect", this.form, response => {
this.$success("连接成功!") this.$success("连接成功!")
}) })
}, },
testLogin() {
if (!this.checkParam()) {
return false;
}
if (!this.form.ou) {
this.$warning("LDAP OU不能为空");
return false;
}
this.loginForm = {};
this.loginVisible = true;
},
checkParam() {
if (!this.form.url) {
this.$warning("LDAP 地址不能为空!");
return false;
}
if (!this.form.dn) {
this.$warning("LDAP DN不能为空");
return false;
}
if (!this.form.password) {
this.$warning("LDAP 密码不能为空!");
return false;
}
return true;
},
save(form) { save(form) {
let param = [ let param = [
@ -111,6 +173,17 @@
return false; return false;
} }
}) })
},
login(form) {
this.$refs[form].validate(valid => {
if (valid) {
this.result = this.$post("/ldap/test/login", this.loginForm, response => {
this.$success("登录成功")
});
} else {
return false;
}
})
} }
} }
} }