Commit 62046c00 authored by trumansdo's avatar trumansdo
Browse files

正在进行的工作:完成用户角色重构和菜单重构


Signed-off-by: default avatartrumansdo <1012243881@qq.com>
parent d8a7dc4a
*/target/*
!.gitignore
*.iml
.idea
\ No newline at end of file
.idea
rebel.xml
/logs/*
\ No newline at end of file
package com.ibeetl.admin.core.conf;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ibeetl.admin.core.util.FormFieldException;
import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.admin.core.web.JsonResult;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.web.servlet.error.AbstractErrorController;
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ibeetl.admin.core.util.FormFieldException;
import com.ibeetl.admin.core.util.PlatformException;
import com.ibeetl.admin.core.web.JsonResult;
/**
* 自定义的全局错误页面
*
......@@ -36,7 +32,8 @@ import com.ibeetl.admin.core.web.JsonResult;
public class CustomErrorController extends AbstractErrorController {
private static final String ERROR_PATH = "/error";
Log log = LogFactory.getLog(ErrorController.class);
private Logger logger = LoggerFactory.getLogger(CustomErrorController.class);
@Autowired ObjectMapper objectMapper;
......@@ -47,6 +44,7 @@ public class CustomErrorController extends AbstractErrorController {
@RequestMapping(ERROR_PATH)
public ModelAndView getErrorPath(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> model = Collections.unmodifiableMap(getErrorAttributes(request, false));
Throwable cause = getCause(request);
int status = (Integer) model.get("status");
// 错误信息
......@@ -54,12 +52,12 @@ public class CustomErrorController extends AbstractErrorController {
// 友好提示
String errorMessage = getErrorMessage(cause);
String requestPath = (String) model.get("path");
/*参数错误*/
List<FieldError> filedErrors = this.getFieldError(model, cause);
// 后台打印日志信息方方便查错
log.error(status + ":" + message + filedErrors, cause);
log.error("requestPath" + ":" + requestPath);
logger.error("{} : {} {} {}", status, message, filedErrors, cause);
logger.error("requestPath : {}", requestPath);
response.setStatus(status);
if (!isJsonRequest(request)) {
......@@ -69,9 +67,7 @@ public class CustomErrorController extends AbstractErrorController {
view.addObject("filedErrors", filedErrors);
view.addObject("cause", cause);
view.addObject("requestPath", requestPath);
return view;
} else {
if (filedErrors == null) {
if (status == 404) {
......@@ -79,9 +75,7 @@ public class CustomErrorController extends AbstractErrorController {
} else {
writeJson(response, JsonResult.failMessage(getErrorMessage(cause)));
}
} else {
writeJson(response, JsonResult.fail(this.wrapFieldErrors(filedErrors)));
}
......@@ -112,6 +106,12 @@ public class CustomErrorController extends AbstractErrorController {
return list;
}
/**
* json请求,要么是.json后缀的请求,要么是http请求报文中规定的json请求
*
* @param request
* @return
*/
protected boolean isJsonRequest(HttpServletRequest request) {
String requestUri = (String) request.getAttribute("javax.servlet.error.request_uri");
if (requestUri != null && requestUri.endsWith(".json")) {
......@@ -144,7 +144,7 @@ public class CustomErrorController extends AbstractErrorController {
Throwable error = (Throwable) request.getAttribute("javax.servlet.error.exception");
if (error != null) {
while (error instanceof ServletException && error.getCause() != null) {
error = ((ServletException) error).getCause();
error = error.getCause();
}
}
return error;
......
......@@ -43,19 +43,14 @@ public class JasonConfig {
public void serialize(JsonResult value, JsonGenerator gen, SerializerProvider serializers)
throws IOException {
gen.writeStartObject();
if (value.getCode().equals("200")) {
gen.writeObjectField("code", 0);
} else {
gen.writeObjectField("code", Integer.parseInt(value.getCode()));
}
gen.writeStringField("msg", value.getMsg());
gen.writeObjectField("code", Integer.parseInt(value.getCode()));
gen.writeStringField("msg", value.getMessage());
Object data = value.getData();
if (data instanceof PageQuery) {
PageQuery query = (PageQuery) (data);
gen.writeObjectField("count", query.getTotalRow());
gen.writeObjectField("data", query.getList());
} else {
gen.writeObjectField("data", data);
}
gen.writeEndObject();
......
......@@ -127,7 +127,7 @@ class SessionInterceptor implements HandlerInterceptor {
public boolean preHandle(
HttpServletRequest request, HttpServletResponse response, Object handler) {
httpRequestLocal.set(request);
if (StrUtil.containsAny(request.getRequestURI(), "/user/login", "/error", "/logout")) {
if (StrUtil.containsAny(request.getRequestURI(), "/login", "/error", "/logout")) {
return true;
}
......
......@@ -24,6 +24,11 @@ import com.ibeetl.admin.core.util.FunctionLocal;
import com.ibeetl.admin.core.util.HttpRequestLocal;
import com.ibeetl.admin.core.util.PlatformException;
/**
* 在springboot-plus中,有两种权限:功能点(或者说一个个controller方法)和数据权限。
* 菜单实际上也是绑定在了功能点中
* @author 一日看尽长安花
* */
@Aspect
@Component
public class RbacAnnotationConfig {
......
......@@ -2,7 +2,7 @@ package com.ibeetl.admin.core.rbac;
/**
* 数据权限算法结果
*
* 类似linux的权限设计,owner,group,other
* @author xiandafu
*/
public enum AccessType {
......
package com.ibeetl.admin.core.web;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.ibeetl.admin.core.annotation.RequestBodyPlus;
import com.ibeetl.admin.core.util.JoseJwtUtil;
import com.ibeetl.admin.core.util.PlatformException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
......@@ -24,6 +31,7 @@ import com.ibeetl.admin.core.util.HttpRequestLocal;
import com.ibeetl.admin.core.web.dto.FunctionNodeView;
import com.ibeetl.admin.core.web.dto.MenuNodeView;
import com.ibeetl.admin.core.web.dto.SystemMenuView;
import sun.swing.StringUIClientPropertyKey;
@Controller
@SuppressWarnings("unchecked")
......@@ -78,7 +86,6 @@ public class CoreUserController {
/**
* 切换部门
*
* @param code
* @param orgId
* @return
*/
......@@ -250,4 +257,45 @@ public class CoreUserController {
}
return views;
}
@GetMapping("/user/info")
@ResponseBody
public JsonResult info(
@RequestBodyPlus("username") String username, @RequestBodyPlus("password") String password) {
Map<String, Object> resultMap =
MapUtil.<String, Object>builder()
.build();
return JsonResult.success(resultMap);
}
@PostMapping("/user/login")
@ResponseBody
public JsonResult loginEle(
@RequestBodyPlus("username") String username, @RequestBodyPlus("password") String password) {
UserLoginInfo info = userService.login(username, password);
if (info == null) {
throw new PlatformException("用户名密码错误");
}
CoreUser user = info.getUser();
CoreOrg currentOrg = info.getOrgs().stream().findFirst().orElse(null);
for (CoreOrg org : info.getOrgs()) {
if (org.getId().equals(user.getOrgId())) {
currentOrg = org;
break;
}
}
info.setCurrentOrg(currentOrg);
// 记录登录信息到session
this.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());
Map<String, Object> resultMap =
MapUtil.<String, Object>builder()
.put("token", JoseJwtUtil.generateJwtJson(String.valueOf(user.getId())))
.build();
return JsonResult.success(resultMap);
}
}
......@@ -37,7 +37,7 @@ public class IndexController {
return view;
}
/*@PostMapping("/login.do")
@PostMapping("/login.do")
public ModelAndView login(String code, String password) {
UserLoginInfo info = userService.login(code, password);
if (info == null) {
......@@ -57,31 +57,6 @@ public class IndexController {
this.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());
ModelAndView view = new ModelAndView("redirect:/index.do");
return view;
}*/
@PostMapping("/user/login")
@ResponseBody
public Object login(
@RequestBodyPlus("username") String username, @RequestBodyPlus("password") String password) {
UserLoginInfo info = userService.login(username, password);
if (info == null) {
throw new PlatformException("用户名密码错误");
}
CoreUser user = info.getUser();
CoreOrg currentOrg = info.getOrgs().get(0);
for (CoreOrg org : info.getOrgs()) {
if (org.getId().equals(user.getOrgId())) {
currentOrg = org;
break;
}
}
info.setCurrentOrg(currentOrg);
// 记录登录信息到session
this.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());
Map<Object, Object> resultMap = MapUtil.builder()
.put("token", JoseJwtUtil.generateJwtJson(String.valueOf(user.getId()))).build();
return JsonResult.success(resultMap);
}
@RequestMapping("/index.do")
......
package com.ibeetl.admin.core.web;
import cn.hutool.core.map.MapUtil;
import com.ibeetl.admin.core.util.JoseJwtUtil;
import java.util.Map;
/**
* 描述: json格式数据返回对象,使用CustomJsonResultSerializer 来序列化
*
......@@ -8,7 +12,7 @@ package com.ibeetl.admin.core.web;
public class JsonResult<T> {
private String code;
private String msg;
private String message;
private T data;
public String getCode() {
......@@ -19,12 +23,12 @@ public class JsonResult<T> {
this.code = code;
}
public String getMsg() {
return msg;
public String getMessage() {
return message;
}
public void setMsg(String msg) {
this.msg = msg;
public void setMessage(String message) {
this.message = message;
}
public T getData() {
......@@ -37,13 +41,13 @@ public class JsonResult<T> {
@Override
public String toString() {
return "code=" + code + " message=" + msg + " data=" + data;
return "code=" + code + " message=" + message + " data=" + data;
}
public static <T> JsonResult<T> fail() {
JsonResult<T> ret = new JsonResult<T>();
ret.setCode(JsonReturnCode.FAIL.getCode());
ret.setMsg(JsonReturnCode.FAIL.getDesc());
ret.setMessage(JsonReturnCode.FAIL.getDesc());
return ret;
}
......@@ -55,20 +59,20 @@ public class JsonResult<T> {
public static <T> JsonResult<T> failMessage(String msg) {
JsonResult<T> ret = JsonResult.fail();
ret.setMsg(msg);
ret.setMessage(msg);
return ret;
}
public static <T> JsonResult<T> successMessage(String msg) {
JsonResult<T> ret = JsonResult.success();
ret.setMsg(msg);
ret.setMessage(msg);
return ret;
}
public static <T> JsonResult<T> success() {
JsonResult<T> ret = new JsonResult<T>();
ret.setCode(JsonReturnCode.SUCCESS.getCode());
ret.setMsg(JsonReturnCode.SUCCESS.getDesc());
ret.setMessage(JsonReturnCode.SUCCESS.getDesc());
return ret;
}
......@@ -81,7 +85,7 @@ public class JsonResult<T> {
public static <T> JsonResult<T> http404(T data) {
JsonResult<T> ret = new JsonResult<T>();
ret.setCode(JsonReturnCode.NOT_FOUND.getCode());
ret.setMsg(JsonReturnCode.NOT_FOUND.getDesc());
ret.setMessage(JsonReturnCode.NOT_FOUND.getDesc());
ret.setData(data);
return ret;
}
......@@ -89,8 +93,9 @@ public class JsonResult<T> {
public static <T> JsonResult<T> http403(T data) {
JsonResult<T> ret = new JsonResult<T>();
ret.setCode(JsonReturnCode.ACCESS_ERROR.getCode());
ret.setMsg(JsonReturnCode.ACCESS_ERROR.getDesc());
ret.setMessage(JsonReturnCode.ACCESS_ERROR.getDesc());
ret.setData(data);
return ret;
}
}
......@@ -16,7 +16,10 @@ public enum JsonReturnCode {
SUCCESS("200", "成功"),
FAIL("500", "内部失败"),
ACCESS_ERROR("403", "禁止访问"),
NOT_FOUND("404", "页面未发现");
NOT_FOUND("404", "页面未发现"),
TOKEN_EXPIRED("50014", "令牌过期"),
INVALID_TOEKN("50008", "非法令牌");
private String code;
private String desc;
......
......@@ -12,7 +12,7 @@ export function getInfo(token) {
return request({
url: '/user/info',
method: 'get',
params: { token }
// params: { token }
})
}
......
......@@ -49,6 +49,7 @@ const actions = {
// get user info
getInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getInfo(state.token)
.then(response => {
const { data } = response
......
import Cookies from 'js-cookie'
const TokenKey = 'Admin-Token'
const TokenKey = 'JWT-Token'
export function getToken() {
return Cookies.get(TokenKey)
......
......@@ -17,9 +17,9 @@ service.interceptors.request.use(
if (store.getters.token) {
// let each request carry token
// ['X-Token'] is a custom headers key
// ['Authorization'] see to MDN explain about "HTTP Authorization"
// please modify it according to the actual situation
config.headers['X-Token'] = getToken()
config.headers['Authorization'] = getToken()
}
return config
},
......@@ -46,7 +46,7 @@ service.interceptors.response.use(
const res = response.data
// if the custom code is not 20000, it is judged as an error.
if (res.code !== 20000) {
if (res.code !== 200) {
Message({
message: res.message || 'Error',
type: 'error',
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment