Commit d322e781998efb424ede22d31793b56ba264a0dd

Authored by YunaiV
1 parent 7926ea98

前端 Token、账号、密码等信息,统一使用 LocalStorage 替代 Cookie 存储

yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
@@ -100,7 +100,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -100,7 +100,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
100 } 100 }
101 101
102 // 创建 Token 令牌,记录登录日志 102 // 创建 Token 令牌,记录登录日志
103 - return createTokenAfterLoginSuccess(user, null, LoginLogTypeEnum.LOGIN_SOCIAL); 103 + return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL);
104 } 104 }
105 105
106 @Override 106 @Override
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
@@ -180,7 +180,7 @@ public class AdminAuthServiceImpl implements AdminAuthService { @@ -180,7 +180,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
180 } 180 }
181 181
182 // 创建 Token 令牌,记录登录日志 182 // 创建 Token 令牌,记录登录日志
183 - return createTokenAfterLoginSuccess(user.getId(), null, LoginLogTypeEnum.LOGIN_SOCIAL); 183 + return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
184 } 184 }
185 185
186 @Override 186 @Override
yudao-ui-admin/src/utils/auth.js
1 -import Cookies from 'js-cookie' 1 +import {decrypt, encrypt} from "@/utils/jsencrypt";
2 2
3 const AccessTokenKey = 'ACCESS_TOKEN' 3 const AccessTokenKey = 'ACCESS_TOKEN'
4 const RefreshTokenKey = 'REFRESH_TOKEN' 4 const RefreshTokenKey = 'REFRESH_TOKEN'
5 5
  6 +// ========== Token 相关 ==========
  7 +
