Commit d322e781998efb424ede22d31793b56ba264a0dd
1 parent
7926ea98
前端 Token、账号、密码等信息,统一使用 LocalStorage 替代 Cookie 存储
Showing
6 changed files
with
159 additions
and
57 deletions
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 | 100 | } |
| 101 | 101 | |
| 102 | 102 | // 创建 Token 令牌,记录登录日志 |
| 103 | - return createTokenAfterLoginSuccess(user, null, LoginLogTypeEnum.LOGIN_SOCIAL); | |
| 103 | + return createTokenAfterLoginSuccess(user, user.getMobile(), LoginLogTypeEnum.LOGIN_SOCIAL); | |
| 104 | 104 | } |
| 105 | 105 | |
| 106 | 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 | 180 | } |
| 181 | 181 | |
| 182 | 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 | 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 | 3 | const AccessTokenKey = 'ACCESS_TOKEN' |
| 4 | 4 | const RefreshTokenKey = 'REFRESH_TOKEN' |
| 5 | 5 | |
| 6 | +// ========== Token 相关 ========== | |
| 7 | + | |
| 6 | 8 | export function getAccessToken() { |
| 7 | - return Cookies.get(AccessTokenKey) | |
| 9 | + return localStorage.getItem(AccessTokenKey) | |
| 8 | 10 | } |
| 9 | 11 | |
| 10 | 12 | export function getRefreshToken() { |
| 11 | - return Cookies.get(RefreshTokenKey) | |
| 13 | + return localStorage.getItem(RefreshTokenKey) | |
| 12 | 14 | } |
| 13 | 15 | |
| 14 | 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 | 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 | 1 | import axios from 'axios' |
| 2 | 2 | import {Message, MessageBox, Notification} from 'element-ui' |
| 3 | 3 | import store from '@/store' |
| 4 | -import {getAccessToken, getRefreshToken, setToken} from '@/utils/auth' | |
| 4 | +import {getAccessToken, getRefreshToken, getTenantId, setToken} from '@/utils/auth' | |
| 5 | 5 | import errorCode from '@/utils/errorCode' |
| 6 | -import Cookies from "js-cookie"; | |
| 7 | 6 | import {getPath, getTenantEnable} from "@/utils/ruoyi"; |
| 8 | 7 | import {refreshToken} from "@/api/login"; |
| 9 | 8 | |
| ... | ... | @@ -21,14 +20,15 @@ let requestList = [] |
| 21 | 20 | // 是否正在刷新中 |
| 22 | 21 | let isRefreshToken = false |
| 23 | 22 | |
| 24 | - | |
| 25 | 23 | axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8' |
| 26 | 24 | // 创建axios实例 |
| 27 | 25 | const service = axios.create({ |
| 28 | 26 | // axios中请求配置有baseURL选项,表示请求URL公共部分 |
| 29 | 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 | 33 | // request拦截器 |
| 34 | 34 | service.interceptors.request.use(config => { |
| ... | ... | @@ -39,7 +39,7 @@ service.interceptors.request.use(config => { |
| 39 | 39 | } |
| 40 | 40 | // 设置租户 |
| 41 | 41 | if (getTenantEnable()) { |
| 42 | - const tenantId = Cookies.get('tenantId'); | |
| 42 | + const tenantId = getTenantId(); | |
| 43 | 43 | if (tenantId) { |
| 44 | 44 | config.headers['tenant-id'] = tenantId; |
| 45 | 45 | } |
| ... | ... | @@ -79,7 +79,6 @@ service.interceptors.response.use(async res => { |
| 79 | 79 | // 获取错误信息 |
| 80 | 80 | const msg = res.data.msg || errorCode[code] || errorCode['default'] |
| 81 | 81 | if (ignoreMsgs.indexOf(msg) !== -1) { // 如果是忽略的错误码,直接返回 msg 异常 |
| 82 | - console.log('132312311'); | |
| 83 | 82 | return Promise.reject(msg) |
| 84 | 83 | } else if (code === 401) { |
| 85 | 84 | // 如果未认证,并且未进行刷新令牌,说明可能是访问令牌过期了 |
| ... | ... | @@ -166,7 +165,7 @@ service.interceptors.response.use(async res => { |
| 166 | 165 | export function getBaseHeader() { |
| 167 | 166 | return { |
| 168 | 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 | 107 | import {getCodeImg, sendSmsCode, socialAuthRedirect} from "@/api/login"; |
| 108 | 108 | import {getTenantIdByName} from "@/api/system/tenant"; |
| 109 | 109 | import Cookies from "js-cookie"; |
| 110 | -import {decrypt, encrypt} from '@/utils/jsencrypt' | |
| 111 | 110 | import {SystemUserSocialTypeEnum} from "@/utils/constants"; |
| 112 | 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 | 122 | export default { |
| 115 | 123 | name: "Login", |
| ... | ... | @@ -161,7 +169,7 @@ export default { |
| 161 | 169 | const tenantId = res.data; |
| 162 | 170 | if (tenantId && tenantId >= 0) { |
| 163 | 171 | // 设置租户 |
| 164 | - Cookies.set("tenantId", tenantId); | |
| 172 | + setTenantId(tenantId) | |
| 165 | 173 | callback(); |
| 166 | 174 | } else { |
| 167 | 175 | callback('租户不存在'); |
| ... | ... | @@ -172,8 +180,6 @@ export default { |
| 172 | 180 | } |
| 173 | 181 | ] |
| 174 | 182 | }, |
| 175 | - | |
| 176 | - | |
| 177 | 183 | loading: false, |
| 178 | 184 | redirect: undefined, |
| 179 | 185 | // 枚举 |
| ... | ... | @@ -213,21 +219,16 @@ export default { |
| 213 | 219 | }); |
| 214 | 220 | }, |
| 215 | 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 | 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 | 234 | handleLogin() { |
| ... | ... | @@ -236,18 +237,18 @@ export default { |
| 236 | 237 | this.loading = true; |
| 237 | 238 | // 设置 Cookie |
| 238 | 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 | 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 | 252 | this.$store.dispatch(this.loginForm.loginType === "sms" ? "SmsLogin" : "Login", this.loginForm).then(() => { |
| 252 | 253 | this.$router.push({path: this.redirect || "/"}).catch(() => { |
| 253 | 254 | }); | ... | ... |
yudao-ui-admin/src/views/socialLogin.vue
| ... | ... | @@ -19,7 +19,7 @@ |
| 19 | 19 | </el-tab-pane> |
| 20 | 20 | </el-tabs> |
| 21 | 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 | 24 | <el-form-item prop="username"> |
| 25 | 25 | <el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号"> |
| ... | ... | @@ -65,16 +65,28 @@ |
| 65 | 65 | <script> |
| 66 | 66 | import Cookies from "js-cookie"; |
| 67 | 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 | 79 | export default { |
| 70 | 80 | name: "ThirdLogin", |
| 71 | 81 | data() { |
| 72 | 82 | return { |
| 83 | + codeUrl: "", | |
| 84 | + captchaEnable: true, | |
| 73 | 85 | loginForm: { |
| 74 | 86 | loginType: "uname", |
| 75 | 87 | username: "admin", |
| 76 | 88 | password: "admin123", |
| 77 | - rememberMe: false, // TODO 芋艿:后面看情况,去掉这块 | |
| 89 | + rememberMe: false, | |
| 78 | 90 | }, |
| 79 | 91 | loginRules: { |
| 80 | 92 | username: [ |
| ... | ... | @@ -104,6 +116,7 @@ export default { |
| 104 | 116 | this.getCookie(); |
| 105 | 117 | // 重定向地址 |
| 106 | 118 | this.redirect = this.$route.query.redirect; |
| 119 | + this.getCode(); | |
| 107 | 120 | // 社交登录相关 |
| 108 | 121 | this.type = this.$route.query.type; |
| 109 | 122 | this.code = this.$route.query.code; |
| ... | ... | @@ -119,16 +132,30 @@ export default { |
| 119 | 132 | }); |
| 120 | 133 | }, |
| 121 | 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 | 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 | 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 | 161 | handleLogin() { |
| ... | ... | @@ -136,11 +163,12 @@ export default { |
| 136 | 163 | if (valid) { |
| 137 | 164 | this.loading = true; |
| 138 | 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 | 169 | } else { |
| 142 | - Cookies.remove("username"); | |
| 143 | - Cookies.remove("password"); | |
| 170 | + removeUsername() | |
| 171 | + removePassword() | |
| 144 | 172 | } |
| 145 | 173 | this.$store.dispatch("SocialLogin2", { |
| 146 | 174 | code: this.code, | ... | ... |