提交 6f9949c4 编写于 作者: Q qinxiaodong@pannk.com

更新项目代码

上级 e24a2288
...@@ -14,7 +14,7 @@ module.exports = { ...@@ -14,7 +14,7 @@ module.exports = {
// 代理列表, 是否开启代理通过[./dev.env.js]配置 // 代理列表, 是否开启代理通过[./dev.env.js]配置
proxyTable: devEnv.OPEN_PROXY === false ? {} : { proxyTable: devEnv.OPEN_PROXY === false ? {} : {
'/proxyApi': { '/proxyApi': {
target: 'http://localhost:8080/', target: 'http://127.0.0.1:8080/',
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/proxyApi': '/' '^/proxyApi': '/'
...@@ -23,8 +23,8 @@ module.exports = { ...@@ -23,8 +23,8 @@ module.exports = {
}, },
// Various Dev Server settings // Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST host: '127.0.0.1', // can be overwritten by process.env.HOST
port: 8001, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined port: 8002, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true, autoOpenBrowser: true,
errorOverlay: true, errorOverlay: true,
notifyOnErrors: true, notifyOnErrors: true,
......
...@@ -68,8 +68,8 @@ router.beforeEach((to, from, next) => { ...@@ -68,8 +68,8 @@ router.beforeEach((to, from, next) => {
params: http.adornParams() params: http.adornParams()
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
fnAddDynamicMenuRoutes(data.menuList) fnAddDynamicMenuRoutes(data.data.menuList)
router.options.isAddDynamicMenuRoutes = true router.options.isAddDynamicMenuRoutes = true
sessionStorage.setItem('menuList', JSON.stringify(data.data.menuList || '[]')) sessionStorage.setItem('menuList', JSON.stringify(data.data.menuList || '[]'))
sessionStorage.setItem('permissions', JSON.stringify(data.data.permissions || '[]')) sessionStorage.setItem('permissions', JSON.stringify(data.data.permissions || '[]'))
next({ ...to, replace: true }) next({ ...to, replace: true })
...@@ -118,7 +118,7 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) { ...@@ -118,7 +118,7 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) {
component: null, component: null,
name: menuList[i].url.replace('/', '-'), name: menuList[i].url.replace('/', '-'),
meta: { meta: {
menuId: menuList[i].menuId, menuId: menuList[i].id,
title: menuList[i].name, title: menuList[i].name,
isDynamic: true, isDynamic: true,
isTab: true, isTab: true,
...@@ -127,8 +127,8 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) { ...@@ -127,8 +127,8 @@ function fnAddDynamicMenuRoutes (menuList = [], routes = []) {
} }
// url以http[s]://开头, 通过iframe展示 // url以http[s]://开头, 通过iframe展示
if (isURL(menuList[i].url)) { if (isURL(menuList[i].url)) {
route['path'] = `i-${menuList[i].menuId}` route['path'] = `i-${menuList[i].id}`
route['name'] = `i-${menuList[i].menuId}` route['name'] = `i-${menuList[i].id}`
route['meta']['iframeUrl'] = menuList[i].url route['meta']['iframeUrl'] = menuList[i].url
} else { } else {
try { try {
......
...@@ -5,7 +5,8 @@ export default { ...@@ -5,7 +5,8 @@ export default {
name: '', name: '',
code: '', code: '',
fullName: '', fullName: '',
gender: 0 gender: 0,
roles: []
}, },
mutations: { mutations: {
updateId (state, id) { updateId (state, id) {
...@@ -22,6 +23,9 @@ export default { ...@@ -22,6 +23,9 @@ export default {
}, },
updateGender (state, gender) { updateGender (state, gender) {
state.gender = gender state.gender = gender
},
updateRoles (state, roles) {
state.roles = roles
} }
} }
} }
...@@ -16,7 +16,7 @@ export function getUUID () { ...@@ -16,7 +16,7 @@ export function getUUID () {
* @param {*} key * @param {*} key
*/ */
export function isAuth (key) { export function isAuth (key) {
return JSON.parse(sessionStorage.getItem('permissions') || '[]').indexOf(key) !== -1 || false return JSON.parse(sessionStorage.getItem('permissions') || '[]').join('').indexOf(key) !== -1 || false
} }
/** /**
......
...@@ -59,7 +59,7 @@ ...@@ -59,7 +59,7 @@
}) })
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.$cookie.set('token', data.token) this.$cookie.set('token', data.data)
this.$router.replace({ name: 'home' }) this.$router.replace({ name: 'home' })
} else { } else {
this.$message.error(data.msg) this.$message.error(data.msg)
......
...@@ -23,19 +23,13 @@ ...@@ -23,19 +23,13 @@
<icon-svg name="shezhi" class="el-icon-setting"></icon-svg> <icon-svg name="shezhi" class="el-icon-setting"></icon-svg>
</el-badge> </el-badge>
</template> </template>
</el-menu-item> </el-menu-item>
<el-menu-item index="2">
<el-badge value="hot">
<a href="https://www.renren.io/" target="_blank">官方社区</a>
</el-badge>
</el-menu-item>
<el-submenu index="3"> <el-submenu index="3">
<template slot="title">Git源码</template> <template slot="title">Git源码</template>
<el-menu-item index="2-1"><a href="https://github.com/renrenio/renren-fast-vue" target="_blank">前端</a></el-menu-item>
<el-menu-item index="2-2"><a href="https://gitee.com/renrenio/renren-fast" target="_blank">后台</a></el-menu-item>
<el-menu-item index="2-3"><a href="https://gitee.com/renrenio/renren-generator" target="_blank">代码生成器</a></el-menu-item> <el-menu-item index="2-3"><a href="https://gitee.com/renrenio/renren-generator" target="_blank">代码生成器</a></el-menu-item>
</el-submenu> </el-submenu>
<el-menu-item class="site-navbar__avatar" index="3"> <el-menu-item class="site-navbar__avatar" index="3">
{{ userName }}
<el-dropdown :show-timeout="0" placement="bottom"> <el-dropdown :show-timeout="0" placement="bottom">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
<img src="~@/assets/img/avatar.png" :alt="userName">{{ userName }} <img src="~@/assets/img/avatar.png" :alt="userName">{{ userName }}
......
<template> <template>
<el-submenu <el-submenu
v-if="menu.list && menu.list.length >= 1" v-if="menu.list && menu.list.length >= 1"
:index="menu.menuId + ''" :index="menu.id + ''"
:popper-class="'site-sidebar--' + sidebarLayoutSkin + '-popper'"> :popper-class="'site-sidebar--' + sidebarLayoutSkin + '-popper'">
<template slot="title"> <template slot="title">
<icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg> <icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg>
...@@ -9,12 +9,12 @@ ...@@ -9,12 +9,12 @@
</template> </template>
<sub-menu <sub-menu
v-for="item in menu.list" v-for="item in menu.list"
:key="item.menuId" :key="item.id"
:menu="item" :menu="item"
:dynamicMenuRoutes="dynamicMenuRoutes"> :dynamicMenuRoutes="dynamicMenuRoutes">
</sub-menu> </sub-menu>
</el-submenu> </el-submenu>
<el-menu-item v-else :index="menu.menuId + ''" @click="gotoRouteHandle(menu)"> <el-menu-item v-else :index="menu.id + ''" @click="gotoRouteHandle(menu)">
<icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg> <icon-svg :name="menu.icon || ''" class="site-sidebar__menu-icon"></icon-svg>
<span>{{ menu.name }}</span> <span>{{ menu.name }}</span>
</el-menu-item> </el-menu-item>
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
methods: { methods: {
// 通过menuId与动态(菜单)路由进行匹配跳转至指定路由 // 通过menuId与动态(菜单)路由进行匹配跳转至指定路由
gotoRouteHandle (menu) { gotoRouteHandle (menu) {
var route = this.dynamicMenuRoutes.filter(item => item.meta.menuId === menu.menuId) var route = this.dynamicMenuRoutes.filter(item => item.meta.menuId === menu.id)
if (route.length >= 1) { if (route.length >= 1) {
this.$router.push({ name: route[0].name }) this.$router.push({ name: route[0].name })
} }
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
</el-submenu> </el-submenu>
<sub-menu <sub-menu
v-for="menu in menuList" v-for="menu in menuList"
:key="menu.menuId" :key="menu.id"
:menu="menu" :menu="menu"
:dynamicMenuRoutes="dynamicMenuRoutes"> :dynamicMenuRoutes="dynamicMenuRoutes">
</sub-menu> </sub-menu>
...@@ -93,7 +93,7 @@ ...@@ -93,7 +93,7 @@
} }
} }
tab = { tab = {
menuId: route.meta.menuId || route.name, menuId: route.meta.id || route.name,
name: route.name, name: route.name,
title: route.meta.title, title: route.meta.title,
type: isURL(route.meta.iframeUrl) ? 'iframe' : 'module', type: isURL(route.meta.iframeUrl) ? 'iframe' : 'module',
......
...@@ -53,8 +53,24 @@ ...@@ -53,8 +53,24 @@
set (val) { this.$store.commit('user/updateId', val) } set (val) { this.$store.commit('user/updateId', val) }
}, },
userName: { userName: {
get () { return this.$store.state.user.name }, get () { return this.$store.state.user },
set (val) { this.$store.commit('user/updateName', val) } set (val) { this.$store.commit('user/updateName', val) }
},
userCode: {
get () { return this.$store.state.user.code },
set (val) { this.$store.commit('user/updateCode', val) }
},
userFullName: {
get () { return this.$store.state.user.fullName },
set (val) { this.$store.commit('user/updateFullName', val) }
},
userGender: {
get () { return this.$store.state.user.gender },
set (val) { this.$store.commit('user/updateGender', val) }
},
userRoles: {
get () { return this.$store.state.user.roles },
set (val) { this.$store.commit('user/updateRoles', val) }
} }
}, },
created () { created () {
...@@ -68,7 +84,7 @@ ...@@ -68,7 +84,7 @@
resetDocumentClientHeight () { resetDocumentClientHeight () {
this.documentClientHeight = document.documentElement['clientHeight'] this.documentClientHeight = document.documentElement['clientHeight']
window.onresize = () => { window.onresize = () => {
this.documentClientHeight = document.documentElement['clientHeight'] this.documentClientHeightentHeight = document.documentElement['clientHeight']
} }
}, },
// 获取当前管理员信息 // 获取当前管理员信息
...@@ -80,8 +96,13 @@ ...@@ -80,8 +96,13 @@
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.loading = false this.loading = false
this.userId = data.user.userId let _data = data.data
this.userName = data.user.username this.userId = _data.id
this.userName = _data.userName
this.userCode = _data.code
this.userFullName = _data.fullName
this.userGender = _data.gender
this.userRoles = _data.roles
} }
}) })
} }
......
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<el-table <el-table
:data="dataList" :data="dataList"
row-key="menuId" row-key="id"
border border
style="width: 100%; "> style="width: 100%; ">
<el-table-column <el-table-column
...@@ -72,8 +72,8 @@ ...@@ -72,8 +72,8 @@
width="150" width="150"
label="操作"> label="操作">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button v-if="isAuth('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.menuId)">修改</el-button> <el-button v-if="isAuth('sys:menu:update')" type="text" size="small" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
<el-button v-if="isAuth('sys:menu:delete')" type="text" size="small" @click="deleteHandle(scope.row.menuId)">删除</el-button> <el-button v-if="isAuth('sys:menu:delete')" type="text" size="small" @click="deleteHandle(scope.row.id)">删除</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -109,7 +109,7 @@ ...@@ -109,7 +109,7 @@
method: 'get', method: 'get',
params: this.$http.adornParams() params: this.$http.adornParams()
}).then(({data}) => { }).then(({data}) => {
this.dataList = treeDataTranslate(data, 'menuId') this.dataList = treeDataTranslate(data.data, 'id')
this.dataListLoading = false this.dataListLoading = false
}) })
}, },
......
...@@ -127,8 +127,8 @@ ...@@ -127,8 +127,8 @@
}) })
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {
this.dataList = data.page.list this.dataList = data.data.list
this.totalPage = data.page.totalCount this.totalPage = data.data.totalCount
} else { } else {
this.dataList = [] this.dataList = []
this.totalPage = 0 this.totalPage = 0
......
...@@ -7,6 +7,7 @@ public class Constant { ...@@ -7,6 +7,7 @@ public class Constant {
public static final String NAME_SPACE = "mms"; public static final String NAME_SPACE = "mms";
public static final String KEY_JOIN_CHAR = ":"; public static final String KEY_JOIN_CHAR = ":";
public static final String USER_CACHE = NAME_SPACE + KEY_JOIN_CHAR + "user_cache" + KEY_JOIN_CHAR; public static final String USER_CACHE = NAME_SPACE + KEY_JOIN_CHAR + "user_cache" + KEY_JOIN_CHAR;
public static final String PERMS_CAHCE = NAME_SPACE + KEY_JOIN_CHAR + "perms_cache" + KEY_JOIN_CHAR;
public static final String CODE = "code"; public static final String CODE = "code";
public static final String MESSAGE = "msg"; public static final String MESSAGE = "msg";
public static final String SUCCESS = "success"; public static final String SUCCESS = "success";
...@@ -14,6 +15,13 @@ public class Constant { ...@@ -14,6 +15,13 @@ public class Constant {
public static final String DATA = "data"; public static final String DATA = "data";
public static final Long SUPER_ADMIN = 1L; public static final Long SUPER_ADMIN = 1L;
public static final long EXPIRE = 30 * 24 * 60 * 60; public static final long EXPIRE = 30 * 24 * 60 * 60;
public static final long DEFAULT_CUR_PAGE = 1;
public static final long DEFAULT_PAGE_SIZE = 10;
public static final String PAGE = "page";
public static final String LIMIT = "limit";
public static final String ORDER_FIELD = "sidx";
public static final String ORDER ="order";
public static final String ASC = "ASC";
/** /**
* 菜单类型 * 菜单类型
......
package com.pannk.mms.common.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* Created by wolf on 20-11-20.
*/
@Data
public class PageData<T> implements Serializable {
private static final long serialVersionUID = -8171781651062157031L;
/**
* 总记录数
*/
private long total;
/**
* 分页大小
*/
private long pageSize;
/**
* 总页数
*/
private long totalPage;
/**
* 当前页
*/
private long curPage;
private List<T> list;
public PageData(long total, long pageSize, long curPage, List<T> list) {
this.total = total;
this.pageSize = pageSize;
this.curPage = curPage;
this.list = list;
this.totalPage = (long) Math.ceil((double)total/pageSize);
}
public PageData(IPage<T> page){
this.list = page.getRecords();
this.total = page.getTotal();
this.pageSize = page.getSize();
this.curPage = page.getCurrent();
this.totalPage = page.getPages();
}
}
package com.pannk.mms.common.base;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pannk.mms.common.filters.SQLFilter;
import org.apache.commons.lang.StringUtils;
import java.util.Map;
import static com.pannk.mms.common.base.Constant.*;
/**
* Created by wolf on 20-11-20.
*/
public class Query<T> {
/**
* 分页参数
*
* @param params 参数
* @return
*/
public IPage<T> getPage(Map<String, Object> params) {
return this.getPage(params, null, false);
}
/**
* 分页
*
* @param params 参数
* @param defaultOrderField 默认排序字段
* @param isAsc 是否升序
* @return
*/
public IPage<T> getPage(Map<String, Object> params, String defaultOrderField, boolean isAsc) {
Object pageObj = params.get(PAGE);
Object limitObj = params.get(LIMIT);
long curPage = pageObj == null ? DEFAULT_CUR_PAGE : Long.parseLong(pageObj.toString());
long pageSize = limitObj == null ? DEFAULT_PAGE_SIZE : Long.parseLong(limitObj.toString());
Page<T> page = new Page<>(curPage, pageSize);
params.put(PAGE, page);
String orderField = SQLFilter.sqlInject((String) params.get(Constant.ORDER_FIELD));
String order = (String) params.get(Constant.ORDER);
if (StringUtils.isNotEmpty(orderField) && StringUtils.isNotEmpty(order)) {
return page.addOrder(ASC.equalsIgnoreCase(order) ? OrderItem.asc(orderField) : OrderItem.desc(orderField));
}
if (StringUtils.isBlank(defaultOrderField)) {
return page;
}
page.addOrder(isAsc ? OrderItem.asc(defaultOrderField) : OrderItem.desc(defaultOrderField));
return page;
}
}
package com.pannk.mms.common.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by wolf on 20-11-20.
*/
@Configuration
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// paginationInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
}
...@@ -22,7 +22,7 @@ import java.util.Map; ...@@ -22,7 +22,7 @@ import java.util.Map;
public class ShiroConfig { public class ShiroConfig {
@Bean @Bean
public SecurityManager securityManager(OAuth2Realm oAuth2Realm){ public SecurityManager securityManager(OAuth2Realm oAuth2Realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(oAuth2Realm); securityManager.setRealm(oAuth2Realm);
securityManager.setRememberMeManager(null); securityManager.setRememberMeManager(null);
...@@ -30,36 +30,37 @@ public class ShiroConfig { ...@@ -30,36 +30,37 @@ public class ShiroConfig {
} }
@Bean @Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager){ public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor= new AuthorizationAttributeSourceAdvisor(); AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager); advisor.setSecurityManager(securityManager);
return advisor; return advisor;
} }
@Bean("shiroFilter") @Bean("shiroFilter")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager){ public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager); shiroFilterFactoryBean.setSecurityManager(securityManager);
Map<String,Filter> filters = new HashMap<>(); Map<String, Filter> filters = new HashMap<>();
filters.put("oauth2",new OAuth2Filter()); filters.put("oauth2", new OAuth2Filter());
shiroFilterFactoryBean.setFilters(filters); shiroFilterFactoryBean.setFilters(filters);
Map<String,String> filterMap = new LinkedHashMap<>(); Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/webjars/**","anon"); filterMap.put("/webjars/**", "anon");
filterMap.put("/durid/**","anon"); filterMap.put("/druid/**", "anon");
filterMap.put("/sys/log","anon"); filterMap.put("/sys/login", "anon");
filterMap.put("/swagger/**","anon"); filterMap.put("/swagger/**", "anon");
filterMap.put("v2/api-docs","anon"); filterMap.put("v2/api-docs", "anon");
filterMap.put("/swagger-ui.html","anon"); filterMap.put("/swagger-ui.html", "anon");
filterMap.put("/swagger-resources/**","anon"); filterMap.put("/swagger-resources/**", "anon");
filterMap.put("/**", "oauth2");
shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);
return shiroFilterFactoryBean; return shiroFilterFactoryBean;
} }
@Bean("lifecycleBeanPostProcessor") @Bean("lifecycleBeanPostProcessor")
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){ public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor(); return new LifecycleBeanPostProcessor();
} }
......
...@@ -2,15 +2,20 @@ package com.pannk.mms.common.oauth2; ...@@ -2,15 +2,20 @@ package com.pannk.mms.common.oauth2;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.pannk.mms.common.base.Result; import com.pannk.mms.common.base.Result;
import com.pannk.mms.common.exception.BaseException;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.AuthenticatingFilter; import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
import org.junit.platform.commons.util.StringUtils; import org.junit.platform.commons.util.StringUtils;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.ServletRequest; import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/** /**
* Created by wolf on 20-11-6. * Created by wolf on 20-11-6.
...@@ -25,6 +30,14 @@ public class OAuth2Filter extends AuthenticatingFilter { ...@@ -25,6 +30,14 @@ public class OAuth2Filter extends AuthenticatingFilter {
return new OAuth2Token(token); return new OAuth2Token(token);
} }
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if (((HttpServletRequest) request).getMethod().equals(RequestMethod.OPTIONS.name())) {
return true;
}
return false;
}
@Override @Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception { protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
String token = getToken(servletRequest); String token = getToken(servletRequest);
...@@ -37,10 +50,37 @@ public class OAuth2Filter extends AuthenticatingFilter { ...@@ -37,10 +50,37 @@ public class OAuth2Filter extends AuthenticatingFilter {
httpServletResponse.getWriter().print(responseJson); httpServletResponse.getWriter().print(responseJson);
return false; return false;
} }
return executeLogin(servletRequest,servletResponse); return executeLogin(servletRequest, servletResponse);
}
@Override
protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, ServletRequest request, ServletResponse response) throws Exception {
System.out.println("======================token " + token);
System.out.println("======================subject " + subject.getPrincipal());
return true;
}
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setContentType("application/json;charset=utf-8");
httpServletResponse.setHeader("Access-Control-Allow-Credentials", "true");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String origin = httpServletRequest.getHeader("Origin");
httpServletResponse.setHeader("Access-Control-Allow-Origin", origin);
try {
Throwable throwable = e.getCause() == null ? e : e.getCause();
Result result = Result.error(HttpStatus.UNAUTHORIZED.value(), throwable.getMessage());
String json = JSON.toJSONString(result);
httpServletResponse.getWriter().print(json);
} catch (IOException ie) {
throw new BaseException(ie.getMessage());
}
return false;
} }
private String getToken(ServletRequest request) { private String getToken(ServletRequest request) {
return ((HttpServletRequest) request).getHeader("X-Token"); return ((HttpServletRequest) request).getHeader("token");
} }
} }
...@@ -6,11 +6,14 @@ import com.pannk.mms.common.utils.RedisUtil; ...@@ -6,11 +6,14 @@ import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.modules.sys.entity.SysUserEntity; import com.pannk.mms.modules.sys.entity.SysUserEntity;
import org.apache.shiro.authc.*; import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.Set;
/** /**
* Created by wolf on 20-11-6. * Created by wolf on 20-11-6.
*/ */
...@@ -20,6 +23,11 @@ public class OAuth2Realm extends AuthorizingRealm { ...@@ -20,6 +23,11 @@ public class OAuth2Realm extends AuthorizingRealm {
@Autowired @Autowired
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof OAuth2Token;
}
/** /**
* 授权 * 授权
* *
...@@ -28,8 +36,11 @@ public class OAuth2Realm extends AuthorizingRealm { ...@@ -28,8 +36,11 @@ public class OAuth2Realm extends AuthorizingRealm {
*/ */
@Override @Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SysUserEntity sysUserEntity = (SysUserEntity) principalCollection.getPrimaryPrincipal();
return null; Set<String> perms = redisUtil.getEntity(Constant.PERMS_CAHCE + sysUserEntity.getId(), Set.class);
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.setStringPermissions(perms);
return info;
} }
/** /**
...@@ -46,7 +57,7 @@ public class OAuth2Realm extends AuthorizingRealm { ...@@ -46,7 +57,7 @@ public class OAuth2Realm extends AuthorizingRealm {
if (sysUserEntity == null) { if (sysUserEntity == null) {
throw new BaseException("token失效,请重新登录"); throw new BaseException("token失效,请重新登录");
} }
if (sysUserEntity.getStatus() == 0) { if (sysUserEntity.getStatus() == 1) {
throw new LockedAccountException("账号被锁定,清联系管理员处理"); throw new LockedAccountException("账号被锁定,清联系管理员处理");
} }
return new SimpleAuthenticationInfo(sysUserEntity, token, getName()); return new SimpleAuthenticationInfo(sysUserEntity, token, getName());
......
package com.pannk.mms.common.utils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* Created by wolf on 20-11-20.
*/
@Component
public class SpringContextUtils implements ApplicationContextAware {
public static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
SpringContextUtils.applicationContext = applicationContext;
}
public static Object getBean(String name) {
return applicationContext.getBean(name);
}
public static <T> T getBean(String name, Class<T> requriedType) {
return applicationContext.getBean(name, requriedType);
}
}
...@@ -33,6 +33,8 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -33,6 +33,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/** /**
* @author:wolf * @author:wolf
* @date:2020/11/2 23:13 * @date:2020/11/2 23:13
...@@ -50,7 +52,8 @@ public class SysLoginController extends BaseController { ...@@ -50,7 +52,8 @@ public class SysLoginController extends BaseController {
} }
@PostMapping("/logout") @PostMapping("/logout")
public Result logout() { public Result logout(HttpServletRequest request) {
sysUserService.logout(getUserId(),request.getHeader("token"));
return Result.success(); return Result.success();
} }
} }
...@@ -44,10 +44,16 @@ public class SysMenuController extends BaseController { ...@@ -44,10 +44,16 @@ public class SysMenuController extends BaseController {
/** /**
* 用户菜单列表和权限 * 用户菜单列表和权限
*
* @return * @return
*/ */
@GetMapping("/nav") @GetMapping("/nav")
public Result nav(){ public Result nav() {
return Result.success(sysMenuService.getUserMenuList(getUserId())); return Result.success(sysMenuService.getUserMenuList(getUserId()));
} }
@GetMapping("/list")
public Result list() {
return Result.success(sysMenuService.list());
}
} }
package com.pannk.mms.modules.sys.controller; package com.pannk.mms.modules.sys.controller;
import com.pannk.mms.common.base.BaseController; import com.pannk.mms.common.base.BaseController;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Result; import com.pannk.mms.common.base.Result;
import com.pannk.mms.modules.sys.entity.SysUserEntity; import com.pannk.mms.modules.sys.entity.SysUserEntity;
import com.pannk.mms.modules.sys.service.SysUserService; import com.pannk.mms.modules.sys.service.SysUserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/** /**
* Created by wolf on 20-11-2. * Created by wolf on 20-11-2.
*/ */
...@@ -22,8 +26,8 @@ public class SysUserController extends BaseController { ...@@ -22,8 +26,8 @@ public class SysUserController extends BaseController {
@GetMapping("/list") @GetMapping("/list")
public Result list() { public Result list(@RequestParam Map<String,Object> params) {
return Result.success(sysUserService.list()); return Result.success(sysUserService.queryPage(params));
} }
@GetMapping("/info") @GetMapping("/info")
......
...@@ -28,6 +28,7 @@ import com.pannk.mms.modules.sys.entity.SysMenuEntity; ...@@ -28,6 +28,7 @@ import com.pannk.mms.modules.sys.entity.SysMenuEntity;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* @author:wolf * @author:wolf
...@@ -38,9 +39,18 @@ public interface SysMenuMapper extends BaseMapper<SysMenuEntity> { ...@@ -38,9 +39,18 @@ public interface SysMenuMapper extends BaseMapper<SysMenuEntity> {
/** /**
* 查询用户菜单 * 查询用户菜单
*
* @param userId 用户id * @param userId 用户id
* @return * @return
*/ */
List<SysMenuEntity> queryMenuList(Long userId); List<SysMenuEntity> queryMenuList(Long userId);
/**
* 查询用户权限标记
*
* @param userId 用户id
* @return
*/
Set<String> queryUserPerms(Long userId);
} }
package com.pannk.mms.modules.sys.service; package com.pannk.mms.modules.sys.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Result; import com.pannk.mms.common.base.Result;
import com.pannk.mms.modules.sys.entity.SysUserEntity; import com.pannk.mms.modules.sys.entity.SysUserEntity;
import com.pannk.mms.modules.sys.vo.LoginForm; import com.pannk.mms.modules.sys.vo.LoginForm;
import com.pannk.mms.modules.sys.vo.SysUserInfo; import com.pannk.mms.modules.sys.vo.SysUserInfo;
import java.util.Map;
/** /**
* 系统用户 * 系统用户
* *
...@@ -36,4 +39,20 @@ public interface SysUserService extends IService<SysUserEntity> { ...@@ -36,4 +39,20 @@ public interface SysUserService extends IService<SysUserEntity> {
* @return * @return
*/ */
SysUserInfo queryUserInfo(Long id); SysUserInfo queryUserInfo(Long id);
/**
* 退出登录
*
* @param userId 用户id
* @param token token
*/
void logout(Long userId, String token);
/**
* 查询分页用户
*
* @param params 参数
* @return
*/
PageData<SysUserEntity> queryPage(Map<String, Object> params);
} }
...@@ -26,12 +26,14 @@ package com.pannk.mms.modules.sys.service.impl; ...@@ -26,12 +26,14 @@ package com.pannk.mms.modules.sys.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pannk.mms.common.base.Constant; import com.pannk.mms.common.base.Constant;
import com.pannk.mms.common.utils.ListUtil; import com.pannk.mms.common.utils.ListUtil;
import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.modules.sys.dao.SysMenuMapper; import com.pannk.mms.modules.sys.dao.SysMenuMapper;
import com.pannk.mms.modules.sys.entity.SysMenuEntity; import com.pannk.mms.modules.sys.entity.SysMenuEntity;
import com.pannk.mms.modules.sys.service.SysMenuService; import com.pannk.mms.modules.sys.service.SysMenuService;
import com.pannk.mms.modules.sys.vo.SysMenuInfo; import com.pannk.mms.modules.sys.vo.SysMenuInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -48,29 +50,22 @@ import java.util.Set; ...@@ -48,29 +50,22 @@ import java.util.Set;
@Slf4j @Slf4j
@Service("sysMenuService") @Service("sysMenuService")
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenuEntity> implements SysMenuService { public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenuEntity> implements SysMenuService {
@Autowired
private RedisUtil redisUtil;
@Override @Override
public SysMenuInfo getUserMenuList(Long userId) { public SysMenuInfo getUserMenuList(Long userId) {
if (userId == Constant.SUPER_ADMIN) { List<SysMenuEntity> userMenuList = userId == Constant.SUPER_ADMIN ? getUserMenu(null) : getUserMenu(userId);
userId = null;
}
List<SysMenuEntity> userMenuList = getUserMenu(userId);
List<SysMenuEntity> menuList = getMenuList(userMenuList); List<SysMenuEntity> menuList = getMenuList(userMenuList);
Set<String> permissions = getPermissions(userMenuList); Set<String> permissions = userId == Constant.SUPER_ADMIN ? baseMapper.queryUserPerms(null) : baseMapper.queryUserPerms(userId);
redisUtil.set(Constant.PERMS_CAHCE + userId, permissions);
return new SysMenuInfo(menuList, permissions); return new SysMenuInfo(menuList, permissions);
} }
private Set<String> getPermissions(List<SysMenuEntity> list) {
Set<String> permissions = new HashSet<>();
for (SysMenuEntity entity : list) {
String perms =entity.getPerms();
if (StringUtils.isNotEmpty(perms)) {
permissions.add(perms);
}
}
return permissions;
}
private List<SysMenuEntity> getUserMenu(Long userId){ private List<SysMenuEntity> getUserMenu(Long userId) {
return baseMapper.queryMenuList(userId); return baseMapper.queryMenuList(userId);
} }
......
package com.pannk.mms.modules.sys.service.impl; package com.pannk.mms.modules.sys.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pannk.mms.common.base.Constant; import com.pannk.mms.common.base.Constant;
import com.pannk.mms.common.base.PageData;
import com.pannk.mms.common.base.Query;
import com.pannk.mms.common.base.Result; import com.pannk.mms.common.base.Result;
import com.pannk.mms.common.utils.RedisUtil; import com.pannk.mms.common.utils.RedisUtil;
import com.pannk.mms.common.utils.TokenUtil; import com.pannk.mms.common.utils.TokenUtil;
...@@ -13,10 +17,12 @@ import com.pannk.mms.modules.sys.service.SysUserService; ...@@ -13,10 +17,12 @@ import com.pannk.mms.modules.sys.service.SysUserService;
import com.pannk.mms.modules.sys.vo.LoginForm; import com.pannk.mms.modules.sys.vo.LoginForm;
import com.pannk.mms.modules.sys.vo.SysUserInfo; import com.pannk.mms.modules.sys.vo.SysUserInfo;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 系统用户服务 * 系统用户服务
...@@ -48,7 +54,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity ...@@ -48,7 +54,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity
return Result.error("账号被锁定,请联系管理员处理"); return Result.error("账号被锁定,请联系管理员处理");
} }
String token = TokenUtil.generateToken(); String token = TokenUtil.generateToken();
redisUtil.set(Constant.USER_CACHE+token, sysUserEntity,Constant.EXPIRE); redisUtil.set(Constant.USER_CACHE + token, sysUserEntity, Constant.EXPIRE);
return Result.success(token); return Result.success(token);
} }
...@@ -60,10 +66,20 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity ...@@ -60,10 +66,20 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity
return null; return null;
} }
List<SysRoleEntity> roles = sysRoleService.queryUserRole(sysUserEntity.getId()); List<SysRoleEntity> roles = sysRoleService.queryUserRole(sysUserEntity.getId());
BeanUtils.copyProperties(sysUserEntity, sysUserInfo);
sysUserInfo.setRoles(roles); sysUserInfo.setRoles(roles);
sysUserInfo.setAvatar("avatar");
sysUserInfo.setIntroduction("This is a user info");
sysUserInfo.setName(sysUserEntity.getFullName());
return sysUserInfo; return sysUserInfo;
} }
@Override
public void logout(Long userId, String token) {
redisUtil.del(Constant.USER_CACHE + token);
redisUtil.del(Constant.PERMS_CAHCE + userId);
}
@Override
public PageData<SysUserEntity> queryPage(Map<String, Object> params) {
IPage<SysUserEntity> page = this.page(new Query<SysUserEntity>().getPage(params), new QueryWrapper<>());
return new PageData<>(page);
}
} }
package com.pannk.mms.modules.sys.vo; package com.pannk.mms.modules.sys.vo;
import com.pannk.mms.modules.sys.entity.SysRoleEntity; import com.pannk.mms.modules.sys.entity.SysRoleEntity;
import com.pannk.mms.modules.sys.entity.SysUserEntity;
import lombok.Data; import lombok.Data;
import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* Created by wolf on 20-11-18. * Created by wolf on 20-11-18.
*/ */
@Data @Data
public class SysUserInfo implements Serializable { public class SysUserInfo extends SysUserEntity {
//roles, name, avatar, introduction
/** /**
* 用户角色 * 用户角色
*/ */
List<SysRoleEntity> roles; List<SysRoleEntity> roles;
/**
* 用户名称
*/
String name;
/**
* 头像
*/
String avatar;
/**
* 介绍
*/
String introduction;
} }
...@@ -2,13 +2,29 @@ ...@@ -2,13 +2,29 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org/DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.pannk.mms.modules.sys.dao.SysMenuMapper"> <mapper namespace="com.pannk.mms.modules.sys.dao.SysMenuMapper">
<select id="queryMenuList" resultType="com.pannk.mms.modules.sys.entity.SysMenuEntity"> <sql id="chooseSql">
SELECT * FROM sys_menu
<choose> <choose>
<when test="userId!=null and userId!=''"> <when test="userId!=null and userId!=''">
WHERE id in (SELECT DISTINCT srm.menu_id FROM sys_user_role sur LEFT JOIN sys_role_menu srm ON sur.role_id=srm.role_id AND id in (SELECT DISTINCT srm.menu_id FROM sys_user_role sur LEFT JOIN sys_role_menu srm ON
sur.role_id=srm.role_id
WHERE user_id=#{userId}) WHERE user_id=#{userId})
</when> </when>
</choose> </choose>
</sql>
<select id="queryMenuList" resultType="com.pannk.mms.modules.sys.entity.SysMenuEntity">
SELECT * FROM sys_menu
<where>
type!=2
<include refid="chooseSql"/>
</where>
</select> </select>
<select id="queryUserPerms" resultType="java.lang.String">
SELECT perms FROM sys_menu
<where>
perms is not null and perms != ''
<include refid="chooseSql"/>
</where>
</select>
</mapper> </mapper>
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册