升级V3.2.6指南
从V3.2.5版本与V3.2.6版本相关步骤,相关数据库脚本更新如下:
1、数据库
无数据库脚本更新。
2、后端升级
2.1、waf-parent依赖升级
后端只要将pom.xml中引用waf-parent版本改为3.2.6即可,启动后测试功能是否正常
- 依赖更新
<parent>
<groupId>com.wiseda.waf</groupId>
<artifactId>waf-parent</artifactId>
<version>3.2.6</version>
</parent>
- WAF框架单点配置
如需要实现WAF框架应用的单点参照如下配置:
MAIN_SERVER_REST_URL:认证应用的服务地址(认证应用只要是基于waf框架,不需要一定要升级到3.2.6;单点集成应用版本需>=
3.2.6),这里注意本地调试认证应用不要采用localhost,可以是本地的IP地址,不然会忽略认证。MAIN_CONTEXT_PATH:认证应用上下文+版本号
waf:
api:
# api应用配置
list:
main:
# url地址配置(可以为服务名+端口 K8S配置)
server-rest-url: ${MAIN_SERVER_REST_URL:http://dmm-server-service:8081}
# 主应用上下文路径
context-path: ${MAIN_CONTEXT_PATH:/dmm-server/v2/waf}
3、前端升级
如需要实现WAF框架应用Vue2、Vue3的单点参照如下配置,细节处理可以自行完善,如应用超时后,应该跳转到主应用进行重定向该集成应用,或自行优化该处理逻辑
# 单点地址示例,在URL上添加ssoToken参数值
http://localhost:8800/waf-web?ssoToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJjbGltTmFtZSI6ImlnRnJUc2Nla0JBbjVWUjI4Q3BtL3c9PSIsImV4cCI6MTc1NzU3MTA4MH0.n5frlqj2-_2oWm7dwR1FVWu2jK5GCNwows1iCln3zqE
3.1、Vue2单点配置
- 文件
src/api/user.js,添加一个ssoTokenLoginAPI接口,采用URL上带入token进行认证
export function ssoTokenLogin(ssoToken) {
return request({
url: `${prefix}/ssoLogin?token=${ssoToken}`, method: 'post'
})
}
- 文件
src/store/modules/user.ts, 在actions中添加ssoTokenLogin,注意如果有其他逻辑,自行添加,保持与ssoLogin()中逻辑一致。
actions: {
......
// 同框架token单点
ssoTokenLogin({ commit, dispatch, state }, ssoToken) {
return new Promise((resolve, reject) => {
ssoTokenLogin(ssoToken).then(response => {
// 清除tagsView缓存, 避免切换用户时, tags页签持续存在
dispatch('tagsView/delAllViews', {}, { root: true }).then(res => { }).catch(() => { })
const { data } = response
commit('SET_CUSTOM_INFO', data)
if (data.token) {
commit('SET_TOKEN', data.token)
Vue.ls.set(ACCESS_TOKEN, data.token, 24 * 60 * 60 * 1000)
}
if (data.showVerifyCode) {
commit('SET_SHOW_VERIFY_CODE', data.showVerifyCode)
}
Vue.ls.set(AUTH_HEADER_CODE, data.authHeaderCode, 24 * 60 * 60 * 1000)
resolve(data)
}).catch(error => {
reject(error)
})
})
}
}
文件目录:src/permission.js ,
router.beforeEach(async (to, from, next) => {
const userToken = to.query.token || Cookies.get(AUTHORIZATION_HEADER)
// =========================单点登录认证代码======================================//
// 同WAF框架单点token
const ssoToken = to.query.ssoToken
if (ssoToken) {
// 检查token是否为合法有效token(同WAF框架互信token:since 3.2.6)
store.dispatch('user/ssoTokenLogin', ssoToken).then(res => {
if (res.token) {
Vue.ls.set(ACCESS_TOKEN, res.token, 24 * 60 * 60 * 1000)
hasToken(to, from, next)
} else {
// 获取token失败,执行后续登录
hasToken(to, from, next)
}
}).catch((e) => { hasToken(to, from, next) })
// =========================单点登录认证代码======================================//
} else if (userToken) {
// 扫码登录成功后写入到cookie中的token,将其写入local storage token并移除cookie
Vue.ls.set(ACCESS_TOKEN, userToken, 24 * 60 * 60 * 1000)
Cookies.remove(AUTHORIZATION_HEADER)
hasToken(to, from, next)
} else {
......
}
3.2、Vue3单点配置
- 文件
src/api/user.ts,添加一个ssoTokenLoginAPI接口,采用URL上带入token进行认证
static async ssoTokenLogin(ssoToken: string): Promise<ResponseType> {
return http.request({
url: `${prefix}/ssoLogin?token=${ssoToken}`,
method: 'post'
})
}
- 文件
src/store/modules/user.ts, 在actions中添加ssoTokenLogin,注意如果有其他逻辑,自行添加,保持与ssoLogin()中逻辑一致。
actions: {
......
// 同框架token单点
ssoTokenLogin(ssoToken: string) {
return new Promise((resolve, reject) => {
UserService.ssoTokenLogin(ssoToken).then(response => {
const { data } = response
this.setCustomInfo(data)
if (data.token) {
this.setToken(data.token)
storage.set(ACCESS_TOKEN, data.token, 24 * 60 * 60 * 1000)
}
if (data.showVerifyCode) {
this.SET_SHOW_VERIFY_CODE(data.showVerifyCode)
}
storage.set(AUTH_HEADER_CODE, data.authHeaderCode, 24 * 60 * 60 * 1000)
resolve(data)
})
.catch(error => {
reject(error)
})
})
}
}
- 文件
src/permission.js,这里重新定义一个URL参数为ssoToken来单独判断,并调用sso接口,其他代码逻辑保持一致,注意自己的业务,如有区别自行调整。
router.beforeEach(async(to, from) => {
....
const userToken = to.query.token || Cookies.get(AUTHORIZATION_HEADER)
// =========================单点登录认证代码======================================//
// 同WAF框架单点token
const ssoToken: string = to.query.ssoToken as string
if (ssoToken) {
// 执行单点验证(如同WAF框架的单点)
return await userStore.ssoTokenLogin(ssoToken).then(async res => {
if ((res as any).token) {
storage.set(ACCESS_TOKEN, (res as any).token, 24 * 60 * 60 * 1000)
return await hasToken(to, from)
} else {
// 获取token失败,执行后续登录
return await hasToken(to, from)
}
}).catch((e) => { hasToken(to, from) })
// =========================单点登录认证代码======================================//
} else if (userToken) {
// 扫码登录成功后写入到cookie中的token,将其写入local storage token并移除cookie
storage.set(ACCESS_TOKEN, userToken, 24 * 60 * 60 * 1000)
Cookies.remove(AUTHORIZATION_HEADER)
return await hasToken(to, from)
} else {
......
}
}