6 export function getAccessToken() { 8 export function getAccessToken() {
7 - return Cookies.get(AccessTokenKey) 9 + return localStorage.getItem(AccessTokenKey)
8 } 10 }
9 11
10 export function getRefreshToken() { 12 export function getRefreshToken() {
11 - return Cookies.get(RefreshTokenKey) 13 + return localStorage.getItem(RefreshTokenKey)
12 } 14 }
13 15
14 export function setToken(token) { 16 export function setToken(token) {
15 - Cookies.set(AccessTokenKey, token.accessToken)  
16 - Cookies.set(RefreshTokenKey, token.refreshToken) 17 + localStorage.setItem(AccessTokenKey, token.accessToken)
  18 + localStorage.setItem(RefreshTokenKey, token.refreshToken)
17 } 19 }
18 20
19 export function removeToken() { 21 export function removeToken() {
20 - Cookies.remove(AccessTokenKey)  
21 - Cookies.remove(RefreshTokenKey) 22 + localStorage.removeItem(AccessTokenKey)
  23 + localStorage.removeItem(RefreshTokenKey)
  24 +}
  25 +
  26 +// ========== 账号相关 ==========
  27 +
  28 +const UsernameKey = 'USERNAME'
  29 +const PasswordKey = 'PASSWORD'
  30 +const RememberMeKey = 'REMEMBER_ME'
  31 +
  32 +export function getUsername() {
  33 + return localStorage.getItem(UsernameKey)
  34 +}
  35 +
  36 +export function setUsername(username) {
  37 + localStorage.setItem(UsernameKey, username)
  38 +}
  39 +
  40 +export function removeUsername() {
  41 + localStorage.removeItem(UsernameKey)
  42 +}
  43 +
  44 +export function getPassword() {
  45 + const password = localStorage.getItem(PasswordKey)
  46 + return password ? decrypt(password) : undefined
  47 +}
  48 +
  49 +export function setPassword(password) {
  50 + localStorage.setItem(PasswordKey, encrypt(password))
  51 +}
  52 +
  53 +export function removePassword() {
  54 + localStorage.removeItem(PasswordKey)
  55 +}
  56 +
  57 +export function getRememberMe() {
  58 + return localStorage.getItem(RememberMeKey) === 'true'
  59 +}
  60 +
  61 +export function setRememberMe(rememberMe) {
  62 + localStorage.setItem(RememberMeKey, rememberMe)
  63 +}
  64 +
  65 +export function removeRememberMe() {
  66 + localStorage.removeItem(RememberMeKey)
  67 +}
  68 +
  69 +// ========== 租户相关 ==========
  70 +
  71 +const TenantIdKey = 'TENANT_ID'
  72 +const TenantNameKey = 'TENANT_NAME'
  73 +
  74 +export function getTenantName() {
  75 + return localStorage.getItem(TenantNameKey)
  76 +}
  77 +
  78 +export function setTenantName(username) {
  79 + localStorage.setItem(TenantNameKey, username)
  80 +}
  81 +
  82 +export function removeTenantName() {
  83 + localStorage.removeItem(TenantNameKey)
  84 +}
  85 +
  86 +export function getTenantId() {
  87 + return localStorage.getItem(TenantIdKey)
  88 +}
  89 +
  90 +export function setTenantId(username) {
  91 + localStorage.setItem(TenantIdKey, username)
  92 +}
  93 +
  94 +export function removeTenantId() {
  95 + localStorage.removeItem(TenantIdKey)
22 } 96 }
yudao-ui-admin/src/utils/request.js
1 import axios from 'axios' 1 import axios from 'axios'
2 import {Message, MessageBox, Notification} from 'element-ui' 2 import {Message, MessageBox, Notification} from 'element-ui'
3 import store from '@/store' 3 import store from '@/store'
4 -import {getAccessToken, getRefreshToken, setToken} from '@/utils/auth' 4 +import {getAccessToken, getRefreshToken, getTenantId, setToken} from '@/utils/auth'
5 import errorCode from '@/utils/errorCode' 5 import errorCode from '@/utils/errorCode'
6 -import Cookies from "js-cookie";  
7 import {getPath, getTenantEnable} from "@/utils/ruoyi"; 6 import {getPath, getTenantEnable} from "@/utils/ruoyi";
8 import {refreshToken} from "@/api/login"; 7 import {refreshToken} from "@/api/login";
9 8
@@ -21,14 +20,15 @@ let requestList = [] @@ -21,14 +20,15 @@ let requestList = []
21 // 是否正在刷新中 20 // 是否正在刷新中
22 let isRefreshToken = false 21 let isRefreshToken = false
23 22
24 -  
25 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' 23 axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
26 // 创建axios实例 24 // 创建axios实例
27 const service = axios.create({ 25 const service = axios.create({
28 // axios中请求配置有baseURL选项,表示请求URL公共部分 26 // axios中请求配置有baseURL选项,表示请求URL公共部分
29 baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/ 27 baseURL: process.env.VUE_APP_BASE_API + '/admin-api/', // 此处的 /admin-api/ 地址,原因是后端的基础路径为 /admin-api/
30 // 超时 28 // 超时
31 - timeout: 30000 29 + timeout: 30000,
  30 + // 禁用 Cookie 等信息
  31 + withCredentials: false,
32 }) 32 })
33 // request拦截器 33 // request拦截器
34 service.interceptors.request.use(config => { 34 service.interceptors.request.use(config => {
@@ -39,7 +39,7 @@ service.interceptors.request.use(config => { @@ -39,7 +39,7 @@ service.interceptors.request.use(config => {
39 } 39 }
40 // 设置租户 40 // 设置租户
41 if (getTenantEnable()) { 41 if (getTenantEnable()) {
42 - const tenantId = Cookies.get('tenantId'); 42 + const tenantId = getTenantId();
43 if (tenantId) { 43 if (tenantId) {
44 config.headers['tenant-id'] = tenantId; 44 config.headers['tenant-id'] = tenantId;
45 } 45 }
@@ -79,7 +79,6 @@ service.interceptors.response.use(async res => { @@ -79,7 +79,6 @@ service.interceptors.response.use(async res => {
79 // 获取错误信息 79 // 获取错误信息
80 const msg = res.data.msg || errorCode[code] || errorCode['default'] 80 const msg = res.data.msg || errorCode[code] || errorCode['default']
81 if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常 81 if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常
82 - console.log('132312311');  
83 return Promise.reject(msg) 82 return Promise.reject(msg)
84 } else if (code === 401) { 83 } else if (code === 401) {
85 // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 84 // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了
@@ -166,7 +165,7 @@ service.interceptors.response.use(async res => { @@ -166,7 +165,7 @@ service.interceptors.response.use(async res => {
166 export function getBaseHeader() { 165 export function getBaseHeader() {
167 return { 166 return {
168 'Authorization': "Bearer " + getAccessToken(), 167 'Authorization': "Bearer " + getAccessToken(),
169 - 'tenant-id': Cookies.get('tenantId'), 168 + 'tenant-id': getTenantId(),
170 } 169 }
171 } 170 }
172 171
yudao-ui-admin/src/views/login.vue
@@ -107,9 +107,17 @@ @@ -107,9 +107,17 @@
107 import {getCodeImg, sendSmsCode, socialAuthRedirect} from "@/api/login"; 107 import {getCodeImg, sendSmsCode, socialAuthRedirect} from "@/api/login";
108 import {getTenantIdByName} from "@/api/system/tenant"; 108 import {getTenantIdByName} from "@/api/system/tenant";
109 import Cookies from "js-cookie"; 109 import Cookies from "js-cookie";
110 -import {decrypt, encrypt} from '@/utils/jsencrypt'  
111 import {SystemUserSocialTypeEnum} from "@/utils/constants"; 110 import {SystemUserSocialTypeEnum} from "@/utils/constants";
112 import {getTenantEnable} from "@/utils/ruoyi"; 111 import {getTenantEnable} from "@/utils/ruoyi";
  112 +import {
  113 + getPassword,
  114 + getRememberMe, getTenantName,
  115 + getUsername,
  116 + removePassword, removeRememberMe, removeTenantName,
  117 + removeUsername,
  118 + setPassword, setRememberMe, setTenantId, setTenantName,
  119 + setUsername
  120 +} from "@/utils/auth";
113 121
114 export default { 122 export default {
115 name: "Login", 123 name: "Login",
@@ -161,7 +169,7 @@ export default { @@ -161,7 +169,7 @@ export default {
161 const tenantId = res.data; 169 const tenantId = res.data;
162 if (tenantId && tenantId >= 0) { 170 if (tenantId && tenantId >= 0) {
163 // 设置租户 171 // 设置租户
164 - Cookies.set("tenantId", tenantId); 172 + setTenantId(tenantId)
165 callback(); 173 callback();
166 } else { 174 } else {
167 callback('租户不存在'); 175 callback('租户不存在');
@@ -172,8 +180,6 @@ export default { @@ -172,8 +180,6 @@ export default {
172 } 180 }
173 ] 181 ]
174 }, 182 },
175 -  
176 -  
177 loading: false, 183 loading: false,
178 redirect: undefined, 184 redirect: undefined,
179 // 枚举 185 // 枚举
@@ -213,21 +219,16 @@ export default { @@ -213,21 +219,16 @@ export default {
213 }); 219 });
214 }, 220 },
215 getCookie() { 221 getCookie() {
216 - const username = Cookies.get("username");  
217 - const password = Cookies.get("password");  
218 - const rememberMe = Cookies.get('rememberMe')  
219 - const tenantName = Cookies.get('tenantName');  
220 - const mobile = Cookies.get('mobile');  
221 - const mobileCode = Cookies.get('mobileCode');  
222 - const loginType = Cookies.get('loginType'); 222 + const username = getUsername();
  223 + const password = getPassword();
  224 + const rememberMe = getRememberMe();
  225 + const tenantName = getTenantName();
223 this.loginForm = { 226 this.loginForm = {
224 - username: username === undefined ? this.loginForm.username : username,  
225 - password: password === undefined ? this.loginForm.password : decrypt(password),  
226 - rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),  
227 - tenantName: tenantName === undefined ? this.loginForm.tenantName : tenantName,  
228 - mobile: mobile === undefined ? this.loginForm.mobile : mobile,  
229 - mobileCode: mobileCode === undefined ? this.loginForm.mobileCode : mobileCode,  
230 - loginType: loginType === undefined ? this.loginForm.loginType : loginType, 227 + ...this.loginForm,
  228 + username: username ? username : this.loginForm.username,
  229 + password: password ? password : this.loginForm.password,
  230 + rememberMe: rememberMe ? getRememberMe() : false,
  231 + tenantName: tenantName ? tenantName : this.loginForm.tenantName,
231 }; 232 };
232 }, 233 },
233 handleLogin() { 234 handleLogin() {
@@ -236,18 +237,18 @@ export default { @@ -236,18 +237,18 @@ export default {
236 this.loading = true; 237 this.loading = true;
237 // 设置 Cookie 238 // 设置 Cookie
238 if (this.loginForm.rememberMe) { 239 if (this.loginForm.rememberMe) {
239 - Cookies.set("username", this.loginForm.username, {expires: 30});  
240 - Cookies.set("password", encrypt(this.loginForm.password), {expires: 30});  
241 - Cookies.set('rememberMe', this.loginForm.rememberMe, {expires: 30});  
242 - Cookies.set('tenantName', this.loginForm.tenantName, {expires: 30}); 240 + setUsername(this.loginForm.username)
  241 + setPassword(this.loginForm.password)
  242 + setRememberMe(this.loginForm.rememberMe)
  243 + setTenantName(this.loginForm.tenantName)
243 } else { 244 } else {
244 - Cookies.remove("username");  
245 - Cookies.remove("password");  
246 - Cookies.remove('rememberMe');  
247 - Cookies.remove('tenantName'); 245 + removeUsername()
  246 + removePassword()
  247 + removeRememberMe()
  248 + removeTenantName()
248 } 249 }
249 // 发起登陆 250 // 发起登陆
250 - console.log("发起登录", this.loginForm); 251 + // console.log("发起登录", this.loginForm);
251 this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => { 252 this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => {
252 this.$router.push({path: this.redirect || "/"}).catch(() => { 253 this.$router.push({path: this.redirect || "/"}).catch(() => {
253 }); 254 });
yudao-ui-admin/src/views/socialLogin.vue
@@ -19,7 +19,7 @@ @@ -19,7 +19,7 @@
19 </el-tab-pane> 19 </el-tab-pane>
20 </el-tabs> 20 </el-tabs>
21 <div> 21 <div>
22 - <el-form ref="loginForm" :model="loginForm" :rules="LoginRules" class="login-form"> 22 + <el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
23 <!-- 账号密码登录 --> 23 <!-- 账号密码登录 -->
24 <el-form-item prop="username"> 24 <el-form-item prop="username">
25 <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> 25 <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
@@ -65,16 +65,28 @@ @@ -65,16 +65,28 @@
65 <script> 65 <script>
66 import Cookies from "js-cookie"; 66 import Cookies from "js-cookie";
67 import { encrypt, decrypt } from '@/utils/jsencrypt' 67 import { encrypt, decrypt } from '@/utils/jsencrypt'
  68 +import {
  69 + getPassword, getRememberMe,
  70 + getUsername,
  71 + removePassword,
  72 + removeUsername,
  73 + setPassword,
  74 + setRememberMe,
  75 + setUsername
  76 +} from "@/utils/auth";
  77 +import {getCodeImg} from "@/api/login";
68 78
69 export default { 79 export default {
70 name: "ThirdLogin", 80 name: "ThirdLogin",
71 data() { 81 data() {
72 return { 82 return {
  83 + codeUrl: "",
  84 + captchaEnable: true,
73 loginForm: { 85 loginForm: {
74 loginType: "uname", 86 loginType: "uname",
75 username: "admin", 87 username: "admin",
76 password: "admin123", 88 password: "admin123",
77 - rememberMe: false, // TODO 芋艿:后面看情况,去掉这块 89 + rememberMe: false,
78 }, 90 },
79 loginRules: { 91 loginRules: {
80 username: [ 92 username: [
@@ -104,6 +116,7 @@ export default { @@ -104,6 +116,7 @@ export default {
104 this.getCookie(); 116 this.getCookie();
105 // 重定向地址 117 // 重定向地址
106 this.redirect = this.$route.query.redirect; 118 this.redirect = this.$route.query.redirect;
  119 + this.getCode();
107 // 社交登录相关 120 // 社交登录相关
108 this.type = this.$route.query.type; 121 this.type = this.$route.query.type;
109 this.code = this.$route.query.code; 122 this.code = this.$route.query.code;
@@ -119,16 +132,30 @@ export default { @@ -119,16 +132,30 @@ export default {
119 }); 132 });
120 }, 133 },
121 methods: { 134 methods: {
  135 + getCode() {
  136 + // 只有开启的状态,才加载验证码。默认开启
  137 + if (!this.captchaEnable) {
  138 + return;
  139 + }
  140 + // 请求远程,获得验证码
  141 + getCodeImg().then(res => {
  142 + res = res.data;
  143 + this.captchaEnable = res.enable;
  144 + if (this.captchaEnable) {
  145 + this.codeUrl = "data:image/gif;base64," + res.img;
  146 + this.loginForm.uuid = res.uuid;
  147 + }
  148 + });
  149 + },
122 getCookie() { 150 getCookie() {
123 - const username = Cookies.get("username");  
124 - const password = Cookies.get("password");  
125 - const rememberMe = Cookies.get('rememberMe')  
126 - const loginType = Cookies.get('loginType'); 151 + const username = getUsername();
  152 + const password = getPassword();
  153 + const rememberMe = getRememberMe();
127 this.loginForm = { 154 this.loginForm = {
128 - username: username === undefined ? this.loginForm.username : username,  
129 - password: password === undefined ? this.loginForm.password : decrypt(password),  
130 - rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),  
131 - loginType: loginType === undefined ? this.loginForm.loginType : loginType, 155 + username: username ? username : this.loginForm.username,
  156 + password: password ? password : this.loginForm.password,
  157 + rememberMe: rememberMe ? getRememberMe() : false,
  158 + loginType: this.loginForm.loginType,
132 }; 159 };
133 }, 160 },
134 handleLogin() { 161 handleLogin() {
@@ -136,11 +163,12 @@ export default { @@ -136,11 +163,12 @@ export default {
136 if (valid) { 163 if (valid) {
137 this.loading = true; 164 this.loading = true;
138 if (this.loginForm.rememberMe) { 165 if (this.loginForm.rememberMe) {
139 - Cookies.set("username", this.loginForm.username, { expires: 30 });  
140 - Cookies.set("password", encrypt(this.loginForm.password), { expires: 30 }); 166 + setUsername(this.loginForm.username)
  167 + setPassword(this.loginForm.password)
  168 + setRememberMe(this.loginForm.rememberMe)
141 } else { 169 } else {
142 - Cookies.remove("username");  
143 - Cookies.remove("password"); 170 + removeUsername()
  171 + removePassword()
144 } 172 }
145 this.$store.dispatch("SocialLogin2", { 173 this.$store.dispatch("SocialLogin2", {
146 code: this.code, 174 code: this.code,