diff --git a/web/config/router.config.js b/web/config/router.config.js
index b82b0695..192177df 100644
--- a/web/config/router.config.js
+++ b/web/config/router.config.js
@@ -265,16 +265,12 @@ export default [
path: '/settings/security',
name: 'security',
component: './Settings/Security/General',
- }, {
- path: '/settings/security/general',
- name: 'general',
- component: './Forms/BasicForm',
},
]
}, {
path: '/settings/audit',
name: 'audit',
- component: './List/TableList',
+ component: './Settings/Security/Audit',
},
]
},
diff --git a/web/src/locales/en-US.js b/web/src/locales/en-US.js
index e799ddd2..eb964182 100644
--- a/web/src/locales/en-US.js
+++ b/web/src/locales/en-US.js
@@ -215,6 +215,10 @@ export default {
'app.settings.global.data_path':"Data Path",
'app.settings.global.log_path':"Log Path",
+ 'app.settings.security.auth2factor_enabled':"Enable 2FA(two-factor) Authentication",
+ 'app.settings.security.audit_enabled':"Enable Audit Logging",
+
+
'app.settings.menuMap.basic': 'Basic Settings',
'app.settings.menuMap.security': 'Security Settings',
'app.settings.menuMap.binding': 'Account Binding',
diff --git a/web/src/locales/zh-CN.js b/web/src/locales/zh-CN.js
index f70ce21b..e19bc5cf 100644
--- a/web/src/locales/zh-CN.js
+++ b/web/src/locales/zh-CN.js
@@ -219,10 +219,14 @@ export default {
'app.settings.global.site_name':"站点名称",
'app.settings.global.domain':"站点域名",
'app.settings.global.listen_addr':"监听地址",
- 'app.settings.global.is_tls':"是否开启 TLS",
+ 'app.settings.global.is_tls':"开启 TLS",
'app.settings.global.data_path':"数据目录",
'app.settings.global.log_path':"日志目录",
+ 'app.settings.security.auth2factor_enabled':"开启双因子身份认证",
+ 'app.settings.security.audit_enabled':"开启审计日志",
+
+
'app.settings.menuMap.basic': '基本设置',
'app.settings.menuMap.security': '安全设置',
'app.settings.menuMap.binding': '账号绑定',
diff --git a/web/src/pages/Settings/Global/Global.js b/web/src/pages/Settings/Global/Global.js
index ded7ae35..0a831963 100644
--- a/web/src/pages/Settings/Global/Global.js
+++ b/web/src/pages/Settings/Global/Global.js
@@ -96,7 +96,7 @@ class Global extends Component {
rules: [
{
required: true,
- message: "勾选状态",
+ message: formatMessage({id: 'app.settings.global.is_tls-message'}, {}),
},
],
})(
diff --git a/web/src/pages/Settings/Security/Audit.js b/web/src/pages/Settings/Security/Audit.js
new file mode 100644
index 00000000..230c8f6f
--- /dev/null
+++ b/web/src/pages/Settings/Security/Audit.js
@@ -0,0 +1,79 @@
+import React, {Component, Fragment} from 'react';
+
+import {Col, Divider,Card, Form, Icon, Input, Row, Select, Table} from 'antd';
+import {formatMessage} from 'umi/locale';
+
+const {Option} = Select;
+
+const FormItem = Form.Item;
+const {TextArea} = Input;
+
+
+@Form.create()
+class Audit extends Component {
+
+ componentDidMount() {
+ }
+
+ auditTable() {
+ const columns = [
+ {
+ title: 'ID',
+ dataIndex: 'key',
+ key: 'key',
+ render: text => {text},
+ },
+ {
+ title: '用户名',
+ dataIndex: 'username',
+ key: 'username',
+ },
+ {
+ title: '消息日志',
+ dataIndex: 'message',
+ key: 'message',
+ }, {
+ title: '时间',
+ key: 'time',
+ dataIndex: 'time',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ render: (text, record) => (
+
+ 详情
+
+ ),
+ },
+ ];
+
+ const data = [
+ {
+ key: '1',
+ username: 'admin',
+ enabled: true,
+ message: "User Login Success",
+ time: "Oct 19, 2019",
+
+ }, {
+ key: '2',
+ username: 'user',
+ enabled: true,
+ message: "User Login Failed",
+ time: "Oct 19, 2019",
+ },
+ ];
+ return (
);
+ }
+
+ render() {
+ return (
+ < Fragment >
+ < Card>{ this.auditTable() }
+
+ );
+ }
+}
+
+export default Audit;
diff --git a/web/src/pages/Settings/Security/General.js b/web/src/pages/Settings/Security/General.js
index bd90ddff..5840d66e 100644
--- a/web/src/pages/Settings/Security/General.js
+++ b/web/src/pages/Settings/Security/General.js
@@ -1,6 +1,8 @@
import React, {Component, Fragment} from 'react';
import {connect} from 'dva';
-import {Card, Form, Input, Select, Button, message, Divider, Drawer, Descriptions} from 'antd';
+import {Card, Form, Input, Select,Switch, Button, message, Divider, Drawer, Descriptions} from 'antd';
+import { Table, Tag } from 'antd';
+import { Icon } from 'antd';
const {Option} = Select;
import {formatMessage, FormattedMessage} from 'umi/locale';
@@ -60,6 +62,151 @@ class General extends Component {
this.setState({operationkey: key});
};
+ ssoSettings() {
+ const columns = [
+ {
+ title: 'ID',
+ dataIndex: 'key',
+ key: 'key',
+ render: text => {text},
+ },
+ {
+ title: '名称',
+ dataIndex: 'name',
+ key: 'name',
+ },
+ {
+ title: '类型',
+ dataIndex: 'type',
+ key: 'type',
+ },
+ {
+ title: '启用',
+ key: 'enabled',
+ dataIndex: 'enabled',
+ render: text => ,
+ }, {
+ title: '最后更新时间',
+ key: 'modify_time',
+ dataIndex: 'modify_time',
+ }, {
+ title: '创建时间',
+ key: 'create_time',
+ dataIndex: 'create_time',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ render: (text, record) => (
+
+ 修改
+
+ 删除
+
+ ),
+ },
+ ];
+
+ const data = [
+ {
+ key: '1',
+ name: 'github',
+ type: "OAuth2",
+ enabled: true,
+ modify_time: "Mar 01, 2020",
+ create_time: "Oct 19, 2019",
+ },{
+ key: '2',
+ name: 'okta',
+ type: "OAuth2",
+ enabled: true,
+ modify_time: "Mar 02, 2020",
+ create_time: "Oct 29, 2019",
+ },
+ ];
+ return ();
+ }
+
+ userSettings() {
+ const columns = [
+ {
+ title: 'ID',
+ dataIndex: 'key',
+ key: 'key',
+ render: text => {text},
+ },
+ {
+ title: '用户名',
+ dataIndex: 'user_name',
+ key: 'user_name',
+ },
+ {
+ title: '电子邮件地址',
+ dataIndex: 'email',
+ key: 'email',
+ },
+ {
+ title: '已激活',
+ key: 'enabled',
+ dataIndex: 'enabled',
+ render: text => ,
+ }, {
+ title: '管理员',
+ key: 'is_admin',
+ dataIndex: 'is_admin',
+ render: (text, record) => {
+ if (record.is_admin){
+ return
+ }else{
+ return
+ }
+ },
+ }, {
+ title: '创建时间',
+ key: 'create_time',
+ dataIndex: 'create_time',
+ },{
+ title: '上次登录',
+ key: 'last_login_time',
+ dataIndex: 'last_login_time',
+ },
+ {
+ title: '操作',
+ key: 'action',
+ render: (text, record) => (
+
+ 修改
+
+ 删除
+
+ ),
+ },
+ ];
+
+ const data = [
+ {
+ key: '1',
+ user_name: 'admin',
+ email: "admin@infini.ltd",
+ enabled: true,
+ is_admin: true,
+ create_time: "Oct 19, 2019",
+ last_login_time: "Mar 01, 2020",
+
+ }, {
+ key: '2',
+ user_name: 'user',
+ email: "user@infini.ltd",
+ enabled: true,
+ is_admin: false,
+ create_time: "Oct 19, 2019",
+ last_login_time: "Mar 01, 2020",
+
+ },
+ ];
+ return ();
+ }
+
generalSettings = () => {
const {
form: {getFieldDecorator},
@@ -75,140 +222,40 @@ class General extends Component {
layout = "vertical"
hideRequiredMark >
+
+
+ {getFieldDecorator('auth2factor_enabled', {
+ initialValue: true,
+ rules: [
+ {
+ required: true,
+ message: formatMessage({id: 'app.settings.security.auth2factor_enabled-message'}, {}),
+ },
+ ],
+ })(
+ {}} />
+ )}
+
+
< FormItem
- label = {formatMessage({id: 'app.settings.security.auth2factor_enabled'})} >
- {getFieldDecorator('profile',
+ label = {formatMessage({id: 'app.settings.security.audit_enabled'})} >
+ {getFieldDecorator('audit_enabled',
{
rules: [
{
required: true,
- message: formatMessage({id: 'app.settings.basic.profile-message'}, {}),
+ message: formatMessage({id: 'app.settings.security.audit_enabled-message'}, {}),
},
],
}
)
- ( < Input /> )
+ (
+ {}} />
+ )
}
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.email'})} >
- {getFieldDecorator('email',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.email-message'}, {}),
- },
- ],
- }
- )
- ( < Input / >
- )
- }
- <
- /FormItem>
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.nickname'})} >
- {getFieldDecorator('name',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.nickname-message'}, {}),
- },
- ],
- }
- )
- ( < Input / >
- )
- }
- <
- /FormItem>
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.profile'})} >
- {getFieldDecorator('profile',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.profile-message'}, {}),
- },
- ],
- }
- )
- (
- < Input.TextArea
- placeholder = {formatMessage({id: 'app.settings.basic.profile-placeholder'})}
- rows = {4}
- />
- )
- }
- <
- /FormItem>
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.country'})} >
- {getFieldDecorator('country',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.country-message'}, {}),
- },
- ],
- }
- )
- (
- < Select
- style = {
- {
- maxWidth: 220
- }
- }>
- <
- Option
- value = "China" > 中国 < /Option>
- < /Select>
- )
- }
- <
- /FormItem>
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.address'})} >
- {getFieldDecorator('address',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.address-message'}, {}),
- },
- ],
- }
- )
- ( < Input / >
- )
- }
- <
- /FormItem>
- < FormItem
- label = {formatMessage({id: 'app.settings.basic.phone'})} >
- {getFieldDecorator('phone',
- {
- rules: [
- {
- required: true,
- message: formatMessage({id: 'app.settings.basic.phone-message'}, {}),
- },
- // { validator: validatorPhone },
- ],
- }
- )
- ( < PhoneView / >
- )
- }
- <
- /FormItem>
< Button
type = "primary" >
< FormattedMessage
@@ -233,9 +280,9 @@ class General extends Component {
const {operationkey} = this.state;
const contentList = {
tab1: ( < div > {this.generalSettings()} < /div>),
- tab2: ( < div > SSO 集成 < /div>),
+ tab2: ( < div > {this.ssoSettings()}< /div>),
tab3: ( < div > 角色管理 < /div>),
- tab4: ( < div > 用户管理 < /div>),
+ tab4: ( < div > {this.userSettings()} < /div>),
tab5: ( < div > 证书管理 < /div>),
}
;