token 无效
This commit is contained in:
@@ -49,17 +49,6 @@ public class GlobalExceptionHandler {
|
|||||||
return buildResponseEntity(ApiError.error(e.getMessage()));
|
return buildResponseEntity(ApiError.error(e.getMessage()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* BadCredentialsException
|
|
||||||
*/
|
|
||||||
// @ExceptionHandler(BadCredentialsException.class)
|
|
||||||
// public ResponseEntity<ApiError> badCredentialsException(BadCredentialsException e){
|
|
||||||
// // 打印堆栈信息
|
|
||||||
// String message = "坏的凭证".equals(e.getMessage()) ? "用户名或密码不正确" : e.getMessage();
|
|
||||||
// log.error(message);
|
|
||||||
// return buildResponseEntity(ApiError.error(message));
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* token 无效的异常拦截
|
* token 无效的异常拦截
|
||||||
* @param e
|
* @param e
|
||||||
@@ -67,9 +56,8 @@ public class GlobalExceptionHandler {
|
|||||||
*/
|
*/
|
||||||
@ExceptionHandler(value = NotLoginException.class)
|
@ExceptionHandler(value = NotLoginException.class)
|
||||||
public ResponseEntity<ApiError> notLoginException(Exception e) {
|
public ResponseEntity<ApiError> notLoginException(Exception e) {
|
||||||
// e.printStackTrace();
|
|
||||||
log.error(ThrowableUtil.getStackTrace(e));
|
log.error(ThrowableUtil.getStackTrace(e));
|
||||||
return buildResponseEntity(ApiError.error("Token 无效"));
|
return buildResponseEntity(ApiError.error(401,"token 失效"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ import cn.dev33.satoken.stp.StpUtil;
|
|||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.nl.utils.dto.CurrentUser;
|
import org.nl.utils.dto.CurrentUser;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author: lyd
|
* @author: lyd
|
||||||
* @description: 获取当前用户的信息 - 前提下在登录之后将数据存储到session
|
* @description: 获取当前用户的信息 - 前提下在登录之后将数据存储到session
|
||||||
@@ -56,4 +58,17 @@ public class SecurityUtils {
|
|||||||
}
|
}
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取当前用户权限
|
||||||
|
* @return 权限列表
|
||||||
|
*/
|
||||||
|
public static List<String> getCurrentUserPermissions() {
|
||||||
|
CurrentUser userInfo = (CurrentUser) StpUtil.getTokenSession().get("userInfo");
|
||||||
|
List<String> permissions = userInfo.getPermissions();
|
||||||
|
if (permissions.size() > 0) {
|
||||||
|
return permissions;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
|
|||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author: lyd
|
* @author: lyd
|
||||||
@@ -19,4 +21,6 @@ public class CurrentUser implements Serializable {
|
|||||||
private String username;
|
private String username;
|
||||||
|
|
||||||
private Object user;
|
private Object user;
|
||||||
|
|
||||||
|
private List<String> permissions = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,17 +99,20 @@ public class AuthorizationController {
|
|||||||
}
|
}
|
||||||
StpUtil.login(userDto.getId()); // 调用satoken登录
|
StpUtil.login(userDto.getId()); // 调用satoken登录
|
||||||
|
|
||||||
|
StpUtil.getSession().set("UserDto", userDto);
|
||||||
|
// 获取权限列表 - 登录查找权限
|
||||||
|
List<String> permissionList = roleService.getPermissionList(userDto.getId().toString());
|
||||||
|
|
||||||
// 保存用户信息到session - 登录输入,登出删除
|
// 保存用户信息到session - 登录输入,登出删除
|
||||||
CurrentUser user = new CurrentUser();
|
CurrentUser user = new CurrentUser();
|
||||||
user.setId(userDto.getId());
|
user.setId(userDto.getId());
|
||||||
user.setUsername(userDto.getUsername());
|
user.setUsername(userDto.getUsername());
|
||||||
user.setUser(userDto);
|
user.setUser(userDto);
|
||||||
|
user.setPermissions(permissionList);
|
||||||
StpUtil.getTokenSession().set("userInfo", user);
|
StpUtil.getTokenSession().set("userInfo", user);
|
||||||
StpUtil.getSession().set("UserDto", userDto);
|
|
||||||
|
|
||||||
// 返回一个User
|
// 返回一个User
|
||||||
// 返回 token 与 用户信息
|
// 返回 token 与 用户信息
|
||||||
List<String> permissionList = roleService.getPermissionList(userDto.getId().toString());
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("roles", permissionList);
|
jsonObject.put("roles", permissionList);
|
||||||
jsonObject.put("user", userDto);
|
jsonObject.put("user", userDto);
|
||||||
@@ -128,9 +131,8 @@ public class AuthorizationController {
|
|||||||
@GetMapping(value = "/info")
|
@GetMapping(value = "/info")
|
||||||
public ResponseEntity<Object> getUserInfo() {
|
public ResponseEntity<Object> getUserInfo() {
|
||||||
UserDto currentUser = (UserDto) SecurityUtils.getCurrentUser();
|
UserDto currentUser = (UserDto) SecurityUtils.getCurrentUser();
|
||||||
List<String> permissionList = roleService.getPermissionList(currentUser.getId().toString());
|
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("roles", permissionList);
|
jsonObject.put("roles", SecurityUtils.getCurrentUserPermissions());
|
||||||
jsonObject.put("user", currentUser);
|
jsonObject.put("user", currentUser);
|
||||||
return ResponseEntity.ok(jsonObject);
|
return ResponseEntity.ok(jsonObject);
|
||||||
}
|
}
|
||||||
@@ -159,7 +161,6 @@ public class AuthorizationController {
|
|||||||
@ApiOperation("退出登录")
|
@ApiOperation("退出登录")
|
||||||
@AnonymousDeleteMapping(value = "/logout")
|
@AnonymousDeleteMapping(value = "/logout")
|
||||||
public ResponseEntity<Object> logout(HttpServletRequest request) {
|
public ResponseEntity<Object> logout(HttpServletRequest request) {
|
||||||
StpUtil.getTokenSession().clear(); // 清除session数据
|
|
||||||
onlineUserService.logout(StpUtil.getTokenValue());
|
onlineUserService.logout(StpUtil.getTokenValue());
|
||||||
StpUtil.logout();
|
StpUtil.logout();
|
||||||
return new ResponseEntity<>(HttpStatus.OK);
|
return new ResponseEntity<>(HttpStatus.OK);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
|
|||||||
return new StpLogicJwtForSimple();
|
return new StpLogicJwtForSimple();
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] whitelist = new String[]{"/auth/login", "/auth/code", "/swagger-ui.html", "/swagger-resources/**",
|
String[] whitelist = new String[]{"/auth/login", "/auth/code","auth/logout", "/swagger-ui.html", "/swagger-resources/**",
|
||||||
"/webjars/**", "/*/api-docs", "/avatar/**", "/file/**", "/druid/**", "/favicon.ico",
|
"/webjars/**", "/*/api-docs", "/avatar/**", "/file/**", "/druid/**", "/favicon.ico",
|
||||||
"/*.html", "/**/*.html", "/**/*.css", "/**/*.js","/webSocket/**"};
|
"/*.html", "/**/*.html", "/**/*.css", "/**/*.js","/webSocket/**"};
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
package org.nl.modules.security.satoken;
|
package org.nl.modules.security.satoken;
|
||||||
|
|
||||||
import cn.dev33.satoken.stp.StpInterface;
|
import cn.dev33.satoken.stp.StpInterface;
|
||||||
import cn.dev33.satoken.stp.StpUtil;
|
import org.nl.utils.SecurityUtils;
|
||||||
import org.nl.modules.system.service.RoleService;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -16,14 +14,23 @@ import java.util.List;
|
|||||||
@Component
|
@Component
|
||||||
public class StpInterfaceImpl implements StpInterface {
|
public class StpInterfaceImpl implements StpInterface {
|
||||||
|
|
||||||
@Autowired
|
/**
|
||||||
private RoleService roleService;
|
* 用户权限获取
|
||||||
|
* @param o login存入的值,此处存放用户id
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<String> getPermissionList(Object o, String s) {
|
public List<String> getPermissionList(Object o, String s) {
|
||||||
return roleService.getPermissionList((String) StpUtil.getLoginId());
|
return SecurityUtils.getCurrentUserPermissions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 角色权限获取 - 数据库没有设计角色code,因此不推荐使用角色鉴权
|
||||||
|
* @param o
|
||||||
|
* @param s
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public List<String> getRoleList(Object o, String s) {
|
public List<String> getRoleList(Object o, String s) {
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -0,0 +1,64 @@
|
|||||||
|
## 关于satoken的提示
|
||||||
|
### 本系统采用两个session存放相关信息
|
||||||
|
1、其中tokenSession存放的是
|
||||||
|
提供公共模块使用,获取是Object可以直接强转此实体.
|
||||||
|
主要使用在 SecurityUtils类上,使用的key: userInfo
|
||||||
|
```java
|
||||||
|
@Data
|
||||||
|
public class CurrentUser implements Serializable {
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
private Object user;
|
||||||
|
|
||||||
|
private List<String> permissions = new ArrayList<>();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
2、Session存放的是UserDto,提供业务模块使用使用的key: UserDto
|
||||||
|
```java
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
public class UserDto extends BaseDTO implements Serializable {
|
||||||
|
@JsonSerialize(using = ToStringSerializer.class)
|
||||||
|
private Long id;
|
||||||
|
|
||||||
|
private Set<RoleSmallDto> roles;
|
||||||
|
|
||||||
|
private Set<JobSmallDto> jobs;
|
||||||
|
|
||||||
|
private DeptSmallDto dept;
|
||||||
|
|
||||||
|
private Long deptId;
|
||||||
|
|
||||||
|
private String username;
|
||||||
|
|
||||||
|
private String nickName;
|
||||||
|
|
||||||
|
private String email;
|
||||||
|
|
||||||
|
private String phone;
|
||||||
|
|
||||||
|
private String gender;
|
||||||
|
|
||||||
|
private String avatarName;
|
||||||
|
|
||||||
|
private String avatarPath;
|
||||||
|
|
||||||
|
private String extId;
|
||||||
|
|
||||||
|
private String extuserId;
|
||||||
|
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
private Boolean enabled;
|
||||||
|
|
||||||
|
@JsonIgnore
|
||||||
|
private Boolean isAdmin = false;
|
||||||
|
|
||||||
|
private Date pwdResetTime;
|
||||||
|
}
|
||||||
|
```
|
||||||
@@ -15,6 +15,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.nl.modules.system.service.impl;
|
package org.nl.modules.system.service.impl;
|
||||||
|
|
||||||
|
import cn.dev33.satoken.stp.StpUtil;
|
||||||
import cn.hutool.core.collection.CollectionUtil;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
@@ -30,6 +31,7 @@ import org.nl.modules.system.service.RoleService;
|
|||||||
import org.nl.modules.system.service.dto.RoleDto;
|
import org.nl.modules.system.service.dto.RoleDto;
|
||||||
import org.nl.modules.system.service.dto.RoleQueryCriteria;
|
import org.nl.modules.system.service.dto.RoleQueryCriteria;
|
||||||
import org.nl.modules.system.service.dto.RoleSmallDto;
|
import org.nl.modules.system.service.dto.RoleSmallDto;
|
||||||
|
import org.nl.modules.system.service.dto.UserDto;
|
||||||
import org.nl.modules.system.service.mapstruct.RoleMapper;
|
import org.nl.modules.system.service.mapstruct.RoleMapper;
|
||||||
import org.nl.modules.system.service.mapstruct.RoleSmallMapper;
|
import org.nl.modules.system.service.mapstruct.RoleSmallMapper;
|
||||||
import org.nl.utils.*;
|
import org.nl.utils.*;
|
||||||
@@ -183,6 +185,11 @@ public class RoleServiceImpl implements RoleService {
|
|||||||
@Cacheable(key = "'auth:' + #p0")
|
@Cacheable(key = "'auth:' + #p0")
|
||||||
public List<String> getPermissionList(String id) {
|
public List<String> getPermissionList(String id) {
|
||||||
List<String> permission = new LinkedList<>();
|
List<String> permission = new LinkedList<>();
|
||||||
|
// 查看是否为管理员
|
||||||
|
UserDto user = (UserDto) StpUtil.getSession().get("UserDto");
|
||||||
|
if (user.getIsAdmin()) { // 是管理员
|
||||||
|
permission.add("admin");
|
||||||
|
}
|
||||||
HashMap<String, String> map = new HashMap<>();
|
HashMap<String, String> map = new HashMap<>();
|
||||||
map.put("flag", "1");
|
map.put("flag", "1");
|
||||||
map.put("user_id", id);
|
map.put("user_id", id);
|
||||||
|
|||||||
@@ -6,12 +6,12 @@ spring:
|
|||||||
druid:
|
druid:
|
||||||
db-type: com.alibaba.druid.pool.DruidDataSource
|
db-type: com.alibaba.druid.pool.DruidDataSource
|
||||||
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
driverClassName: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
|
||||||
# url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
url: jdbc:log4jdbc:mysql://${DB_HOST:47.111.78.178}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
||||||
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
# url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:nladmin}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
|
||||||
# username: ${DB_USER:root}
|
|
||||||
username: ${DB_USER:root}
|
username: ${DB_USER:root}
|
||||||
# password: ${DB_PWD:P@ssw0rd}
|
# username: ${DB_USER:root}
|
||||||
password: ${DB_PWD:12356}
|
password: ${DB_PWD:P@ssw0rd}
|
||||||
|
# password: ${DB_PWD:12356}
|
||||||
# 初始连接数
|
# 初始连接数
|
||||||
initial-size: 5
|
initial-size: 5
|
||||||
# 最小连接数
|
# 最小连接数
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ router.beforeEach((to, from, next) => {
|
|||||||
}
|
}
|
||||||
NProgress.start()
|
NProgress.start()
|
||||||
if (getToken()) {
|
if (getToken()) {
|
||||||
|
// debugger
|
||||||
// 已登录且要跳转的页面是登录页
|
// 已登录且要跳转的页面是登录页
|
||||||
if (to.path === '/login') {
|
if (to.path === '/login') {
|
||||||
next({ path: '/' })
|
next({ path: '/' })
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
<template>
|
|
||||||
<router-view />
|
|
||||||
</template>
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div style="padding:30px;">
|
|
||||||
<el-input v-model="input" placeholder="请输入内容" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
<script>
|
|
||||||
export default {
|
|
||||||
name: 'Test',
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
input: ''
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div style="padding:30px;">
|
|
||||||
<el-input v-model="input" placeholder="请输入内容2" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
<template>
|
|
||||||
<div style="padding:30px;">
|
|
||||||
<el-alert :closable="false" title="二级菜单" />
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
Reference in New Issue
Block a user