Skip to content

Commit c3f770c

Browse files
committed
修改 OAuth2ClientDO 实体,支持自动授权的范围的设置
1 parent 9850df0 commit c3f770c

File tree

4 files changed

+197
-14
lines changed

4 files changed

+197
-14
lines changed

src/api/login.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,20 @@ export function refreshToken() {
109109
method: 'post'
110110
})
111111
}
112+
113+
// ========== OAUTH 2.0 相关 ==========
114+
export function authorize() {
115+
return service({
116+
url: '/system/oauth2/authorize',
117+
headers:{
118+
'Content-type': 'application/x-www-form-urlencoded',
119+
"Access-Control-Allow-Origin": "*"
120+
},
121+
params: {
122+
response_type: 'code',
123+
client_id: 'test',
124+
redirect_uri: 'https://www.iocoder.cn',
125+
},
126+
method: 'post'
127+
})
128+
}

src/router/index.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,11 @@ export const constantRoutes = [
4242
component: (resolve) => require(['@/views/login'], resolve),
4343
hidden: true
4444
},
45+
{
46+
path: '/authorize',
47+
component: (resolve) => require(['@/views/authorize'], resolve),
48+
hidden: true
49+
},
4550
{
4651
path: '/social-login',
4752
component: (resolve) => require(['@/views/socialLogin'], resolve),

src/views/authorize.vue

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
<template>
2+
<div class="container">
3+
<div class="logo"></div>
4+
<!-- 登录区域 -->
5+
<div class="content">
6+
<!-- 配图 -->
7+
<div class="pic"></div>
8+
<!-- 表单 -->
9+
<div class="field">
10+
<!-- [移动端]标题 -->
11+
<h2 class="mobile-title">
12+
<h3 class="title">芋道后台管理系统</h3>
13+
</h2>
14+
15+
<!-- 表单 -->
16+
<div class="form-cont">
17+
<el-tabs class="form" style=" float:none;">
18+
<el-tab-pane label="三方授权" name="uname">
19+
</el-tab-pane>
20+
</el-tabs>
21+
<div>
22+
<el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form">
23+
<el-form-item prop="tenantName" v-if="tenantEnable">
24+
<el-input v-model="loginForm.tenantName" type="text" auto-complete="off" placeholder='租户'>
25+
<svg-icon slot="prefix" icon-class="tree" class="el-input__icon input-icon"/>
26+
</el-input>
27+
</el-form-item>
28+
<!-- 账号密码登录 -->
29+
<div v-if="loginForm.loginType === 'uname'">
30+
<el-form-item prop="username">
31+
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
32+
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon"/>
33+
</el-input>
34+
</el-form-item>
35+
<el-form-item prop="password">
36+
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码"
37+
@keyup.enter.native="handleLogin">
38+
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon"/>
39+
</el-input>
40+
</el-form-item>
41+
<el-form-item prop="code" v-if="captchaEnable">
42+
<el-input v-model="loginForm.code" auto-complete="off" placeholder="验证码" style="width: 63%"
43+
@keyup.enter.native="handleLogin">
44+
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon"/>
45+
</el-input>
46+
</el-form-item>
47+
</div>
48+
49+
<!-- 下方的登录按钮 -->
50+
<el-form-item style="width:100%;">
51+
<el-button :loading="loading" size="medium" type="primary" style="width:60%;"
52+
@click.native.prevent="handleLogin">
53+
<span v-if="!loading">同意授权</span>
54+
<span v-else>登 录 中...</span>
55+
</el-button>
56+
<el-button size="medium" style="width:37%">拒绝</el-button>
57+
</el-form-item>
58+
</el-form>
59+
</div>
60+
</div>
61+
</div>
62+
</div>
63+
<!-- footer -->
64+
<div class="footer">
65+
Copyright © 2020-2022 iocoder.cn All Rights Reserved.
66+
</div>
67+
</div>
68+
</template>
69+
70+
<script>
71+
import {getTenantIdByName} from "@/api/system/tenant";
72+
import Cookies from "js-cookie";
73+
import {SystemUserSocialTypeEnum} from "@/utils/constants";
74+
import {getTenantEnable} from "@/utils/ruoyi";
75+
import {authorize} from "@/api/login";
76+
77+
export default {
78+
name: "Login",
79+
data() {
80+
return {
81+
tenantEnable: true,
82+
loginForm: {
83+
tenantName: "芋道源码",
84+
},
85+
LoginRules: {
86+
tenantName: [
87+
{required: true, trigger: "blur", message: "租户不能为空"},
88+
{
89+
validator: (rule, value, callback) => {
90+
// debugger
91+
getTenantIdByName(value).then(res => {
92+
const tenantId = res.data;
93+
if (tenantId && tenantId >= 0) {
94+
// 设置租户
95+
Cookies.set("tenantId", tenantId);
96+
callback();
97+
} else {
98+
callback('租户不存在');
99+
}
100+
});
101+
},
102+
trigger: 'blur'
103+
}
104+
]
105+
},
106+
loading: false,
107+
redirect: undefined,
108+
// 枚举
109+
SysUserSocialTypeEnum: SystemUserSocialTypeEnum,
110+
};
111+
},
112+
created() {
113+
// 租户开关
114+
this.tenantEnable = getTenantEnable();
115+
// 重定向地址
116+
this.redirect = this.$route.query.redirect;
117+
this.getCookie();
118+
},
119+
methods: {
120+
getCookie() {
121+
const tenantName = Cookies.get('tenantName');
122+
this.loginForm = {
123+
tenantName: tenantName === undefined ? this.loginForm.tenantName : tenantName
124+
};
125+
},
126+
handleLogin() {
127+
if (true) {
128+
authorize()
129+
return;
130+
}
131+
this.$refs.loginForm.validate(valid => {
132+
if (valid) {
133+
this.loading = true;
134+
// 发起登陆
135+
console.log("发起登录", this.loginForm);
136+
this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
137+
this.$router.push({path: this.redirect || "/"}).catch(() => {
138+
});
139+
}).catch(() => {
140+
this.loading = false;
141+
this.getCode();
142+
});
143+
}
144+
});
145+
}
146+
}
147+
};
148+
</script>
149+
<style lang="scss" scoped>
150+
@import "~@/assets/styles/login.scss";
151+
.oauth-login {
152+
display: flex;
153+
align-items: cen;
154+
cursor:pointer;
155+
}
156+
.oauth-login-item {
157+
display: flex;
158+
align-items: center;
159+
margin-right: 10px;
160+
}
161+
.oauth-login-item img {
162+
height: 25px;
163+
width: 25px;
164+
}
165+
.oauth-login-item span:hover {
166+
text-decoration: underline red;
167+
color: red;
168+
}
169+
</style>

