forked from github/dataease
feat: 登录
This commit is contained in:
parent
97960a6f0b
commit
9c477fb463
@ -35,12 +35,12 @@ public class UserApi {
|
|||||||
throw new RuntimeException("没有该用户!");
|
throw new RuntimeException("没有该用户!");
|
||||||
}
|
}
|
||||||
String pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, password);
|
String pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, password);
|
||||||
String realpwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, realPwd);
|
String realPass = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, realPwd);
|
||||||
if (!StrUtil.equals(pwd, realpwd)){
|
if (!StrUtil.equals(pwd, realPass)){
|
||||||
throw new RuntimeException("密码错误!");
|
throw new RuntimeException("密码错误!");
|
||||||
}
|
}
|
||||||
Map<String,Object> result = new HashMap<>();
|
Map<String,Object> result = new HashMap<>();
|
||||||
result.put("token", JWTUtil.sign(username, realpwd));
|
result.put("token", JWTUtil.sign(username, realPass));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package com.fit2cloud.commons.auth.config;
|
|||||||
import com.fit2cloud.commons.auth.bean.UserBean;
|
import com.fit2cloud.commons.auth.bean.UserBean;
|
||||||
import com.fit2cloud.commons.auth.service.UserService;
|
import com.fit2cloud.commons.auth.service.UserService;
|
||||||
import com.fit2cloud.commons.auth.util.JWTUtil;
|
import com.fit2cloud.commons.auth.util.JWTUtil;
|
||||||
|
import com.fit2cloud.commons.auth.util.RsaUtil;
|
||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
import org.apache.shiro.authc.AuthenticationException;
|
import org.apache.shiro.authc.AuthenticationException;
|
||||||
@ -67,8 +68,13 @@ public class F2cRealm extends AuthorizingRealm {
|
|||||||
if (userBean == null) {
|
if (userBean == null) {
|
||||||
throw new AuthenticationException("User didn't existed!");
|
throw new AuthenticationException("User didn't existed!");
|
||||||
}
|
}
|
||||||
|
String pwd = null;
|
||||||
if (! JWTUtil.verify(token, username, userBean.getPassword())) {
|
try {
|
||||||
|
pwd = RsaUtil.decryptByPrivateKey(RsaProperties.privateKey, userBean.getPassword());
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
if (! JWTUtil.verify(token, username, pwd)) {
|
||||||
throw new AuthenticationException("Username or password error");
|
throw new AuthenticationException("Username or password error");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ public interface ExtUserMapper {
|
|||||||
@Select("select password from sys_user where username = #{userName,jdbcType=VARCHAR} ")
|
@Select("select password from sys_user where username = #{userName,jdbcType=VARCHAR} ")
|
||||||
String getPassword(String userName);
|
String getPassword(String userName);
|
||||||
|
|
||||||
@Select("select role_id from sys_users_roles where username = #{userName,jdbcType=VARCHAR} ")
|
@Select("select role_id from sys_users_roles sur left join sys_user su on su.user_id = sur.user_id where su.username = #{userName,jdbcType=VARCHAR} ")
|
||||||
List<String> getRole(String userName);
|
List<String> getRole(String userName);
|
||||||
|
|
||||||
@Select({
|
@Select({
|
||||||
@ -23,7 +23,8 @@ public interface ExtUserMapper {
|
|||||||
"from sys_users_roles sur ",
|
"from sys_users_roles sur ",
|
||||||
"LEFT JOIN sys_roles_menus srm on srm.role_id = sur.role_id ",
|
"LEFT JOIN sys_roles_menus srm on srm.role_id = sur.role_id ",
|
||||||
"LEFT JOIN sys_menu sm on sm.menu_id = srm.menu_id ",
|
"LEFT JOIN sys_menu sm on sm.menu_id = srm.menu_id ",
|
||||||
"where sur.username = #{userName,jdbcType=VARCHAR} "
|
"LEFT JOIN sys_user su on su.user_id = sur.user_id ",
|
||||||
|
"where su.username = #{userName,jdbcType=VARCHAR} "
|
||||||
})
|
})
|
||||||
List<String> getPermission(String userName);
|
List<String> getPermission(String userName);
|
||||||
|
|
||||||
|
@ -2,4 +2,4 @@
|
|||||||
ENV = 'development'
|
ENV = 'development'
|
||||||
|
|
||||||
# base api, e.g., '/dev'
|
# base api, e.g., '/dev'
|
||||||
VUE_APP_BASE_API = ''
|
VUE_APP_BASE_API = 'http://localhost:8081/'
|
||||||
|
@ -41,7 +41,7 @@ const users = {
|
|||||||
module.exports = [
|
module.exports = [
|
||||||
// user login
|
// user login
|
||||||
{
|
{
|
||||||
url: '/samples/user-token/login',
|
url: '/samples/user/login',
|
||||||
type: 'post',
|
type: 'post',
|
||||||
response: config => {
|
response: config => {
|
||||||
const {username} = config.body
|
const {username} = config.body
|
||||||
@ -57,7 +57,7 @@ module.exports = [
|
|||||||
|
|
||||||
// get user info
|
// get user info
|
||||||
{
|
{
|
||||||
url: '/samples/user-token/info',
|
url: '/samples/user/info',
|
||||||
type: 'get',
|
type: 'get',
|
||||||
response: (config) => {
|
response: (config) => {
|
||||||
let token = config.headers[TOKEN_KEY]
|
let token = config.headers[TOKEN_KEY]
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
/* 前后端分离的登录方式 */
|
|
||||||
import {get, post, put} from "@/plugins/request"
|
|
||||||
|
|
||||||
export function login(data) {
|
|
||||||
return post("/login", data)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function logout() {
|
|
||||||
return post("/logout")
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getCurrentUser() {
|
|
||||||
return get("/info")
|
|
||||||
}
|
|
||||||
|
|
||||||
export function updateInfo(data) {
|
|
||||||
return put("/update", data)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,24 +1,20 @@
|
|||||||
/* 前后端不分离的登录方式 */
|
/* 前后端分离的登录方式 */
|
||||||
import {get, post, put} from "@/plugins/request"
|
import {get, post, put} from "@/plugins/request"
|
||||||
|
|
||||||
export function login(data) {
|
export function login(data) {
|
||||||
return post("/samples/user/login", data)
|
return post("/login", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function logout() {
|
export function logout() {
|
||||||
return post("/samples/user/logout")
|
return post("/logout")
|
||||||
}
|
|
||||||
|
|
||||||
export function isLogin() {
|
|
||||||
return get("/samples/user/is-login")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getCurrentUser() {
|
export function getCurrentUser() {
|
||||||
return get("/samples/user/current")
|
return get("/info")
|
||||||
}
|
}
|
||||||
|
|
||||||
export function updateInfo(id, data) {
|
export function updateInfo(data) {
|
||||||
return put("/samples/user/info/update/" + id, data)
|
return put("/update", data)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,6 +43,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import { encrypt } from '@/utils/rsaEncrypt'
|
||||||
export default {
|
export default {
|
||||||
name: "Login",
|
name: "Login",
|
||||||
data() {
|
data() {
|
||||||
@ -96,8 +97,13 @@ export default {
|
|||||||
submit(form) {
|
submit(form) {
|
||||||
this.$refs[form].validate((valid) => {
|
this.$refs[form].validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
|
const user = {
|
||||||
|
username: this.form.username,
|
||||||
|
password: this.form.password
|
||||||
|
}
|
||||||
|
user.password = encrypt(user.password)
|
||||||
this.loading = true;
|
this.loading = true;
|
||||||
this.$store.dispatch('user/login', this.form).then(() => {
|
this.$store.dispatch('user/login', user).then(() => {
|
||||||
this.$router.push({path: this.redirect || '/', query: this.otherQuery})
|
this.$router.push({path: this.redirect || '/', query: this.otherQuery})
|
||||||
this.loading = false
|
this.loading = false
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
|
@ -14,12 +14,12 @@ const generateRoutes = async (to, from, next) => {
|
|||||||
next()
|
next()
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
const {roles} = await store.dispatch('user-token/getCurrentUser')
|
const {roles} = await store.dispatch('user/getCurrentUser')
|
||||||
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
|
const accessRoutes = await store.dispatch('permission/generateRoutes', roles)
|
||||||
router.addRoutes(accessRoutes)
|
router.addRoutes(accessRoutes)
|
||||||
next({...to, replace: true})
|
next({...to, replace: true})
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await store.dispatch('user-token/logout')
|
await store.dispatch('user/logout')
|
||||||
next(`/login?redirect=${to.path}`)
|
next(`/login?redirect=${to.path}`)
|
||||||
NProgress.done()
|
NProgress.done()
|
||||||
}
|
}
|
||||||
@ -29,7 +29,6 @@ const generateRoutes = async (to, from, next) => {
|
|||||||
// 路由前置钩子,根据实际需求修改
|
// 路由前置钩子,根据实际需求修改
|
||||||
router.beforeEach(async (to, from, next) => {
|
router.beforeEach(async (to, from, next) => {
|
||||||
NProgress.start()
|
NProgress.start()
|
||||||
// const isLogin = await store.dispatch('user-token/isLogin') // 或者user-token/isLogin
|
|
||||||
const hasToken = getToken()
|
const hasToken = getToken()
|
||||||
if (hasToken) {
|
if (hasToken) {
|
||||||
if (to.path === '/login') {
|
if (to.path === '/login') {
|
||||||
|
@ -6,5 +6,6 @@ const getters = {
|
|||||||
roles: state => state.user.roles,
|
roles: state => state.user.roles,
|
||||||
permission_routes: state => state.permission.routes,
|
permission_routes: state => state.permission.routes,
|
||||||
license: state => state.license,
|
license: state => state.license,
|
||||||
|
token: state => state.user.token,
|
||||||
}
|
}
|
||||||
export default getters
|
export default getters
|
||||||
|
@ -1,97 +0,0 @@
|
|||||||
import {login, getCurrentUser, updateInfo, logout} from '@/api/user-token'
|
|
||||||
import {resetRouter} from '@/router'
|
|
||||||
import {getToken, setToken, removeToken} from '@/utils/token'
|
|
||||||
import {getLanguage, setLanguage} from "@/i18n";
|
|
||||||
|
|
||||||
/* 前后端不分离的登录办法*/
|
|
||||||
const state = {
|
|
||||||
token: getToken(),
|
|
||||||
name: "",
|
|
||||||
language: getLanguage(),
|
|
||||||
roles: []
|
|
||||||
}
|
|
||||||
|
|
||||||
const mutations = {
|
|
||||||
SET_TOKEN: (state, token) => {
|
|
||||||
state.token = token
|
|
||||||
},
|
|
||||||
SET_NAME: (state, name) => {
|
|
||||||
state.name = name
|
|
||||||
},
|
|
||||||
SET_LANGUAGE: (state, language) => {
|
|
||||||
state.language = language
|
|
||||||
setLanguage(language)
|
|
||||||
},
|
|
||||||
SET_ROLES: (state, roles) => {
|
|
||||||
state.roles = roles
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const actions = {
|
|
||||||
login({commit}, userInfo) {
|
|
||||||
const {username, password} = userInfo
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
login({username: username.trim(), password: password}).then(response => {
|
|
||||||
let token = response.data
|
|
||||||
commit('SET_TOKEN', token)
|
|
||||||
setToken(token)
|
|
||||||
resolve(response)
|
|
||||||
}).catch(error => {
|
|
||||||
reject(error)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
isLogin({commit}) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let token = getToken()
|
|
||||||
if (token) {
|
|
||||||
commit('SET_TOKEN', token);
|
|
||||||
resolve(true)
|
|
||||||
} else {
|
|
||||||
reject(false)
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
getCurrentUser({commit}) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
getCurrentUser().then(response => {
|
|
||||||
const {name, roles, language} = response.data
|
|
||||||
commit('SET_NAME', name)
|
|
||||||
commit('SET_ROLES', roles)
|
|
||||||
commit('SET_LANGUAGE', language)
|
|
||||||
resolve(response.data)
|
|
||||||
}).catch(error => {
|
|
||||||
reject(error)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
setLanguage({commit, state}, language) {
|
|
||||||
commit('SET_LANGUAGE', language)
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
updateInfo(state.id, {language: language}).then(response => {
|
|
||||||
resolve(response)
|
|
||||||
}).catch(error => {
|
|
||||||
reject(error)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
logout({commit}) {
|
|
||||||
logout().then(() => {
|
|
||||||
commit('SET_TOKEN', "");
|
|
||||||
commit('SET_ROLES', [])
|
|
||||||
removeToken()
|
|
||||||
resetRouter()
|
|
||||||
})
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
export default {
|
|
||||||
namespaced: true,
|
|
||||||
state,
|
|
||||||
mutations,
|
|
||||||
actions
|
|
||||||
}
|
|
@ -1,21 +1,25 @@
|
|||||||
/* 前后端不分离的登录方式*/
|
import {login, getCurrentUser, updateInfo, logout} from '@/api/user'
|
||||||
import {login, isLogin, getCurrentUser, updateInfo, logout} from '@/api/user'
|
|
||||||
import {resetRouter} from '@/router'
|
import {resetRouter} from '@/router'
|
||||||
|
import {getToken, setToken, removeToken} from '@/utils/token'
|
||||||
import {getLanguage, setLanguage} from "@/i18n";
|
import {getLanguage, setLanguage} from "@/i18n";
|
||||||
|
|
||||||
const state = {
|
/* 前后端不分离的登录办法*/
|
||||||
login: false,
|
|
||||||
|
const getDefaultState = () => {
|
||||||
|
return {
|
||||||
|
token: getToken(),
|
||||||
name: "",
|
name: "",
|
||||||
language: getLanguage(),
|
language: getLanguage(),
|
||||||
roles: []
|
roles: []
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const state = getDefaultState()
|
||||||
|
|
||||||
|
|
||||||
const mutations = {
|
const mutations = {
|
||||||
LOGIN: (state) => {
|
SET_TOKEN: (state, token) => {
|
||||||
state.login = true
|
state.token = token
|
||||||
},
|
|
||||||
LOGOUT: (state) => {
|
|
||||||
state.login = false
|
|
||||||
},
|
},
|
||||||
SET_NAME: (state, name) => {
|
SET_NAME: (state, name) => {
|
||||||
state.name = name
|
state.name = name
|
||||||
@ -34,7 +38,9 @@ const actions = {
|
|||||||
const {username, password} = userInfo
|
const {username, password} = userInfo
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
login({username: username.trim(), password: password}).then(response => {
|
login({username: username.trim(), password: password}).then(response => {
|
||||||
commit('LOGIN')
|
let token = response.data.token
|
||||||
|
commit('SET_TOKEN', token)
|
||||||
|
setToken(token)
|
||||||
resolve(response)
|
resolve(response)
|
||||||
}).catch(error => {
|
}).catch(error => {
|
||||||
reject(error)
|
reject(error)
|
||||||
@ -43,17 +49,14 @@ const actions = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
isLogin({commit}) {
|
isLogin({commit}) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve, reject) => {
|
||||||
if (state.login) {
|
let token = getToken()
|
||||||
|
if (token) {
|
||||||
|
commit('SET_TOKEN', token);
|
||||||
resolve(true)
|
resolve(true)
|
||||||
return;
|
} else {
|
||||||
|
reject(false)
|
||||||
}
|
}
|
||||||
isLogin().then(() => {
|
|
||||||
commit('LOGIN')
|
|
||||||
resolve(true)
|
|
||||||
}).catch(() => {
|
|
||||||
resolve(false)
|
|
||||||
})
|
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -84,8 +87,9 @@ const actions = {
|
|||||||
|
|
||||||
logout({commit}) {
|
logout({commit}) {
|
||||||
logout().then(() => {
|
logout().then(() => {
|
||||||
commit('LOGOUT')
|
commit('SET_TOKEN', "");
|
||||||
commit('SET_ROLES', [])
|
commit('SET_ROLES', [])
|
||||||
|
removeToken()
|
||||||
resetRouter()
|
resetRouter()
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
@ -27,7 +27,8 @@ module.exports = {
|
|||||||
// }
|
// }
|
||||||
// },
|
// },
|
||||||
configureWebpack: {
|
configureWebpack: {
|
||||||
devtool: 'source-map',
|
// devtool: 'source-map',
|
||||||
|
devtool: 'eval-source-map',
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@': resolve('src')
|
'@': resolve('src')
|
||||||
|
Loading…
Reference in New Issue
Block a user