src/views/system/oauth2/client/index.vue

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -108,23 +108,16 @@
108108
<el-option v-for="redirectUri in form.redirectUris" :key="redirectUri" :label="redirectUri" :value="redirectUri"/>
109109
</el-select>
110110
</el-form-item>
111-
<el-form-item label="是否自动授权" prop="autoApprove">
112-
<el-radio-group v-model="form.autoApprove">
113-
<el-radio :key="true" :label="true">自动登录</el-radio>
114-
<el-radio :key="false" :label="false">手动登录</el-radio>
115-
</el-radio-group>
116-
</el-form-item>
117-
<el-form-item label="授权类型" prop="authorizedGrantTypes">
118-
<el-select v-model="form.authorizedGrantTypes" multiple filterable placeholder="请输入授权类型" style="width: 500px" >
119-
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.SYSTEM_OAUTH2_GRANT_TYPE)"
120-
:key="dict.value" :label="dict.label" :value="dict.value"/>
121-
</el-select>
122-
</el-form-item>
123111
<el-form-item label="授权范围" prop="scopes">
124112
<el-select v-model="form.scopes" multiple filterable allow-create placeholder="请输入授权范围" style="width: 500px" >
125113
<el-option v-for="scope in form.scopes" :key="scope" :label="scope" :value="scope"/>
126114
</el-select>
127115
</el-form-item>
116+
<el-form-item label="自动授权" prop="autoApproveScopes">
117+
<el-select v-model="form.autoApproveScopes" multiple filterable placeholder="请输入授权范围" style="width: 500px" >
118+
<el-option v-for="scope in form.scopes" :key="scope" :label="scope" :value="scope"/>
119+
</el-select>
120+
</el-form-item>
128121
<el-form-item label="权限" prop="authorities">
129122
<el-select v-model="form.authorities" multiple filterable allow-create placeholder="请输入权限" style="width: 500px" >
130123
<el-option v-for="authority in form.authorities" :key="authority" :label="authority" :value="authority"/>
@@ -196,7 +189,6 @@ export default {
196189
accessTokenValiditySeconds: [{ required: true, message: "访问令牌的有效期不能为空", trigger: "blur" }],
197190
refreshTokenValiditySeconds: [{ required: true, message: "刷新令牌的有效期不能为空", trigger: "blur" }],
198191
redirectUris: [{ required: true, message: "可重定向的 URI 地址不能为空", trigger: "blur" }],
199-
autoApprove: [{ required: true, message: "是否自动授权不能为空", trigger: "blur" }],
200192
authorizedGrantTypes: [{ required: true, message: "授权类型不能为空", trigger: "blur" }],
201193
}
202194
};
@@ -235,9 +227,9 @@ export default {
235227
accessTokenValiditySeconds: 30 * 60,
236228
refreshTokenValiditySeconds: 30 * 24 * 60,
237229
redirectUris: [],
238-
autoApprove: true,
239230
authorizedGrantTypes: [],
240231
scopes: [],
232+
autoApproveScopes: [],
241233
authorities: [],
242234
resourceIds: [],
243235
additionalInformation: undefined,

0 commit comments

Comments
 (0)