From a2af56eadf8c0ec3a3c3e53580a328b92d6509e2 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Mon, 26 Feb 2018 23:46:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=A7=92=E8=89=B2=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ll_20180225.sql => new_intall_20180226.sql | 66 ++++----- pom.xml | 134 ++++++++---------- .../ruoyi/framework/config/BaseConfig.java | 10 +- .../ruoyi/framework/config/ShiroConfig.java | 18 ++- .../project/shiro/realm/LoginService.java | 7 - .../ruoyi/project/shiro/realm/UserRealm.java | 18 +-- .../shiro/session/OnlineSessionDAO.java | 4 +- .../filter/online/OnlineSessionFilter.java | 17 ++- .../filter/sync/SyncOnlineSessionFilter.java | 1 + .../project/system/menu/dao/IMenuDao.java | 2 +- .../project/system/menu/dao/MenuDaoImpl.java | 2 +- .../system/menu/service/MenuServiceImpl.java | 2 +- .../system/online/domain/OnlineSession.java | 13 -- .../system/online/domain/UserOnline.java | 4 - .../project/system/role/dao/IRoleDao.java | 21 +++ .../project/system/role/dao/RoleDaoImpl.java | 39 +++++ .../system/role/service/IRoleService.java | 21 +++ .../system/role/service/RoleServiceImpl.java | 45 ++++++ .../project/system/user/domain/User.java | 3 - src/main/resources/application.yml | 7 + .../mybatis/system/SystemOnlineMapper.xml | 5 +- .../mybatis/system/SystemRoleMapper.xml | 25 ++++ .../mybatis/system/SystemUserMapper.xml | 17 +-- src/main/resources/templates/index.html | 2 +- .../templates/monitor/online/online.html | 3 +- 25 files changed, 302 insertions(+), 184 deletions(-) rename new_intall_20180225.sql => new_intall_20180226.sql (86%) create mode 100644 src/main/java/com/ruoyi/project/system/role/dao/IRoleDao.java create mode 100644 src/main/java/com/ruoyi/project/system/role/dao/RoleDaoImpl.java create mode 100644 src/main/java/com/ruoyi/project/system/role/service/IRoleService.java create mode 100644 src/main/java/com/ruoyi/project/system/role/service/RoleServiceImpl.java create mode 100644 src/main/resources/mybatis/system/SystemRoleMapper.xml diff --git a/new_intall_20180225.sql b/new_intall_20180226.sql similarity index 86% rename from new_intall_20180225.sql rename to new_intall_20180226.sql index 32bac40fa..1e38e73ac 100644 --- a/new_intall_20180225.sql +++ b/new_intall_20180226.sql @@ -14,9 +14,9 @@ create table sys_dept ( -- ---------------------------- -- 初始化-部门表数据 -- ---------------------------- -insert into sys_dept values('1', '0', '研发部', '1', '0'); -insert into sys_dept values('2', '0', '测试部', '2', '0'); -insert into sys_dept values('3', '0', '市场部', '3', '0'); +insert into sys_dept values('1', '0', '研发部门', '1', '0'); +insert into sys_dept values('2', '0', '测试部门', '2', '0'); +insert into sys_dept values('3', '0', '市场部门', '3', '0'); insert into sys_dept values('4', '1', '研发一部', '1', '0'); insert into sys_dept values('5', '1', '研发二部', '2', '0'); @@ -61,6 +61,7 @@ drop table if exists sys_role; create table sys_role ( role_id int(10) not null auto_increment comment '角色ID', role_name varchar(30) not null comment '角色名', + role_key varchar(100) not null comment '角色权限字符串', status int(1) default 0 comment '角色状态:0正常,1禁用', create_time varchar(30) default null comment '创建时间', update_time varchar(30) default null comment '更新时间', @@ -72,8 +73,8 @@ create table sys_role ( -- ---------------------------- -- 初始化-角色信息表数据 -- ---------------------------- -insert into sys_role values('1', '管理员', 0, '2018-01-01', '', 'system', '管理员'); -insert into sys_role values('2', '普通角色', 0, '2018-01-01', '', 'system', '普通角色'); +insert into sys_role values('1', '管理员', 'admin', 0, '2018-01-01', '', 'system', '管理员'); +insert into sys_role values('2', '普通角色', 'common', 0, '2018-01-01', '', 'system', '普通角色'); @@ -89,7 +90,7 @@ create table sys_menu ( url varchar(200) default '' comment '菜单URL', menu_type char(1) default '' comment '类型:M目录,C菜单,F按钮', visible int(1) default 0 comment '菜单状态:0显示,1隐藏', - perms varchar(100) default '' comment '权限字符串', + perms varchar(100) default '' comment '菜单权限字符串', icon varchar(100) default '' comment '菜单图标', create_time varchar(30) default null comment '创建时间', update_time varchar(30) default null comment '更新时间', @@ -102,36 +103,36 @@ create table sys_menu ( -- 初始化-菜单信息表数据 -- ---------------------------- -- 一级菜单 -insert into sys_menu values('1', '系统管理', '0', '1', '#', 'M', '0', 'system', 'fa fa-gear', '2018-01-01', '', 'system', '系统管理目录'); -insert into sys_menu values('2', '系统监控', '0', '2', '#', 'M', '0', 'monitor', 'fa fa-video-camera', '2018-01-01', '', 'system', '系统监控目录'); +insert into sys_menu values('1', '系统管理', '0', '1', '#', 'M', '0', '#', 'fa fa-gear', '2018-01-01', '', 'admin', '系统管理目录'); +insert into sys_menu values('2', '系统监控', '0', '2', '#', 'M', '0', '#', 'fa fa-video-camera', '2018-01-01', '', 'admin', '系统监控目录'); -- 二级菜单 -insert into sys_menu values('3', '用户管理', '1', '1', '/system/user/userList', 'C', '0', 'system:user:list', '#', '2018-01-01', '', 'system', '用户管理菜单'); -insert into sys_menu values('4', '角色管理', '1', '2', '/system/role/roleList', 'C', '0', 'system:role:list', '#', '2018-01-01', '', 'system', '角色管理菜单'); -insert into sys_menu values('5', '菜单管理', '1', '3', '/system/menu/menuList', 'C', '0', 'system:menu:list', '#', '2018-01-01', '', 'system', '菜单管理菜单'); -insert into sys_menu values('6', '操作日志', '1', '4', '/system/operlog/operlogList', 'C', '0', 'system:operlog:list', '#', '2018-01-01', '', 'system', '操作日志菜单'); -insert into sys_menu values('7', '登录日志', '1', '5', '/system/userlog/userlogList', 'C', '0', 'system:userlog:list', '#', '2018-01-01', '', 'system', '登录日志菜单'); -insert into sys_menu values('8', '在线用户', '2', '1', '/monitor/online', 'C', '0', 'monitor:online', '#', '2018-01-01', '', 'system', '在线用户菜单'); -insert into sys_menu values('9', '数据监控', '2', '2', '/monitor/druid/index.html', 'C', '0', 'monitor:druid:list', '#', '2018-01-01', '', 'system', '数据监控菜单'); +insert into sys_menu values('3', '用户管理', '1', '1', '/system/user/userList', 'C', '0', 'system:user:list', '#', '2018-01-01', '', 'admin', '用户管理菜单'); +insert into sys_menu values('4', '角色管理', '1', '2', '/system/role/roleList', 'C', '0', 'system:role:list', '#', '2018-01-01', '', 'admin', '角色管理菜单'); +insert into sys_menu values('5', '菜单管理', '1', '3', '/system/menu/menuList', 'C', '0', 'system:menu:list', '#', '2018-01-01', '', 'admin', '菜单管理菜单'); +insert into sys_menu values('6', '操作日志', '1', '4', '/system/operlog/operlogList', 'C', '0', 'system:operlog:list', '#', '2018-01-01', '', 'admin', '操作日志菜单'); +insert into sys_menu values('7', '登录日志', '1', '5', '/system/userlog/userlogList', 'C', '0', 'system:userlog:list', '#', '2018-01-01', '', 'admin', '登录日志菜单'); +insert into sys_menu values('8', '在线用户', '2', '1', '/monitor/online', 'C', '0', 'monitor:online', '#', '2018-01-01', '', 'admin', '在线用户菜单'); +insert into sys_menu values('9', '数据监控', '2', '2', '/monitor/druid/index.html', 'C', '0', 'monitor:druid:list', '#', '2018-01-01', '', 'admin', '数据监控菜单'); --- 三级用户按钮 -insert into sys_menu values('10', '用户新增', '3', '1', '/system/user/add', 'F', '0', 'sys:user:add', '#', '2018-01-01', '', 'system', '用户管理新增按钮'); -insert into sys_menu values('11', '用户修改', '3', '2', '/system/user/update', 'F', '0', 'sys:user:update', '#', '2018-01-01', '', 'system', '用户管理修改按钮'); -insert into sys_menu values('12', '用户删除', '3', '3', '/system/user/delete', 'F', '0', 'sys:user:delete', '#', '2018-01-01', '', 'system', '用户管理删除按钮'); -insert into sys_menu values('13', '用户查询', '3', '4', '/system/user/select', 'F', '0', 'sys:user:select', '#', '2018-01-01', '', 'system', '用户管理查询按钮'); -insert into sys_menu values('14', '密码修改', '3', '5', '/system/user/pwdUpdate', 'F', '0', 'sys:user:pwdUpdate', '#', '2018-01-01', '', 'system', '用户密码修改按钮'); +insert into sys_menu values('10', '用户新增', '3', '1', '/system/user/add', 'F', '0', 'sys:user:add', '#', '2018-01-01', '', 'admin', '用户管理新增按钮'); +insert into sys_menu values('11', '用户修改', '3', '2', '/system/user/update', 'F', '0', 'sys:user:update', '#', '2018-01-01', '', 'admin', '用户管理修改按钮'); +insert into sys_menu values('12', '用户删除', '3', '3', '/system/user/delete', 'F', '0', 'sys:user:delete', '#', '2018-01-01', '', 'admin', '用户管理删除按钮'); +insert into sys_menu values('13', '用户查询', '3', '4', '/system/user/select', 'F', '0', 'sys:user:select', '#', '2018-01-01', '', 'admin', '用户管理查询按钮'); +insert into sys_menu values('14', '密码修改', '3', '5', '/system/user/pwdUpdate', 'F', '0', 'sys:user:pwdUpdate', '#', '2018-01-01', '', 'admin', '用户密码修改按钮'); --- 三级角色按钮 -insert into sys_menu values('15', '角色新增', '4', '1', '/system/role/add', 'F', '0', 'sys:role:add', '#', '2018-01-01', '', 'system', '角色管理新增按钮'); -insert into sys_menu values('16', '角色修改', '4', '2', '/system/role/update', 'F', '0', 'sys:role:update', '#', '2018-01-01', '', 'system', '角色管理修改按钮'); -insert into sys_menu values('17', '角色删除', '4', '3', '/system/role/delete', 'F', '0', 'sys:role:delete', '#', '2018-01-01', '', 'system', '角色管理删除按钮'); -insert into sys_menu values('18', '角色查询', '4', '4', '/system/role/select', 'F', '0', 'sys:role:select', '#', '2018-01-01', '', 'system', '角色管理查询按钮'); -insert into sys_menu values('19', '角色授权', '4', '5', '/system/role/auth', 'F', '0', 'sys:role:auth', '#', '2018-01-01', '', 'system', '角色管理授权按钮'); +insert into sys_menu values('15', '角色新增', '4', '1', '/system/role/add', 'F', '0', 'sys:role:add', '#', '2018-01-01', '', 'admin', '角色管理新增按钮'); +insert into sys_menu values('16', '角色修改', '4', '2', '/system/role/update', 'F', '0', 'sys:role:update', '#', '2018-01-01', '', 'admin', '角色管理修改按钮'); +insert into sys_menu values('17', '角色删除', '4', '3', '/system/role/delete', 'F', '0', 'sys:role:delete', '#', '2018-01-01', '', 'admin', '角色管理删除按钮'); +insert into sys_menu values('18', '角色查询', '4', '4', '/system/role/select', 'F', '0', 'sys:role:select', '#', '2018-01-01', '', 'admin', '角色管理查询按钮'); +insert into sys_menu values('19', '角色授权', '4', '5', '/system/role/auth', 'F', '0', 'sys:role:auth', '#', '2018-01-01', '', 'admin', '角色管理授权按钮'); --- 三级菜单按钮 -insert into sys_menu values('20', '菜单新增', '5', '1', '/system/menu/add', 'F', '0', 'sys:menu:add', '#', '2018-01-01', '', 'system', '菜单管理新增按钮'); -insert into sys_menu values('21', '菜单修改', '5', '2', '/system/menu/update', 'F', '0', 'sys:menu:update', '#', '2018-01-01', '', 'system', '菜单管理修改按钮'); -insert into sys_menu values('22', '菜单删除', '5', '3', '/system/menu/delete', 'F', '0', 'sys:menu:delete', '#', '2018-01-01', '', 'system', '菜单管理删除按钮'); +insert into sys_menu values('20', '菜单新增', '5', '1', '/system/menu/add', 'F', '0', 'sys:menu:add', '#', '2018-01-01', '', 'admin', '菜单管理新增按钮'); +insert into sys_menu values('21', '菜单修改', '5', '2', '/system/menu/update', 'F', '0', 'sys:menu:update', '#', '2018-01-01', '', 'admin', '菜单管理修改按钮'); +insert into sys_menu values('22', '菜单删除', '5', '3', '/system/menu/delete', 'F', '0', 'sys:menu:delete', '#', '2018-01-01', '', 'admin', '菜单管理删除按钮'); insert into sys_menu values('23', '菜单查询', '5', '4', '/system/menu/select', 'F', '0', 'sys:menu:select', '#', '2018-01-01', '', 'system', '菜单管理查询按钮'); --- 三级日志按钮 -insert into sys_menu values('24', '操作日志查询', '4', '5', '/system/operlog/auth', 'F', '0', 'sys:operlog:select', '#', '2018-01-01', '', 'system', '操作日志查询按钮'); -insert into sys_menu values('25', '登录日志查询', '4', '5', '/system/userlog/auth', 'F', '0', 'sys:userlog:select', '#', '2018-01-01', '', 'system', '登录日志查询按钮'); +insert into sys_menu values('24', '操作日志查询', '4', '5', '/system/operlog/auth', 'F', '0', 'sys:operlog:select', '#', '2018-01-01', '', 'admin', '操作日志查询按钮'); +insert into sys_menu values('25', '登录日志查询', '4', '5', '/system/userlog/auth', 'F', '0', 'sys:userlog:select', '#', '2018-01-01', '', 'admin', '登录日志查询按钮'); -- ---------------------------- @@ -257,7 +258,6 @@ create table sys_user_online ( sessionId varchar(50) default '' comment '用户会话id', login_name varchar(50) default '' comment '登录名称', dept_name varchar(50) default '' comment '部门名称', - role_name varchar(50) default '' comment '角色名称', ipaddr varchar(50) default '' comment '登录IP地址', browser varchar(50) default '' comment '浏览器类型', os varchar(50) default '' comment '操作系统', @@ -268,8 +268,8 @@ create table sys_user_online ( primary key (sessionId) ) engine=innodb default charset=utf8; -insert into sys_user_online(sessionId, login_name, dept_name, role_name, ipaddr, browser, os, status) -values('c3b252c3-2229-4be4-a5f7-7aba4b0c314c', 'admin', '开发部', '管理员', '127.0.0.1', 'Chrome 45', 'Windows 7', 'on_line'); +insert into sys_user_online(sessionId, login_name, dept_name, ipaddr, browser, os, status) +values('c3b252c3-2229-4be4-a5f7-7aba4b0c314c', 'admin', '开发部', '127.0.0.1', 'Chrome 45', 'Windows 7', 'on_line'); -- 用户部门表 SELECT * FROM sys_dept; diff --git a/pom.xml b/pom.xml index 9973a4229..4bf4c8d80 100644 --- a/pom.xml +++ b/pom.xml @@ -9,8 +9,8 @@ jar RuoYi - 云管理系统 - + 若依管理系统 + org.springframework.boot spring-boot-starter-parent @@ -22,160 +22,141 @@ UTF-8 UTF-8 1.8 + 1.3.2 + 1.2.1 + 1.1.1 + 1.2.31 + 1.0.28 + 3.6 + 1.19 + 1.16.18 1.0.4 1.7 + + org.springframework.boot spring-boot-starter + org.springframework.boot spring-boot-starter-test test + + org.springframework.boot spring-boot-starter-aop - + + org.springframework.boot spring-boot-starter-web + + org.springframework.boot spring-boot-starter-thymeleaf + + net.sourceforge.nekohtml nekohtml - + + mysql mysql-connector-java + + org.mybatis.spring.boot mybatis-spring-boot-starter - 1.1.1 + ${mybatis-spring-boot-starter.version} - + + com.alibaba druid - 1.0.28 + ${druid.version} - + + org.apache.commons commons-lang3 - 3.6 + ${commons.lang3.version} - - commons-configuration - commons-configuration - 1.10 - - - commons-io - commons-io - 2.5 - - + + org.apache.shiro shiro-core - 1.3.2 + ${shiro.version} + + org.apache.shiro shiro-spring - 1.3.2 + ${shiro.version} - + + org.apache.shiro shiro-ehcache - 1.3.2 + ${shiro.version} + + com.github.theborakompanioni thymeleaf-extras-shiro - 1.2.1 + ${thymeleaf-extras-shiro.version} - + + com.alibaba fastjson - 1.2.31 - - - - org.apache.velocity - velocity - 1.7 - - - - org.springframework.boot - spring-boot-starter-cache - - - net.sf.ehcache - ehcache + ${fastjson.version} + eu.bitwalker UserAgentUtils - 1.19 + ${bitwalker.version} - + + org.projectlombok lombok - 1.16.18 + ${lombok.version} - - - org.quartz-scheduler - quartz - 2.2.1 - - - slf4j-api - org.slf4j - - - + + org.springframework spring-context-support - - org.springframework.boot - spring-boot-devtools - true - - - - org.apache.httpcomponents - httpclient - 4.4 - - - - org.apache.httpcomponents - httpcore - 4.4 - - + + @@ -187,6 +168,7 @@ + public @@ -197,6 +179,7 @@ + public @@ -210,4 +193,5 @@ + diff --git a/src/main/java/com/ruoyi/framework/config/BaseConfig.java b/src/main/java/com/ruoyi/framework/config/BaseConfig.java index 8508b2143..448983be2 100644 --- a/src/main/java/com/ruoyi/framework/config/BaseConfig.java +++ b/src/main/java/com/ruoyi/framework/config/BaseConfig.java @@ -1,5 +1,6 @@ package com.ruoyi.framework.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; @@ -13,13 +14,20 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter @Configuration public class BaseConfig extends WebMvcConfigurerAdapter { + + /** + * 强制退出后重定向的地址 + */ + @Value("${shiro.user.indexUrl}") + private String indexUrl; + /** * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页 */ @Override public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/").setViewName("forward:/index"); + registry.addViewController("/").setViewName("forward:" + indexUrl); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); super.addViewControllers(registry); } diff --git a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java index 935b0b836..204f3aa68 100644 --- a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java +++ b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -42,7 +42,15 @@ public class ShiroConfig // 相隔多久检查一次session的有效性,单位毫秒,默认就是10分钟 @Value("${shiro.session.validationInterval}") private int validationInterval; - + + // 登录地址 + @Value("${shiro.user.loginUrl}") + private String loginUrl; + + // 权限认证失败地址 + @Value("${shiro.user.unauthorizedUrl}") + private String unauthorizedUrl; + @Autowired private IMenuService menuService; @@ -174,12 +182,12 @@ public class ShiroConfig // Shiro的核心安全接口,这个属性是必须的 shiroFilterFactoryBean.setSecurityManager(securityManager); // 身份认证失败,则跳转到登录页面的配置 - shiroFilterFactoryBean.setLoginUrl("/login"); + shiroFilterFactoryBean.setLoginUrl(loginUrl); // 权限认证失败,则跳转到指定页面 - shiroFilterFactoryBean.setUnauthorizedUrl("/unauth"); + shiroFilterFactoryBean.setUnauthorizedUrl(unauthorizedUrl); // 注销成功,则跳转到指定页面 LogoutFilter logoutFilter = new LogoutFilter(); - logoutFilter.setRedirectUrl("/login"); + logoutFilter.setRedirectUrl(loginUrl); // Shiro连接约束配置,即过滤链的定义 LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); // 对静态资源设置匿名访问 @@ -219,7 +227,7 @@ public class ShiroConfig public OnlineSessionFilter onlineSessionFilter() { OnlineSessionFilter onlineSessionFilter = new OnlineSessionFilter(); - onlineSessionFilter.setLoginUrl("/login"); + onlineSessionFilter.setLoginUrl(loginUrl); return onlineSessionFilter; } diff --git a/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java b/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java index c5a668141..f4a220f57 100644 --- a/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java +++ b/src/main/java/com/ruoyi/project/shiro/realm/LoginService.java @@ -3,7 +3,6 @@ package com.ruoyi.project.shiro.realm; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; - import com.ruoyi.framework.constant.CommonConstant; import com.ruoyi.project.shiro.common.Constants; import com.ruoyi.project.shiro.common.utils.MessageUtils; @@ -74,12 +73,6 @@ public class LoginService throw new UserBlockedException(user.getRefuseDes()); } - if (Constants.ROLE_BLOCKED.equals(user.getRole().getStatus())) - { - SystemLogUtils.log(username, CommonConstant.LOGIN_FAIL, MessageUtils.message("role.blocked", user.getRole().getRemark())); - throw new RoleBlockedException(user.getRole().getRemark()); - } - SystemLogUtils.log(username, CommonConstant.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); return user; } diff --git a/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java b/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java index f01eb7d17..d711f1a0b 100644 --- a/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java +++ b/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java @@ -1,6 +1,5 @@ package com.ruoyi.project.shiro.realm; -import java.util.Set; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -15,7 +14,7 @@ import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.springframework.beans.factory.annotation.Autowired; -import com.ruoyi.common.tools.StringTools; + import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.project.shiro.exception.JCaptchaException; import com.ruoyi.project.shiro.exception.user.RoleBlockedException; @@ -24,7 +23,9 @@ import com.ruoyi.project.shiro.exception.user.UserNotExistsException; import com.ruoyi.project.shiro.exception.user.UserPasswordNotMatchException; import com.ruoyi.project.shiro.exception.user.UserPasswordRetryLimitExceedException; import com.ruoyi.project.system.menu.service.IMenuService; +import com.ruoyi.project.system.role.service.IRoleService; import com.ruoyi.project.system.user.domain.User; + import lombok.extern.slf4j.Slf4j; /** @@ -38,6 +39,9 @@ public class UserRealm extends AuthorizingRealm @Autowired private IMenuService menuService; + + @Autowired + private IRoleService roleService; @Autowired private LoginService loginService; @@ -49,13 +53,11 @@ public class UserRealm extends AuthorizingRealm protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { Long userId = ShiroUtils.getUserId(); - Set perms = menuService.selectPermsByUserId(userId); SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); - if (StringTools.isNotEmpty(perms)) - { - // // 权限加入AuthorizationInfo认证对象 - info.setStringPermissions(perms); - } + // 角色加入AuthorizationInfo认证对象 + info.setRoles(roleService.selectRolesByUserId(userId)); + // 权限加入AuthorizationInfo认证对象 + info.setStringPermissions(menuService.selectPermsByUserId(userId)); return info; } diff --git a/src/main/java/com/ruoyi/project/shiro/session/OnlineSessionDAO.java b/src/main/java/com/ruoyi/project/shiro/session/OnlineSessionDAO.java index 03d69add9..a588ed586 100644 --- a/src/main/java/com/ruoyi/project/shiro/session/OnlineSessionDAO.java +++ b/src/main/java/com/ruoyi/project/shiro/session/OnlineSessionDAO.java @@ -2,13 +2,13 @@ package com.ruoyi.project.shiro.session; import java.io.Serializable; import java.util.Date; + import javax.servlet.http.HttpServletRequest; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.shiro.session.Session; import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; - import com.ruoyi.project.system.online.domain.OnlineSession; import com.ruoyi.project.system.online.domain.UserOnline; import com.ruoyi.project.system.online.service.IUserOnlineService; diff --git a/src/main/java/com/ruoyi/project/shiro/web/filter/online/OnlineSessionFilter.java b/src/main/java/com/ruoyi/project/shiro/web/filter/online/OnlineSessionFilter.java index b9eff9f56..92e3f121f 100644 --- a/src/main/java/com/ruoyi/project/shiro/web/filter/online/OnlineSessionFilter.java +++ b/src/main/java/com/ruoyi/project/shiro/web/filter/online/OnlineSessionFilter.java @@ -8,29 +8,30 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.web.filter.AccessControlFilter; import org.apache.shiro.web.util.WebUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.project.shiro.ShiroConstants; import com.ruoyi.project.shiro.session.OnlineSessionDAO; import com.ruoyi.project.system.online.domain.OnlineSession; import com.ruoyi.project.system.user.domain.User; - +/** + * 自定义访问控制 + * @author yangzz + * + */ public class OnlineSessionFilter extends AccessControlFilter { /** * 强制退出后重定向的地址 */ - private String forceLogoutUrl = "/login"; + @Value("${shiro.user.loginUrl}") + private String loginUrl; @Autowired private OnlineSessionDAO onlineSessionDAO; - public String getForceLogoutUrl() - { - return forceLogoutUrl; - } - /** * 表示是否允许访问;mappedValue就是[urls]配置中拦截器参数部分,如果允许访问返回true,否则false; */ @@ -58,7 +59,6 @@ public class OnlineSessionFilter extends AccessControlFilter onlineSession.setUserId(user.getUserId()); onlineSession.setLoginName(user.getLoginName()); onlineSession.setDeptName(user.getDept().getDeptName()); - onlineSession.setRoleName(user.getRole().getRoleName()); onlineSession.markAttributeChanged(); } } @@ -90,7 +90,6 @@ public class OnlineSessionFilter extends AccessControlFilter @Override protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException { - String loginUrl = getForceLogoutUrl(); WebUtils.issueRedirect(request, response, loginUrl); } diff --git a/src/main/java/com/ruoyi/project/shiro/web/filter/sync/SyncOnlineSessionFilter.java b/src/main/java/com/ruoyi/project/shiro/web/filter/sync/SyncOnlineSessionFilter.java index cc640c985..0b4a0f17d 100644 --- a/src/main/java/com/ruoyi/project/shiro/web/filter/sync/SyncOnlineSessionFilter.java +++ b/src/main/java/com/ruoyi/project/shiro/web/filter/sync/SyncOnlineSessionFilter.java @@ -31,6 +31,7 @@ public class SyncOnlineSessionFilter extends PathMatchingFilter { OnlineSession session = (OnlineSession) request.getAttribute(ShiroConstants.ONLINE_SESSION); // 如果session stop了 也不同步 + // session停止时间,如果stopTimestamp不为null,则代表已停止 if (session != null && session.getUserId() != null && session.getStopTimestamp() == null) { onlineSessionDAO.syncToDb(session); diff --git a/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java b/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java index c325a74d8..880f2c2d1 100644 --- a/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java +++ b/src/main/java/com/ruoyi/project/system/menu/dao/IMenuDao.java @@ -4,7 +4,7 @@ import java.util.List; import com.ruoyi.project.system.menu.domain.Menu; /** - * 角色表 数据层 + * 菜单表 数据层 * * @author yangzz */ diff --git a/src/main/java/com/ruoyi/project/system/menu/dao/MenuDaoImpl.java b/src/main/java/com/ruoyi/project/system/menu/dao/MenuDaoImpl.java index ca9b38c1d..cf3fa0b29 100644 --- a/src/main/java/com/ruoyi/project/system/menu/dao/MenuDaoImpl.java +++ b/src/main/java/com/ruoyi/project/system/menu/dao/MenuDaoImpl.java @@ -6,7 +6,7 @@ import com.ruoyi.framework.core.dao.DynamicObjectBaseDao; import com.ruoyi.project.system.menu.domain.Menu; /** - * 用户 数据层处理 + * 菜单 数据层处理 * * @author yangzz */ diff --git a/src/main/java/com/ruoyi/project/system/menu/service/MenuServiceImpl.java b/src/main/java/com/ruoyi/project/system/menu/service/MenuServiceImpl.java index 963bd592c..c1f7d316e 100644 --- a/src/main/java/com/ruoyi/project/system/menu/service/MenuServiceImpl.java +++ b/src/main/java/com/ruoyi/project/system/menu/service/MenuServiceImpl.java @@ -17,7 +17,7 @@ import com.ruoyi.project.system.menu.domain.Menu; import com.ruoyi.project.util.TreeUtil; /** - * 用户 业务层处理 + * 菜单 业务层处理 * * @author yangzz */ diff --git a/src/main/java/com/ruoyi/project/system/online/domain/OnlineSession.java b/src/main/java/com/ruoyi/project/system/online/domain/OnlineSession.java index 897424477..f20e85034 100644 --- a/src/main/java/com/ruoyi/project/system/online/domain/OnlineSession.java +++ b/src/main/java/com/ruoyi/project/system/online/domain/OnlineSession.java @@ -19,9 +19,6 @@ public class OnlineSession extends SimpleSession // 部门名称 private String deptName; - // 角色名称 - private String roleName; - // 登录IP地址 private String host; @@ -99,16 +96,6 @@ public class OnlineSession extends SimpleSession this.deptName = deptName; } - public String getRoleName() - { - return roleName; - } - - public void setRoleName(String roleName) - { - this.roleName = roleName; - } - public OnlineStatus getStatus() { return status; diff --git a/src/main/java/com/ruoyi/project/system/online/domain/UserOnline.java b/src/main/java/com/ruoyi/project/system/online/domain/UserOnline.java index a80e0c254..ef8ed703e 100644 --- a/src/main/java/com/ruoyi/project/system/online/domain/UserOnline.java +++ b/src/main/java/com/ruoyi/project/system/online/domain/UserOnline.java @@ -21,9 +21,6 @@ public class UserOnline // 登录名称 private String loginName; - // 角色名称 - private String roleName; - // 登录IP地址 private String ipaddr; @@ -57,7 +54,6 @@ public class UserOnline online.setSessionId(String.valueOf(session.getId())); online.setDeptName(session.getDeptName()); online.setLoginName(session.getLoginName()); - online.setRoleName(session.getRoleName()); online.setStartTimestamp(session.getStartTimestamp()); online.setLastAccessTime(session.getLastAccessTime()); online.setExpireTime(session.getTimeout()); diff --git a/src/main/java/com/ruoyi/project/system/role/dao/IRoleDao.java b/src/main/java/com/ruoyi/project/system/role/dao/IRoleDao.java new file mode 100644 index 000000000..220343aea --- /dev/null +++ b/src/main/java/com/ruoyi/project/system/role/dao/IRoleDao.java @@ -0,0 +1,21 @@ +package com.ruoyi.project.system.role.dao; + +import java.util.List; + +/** + * 角色表 数据层 + * + * @author yangzz + */ +public interface IRoleDao +{ + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + public List selectRolesByUserId(Long userId); + +} diff --git a/src/main/java/com/ruoyi/project/system/role/dao/RoleDaoImpl.java b/src/main/java/com/ruoyi/project/system/role/dao/RoleDaoImpl.java new file mode 100644 index 000000000..68ebcdfbc --- /dev/null +++ b/src/main/java/com/ruoyi/project/system/role/dao/RoleDaoImpl.java @@ -0,0 +1,39 @@ +package com.ruoyi.project.system.role.dao; + +import java.util.List; + +import org.springframework.stereotype.Repository; + +import com.ruoyi.framework.core.dao.DynamicObjectBaseDao; + +/** + * 角色 数据层处理 + * + * @author yangzz + */ +@Repository("roleDao") +public class RoleDaoImpl extends DynamicObjectBaseDao implements IRoleDao +{ + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 角色列表 + */ + @Override + public List selectRolesByUserId(Long userId) + { + List permsList = null; + try + { + permsList = this.findForList("SystemRoleMapper.selectRolesByUserId", userId); + } + catch (Exception e) + { + e.printStackTrace(); + } + return permsList; + } + +} diff --git a/src/main/java/com/ruoyi/project/system/role/service/IRoleService.java b/src/main/java/com/ruoyi/project/system/role/service/IRoleService.java new file mode 100644 index 000000000..f1059903b --- /dev/null +++ b/src/main/java/com/ruoyi/project/system/role/service/IRoleService.java @@ -0,0 +1,21 @@ +package com.ruoyi.project.system.role.service; + +import java.util.Set; + +/** + * 角色业务层 + * + * @author yangzz + */ +public interface IRoleService +{ + + /** + * 根据用户ID查询角色 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set selectRolesByUserId(Long userId); + +} diff --git a/src/main/java/com/ruoyi/project/system/role/service/RoleServiceImpl.java b/src/main/java/com/ruoyi/project/system/role/service/RoleServiceImpl.java new file mode 100644 index 000000000..92af8bd47 --- /dev/null +++ b/src/main/java/com/ruoyi/project/system/role/service/RoleServiceImpl.java @@ -0,0 +1,45 @@ +package com.ruoyi.project.system.role.service; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.ruoyi.project.system.role.dao.IRoleDao; + +/** + * 角色 业务层处理 + * + * @author yangzz + */ +@Service("roleService") +public class RoleServiceImpl implements IRoleService +{ + + @Autowired + private IRoleDao roleDao; + + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set selectRolesByUserId(Long userId) + { + List perms = roleDao.selectRolesByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotBlank(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + +} diff --git a/src/main/java/com/ruoyi/project/system/user/domain/User.java b/src/main/java/com/ruoyi/project/system/user/domain/User.java index 484b9ec12..d9021316a 100644 --- a/src/main/java/com/ruoyi/project/system/user/domain/User.java +++ b/src/main/java/com/ruoyi/project/system/user/domain/User.java @@ -1,7 +1,6 @@ package com.ruoyi.project.system.user.domain; import com.ruoyi.project.system.dept.domain.Dept; -import com.ruoyi.project.system.role.domain.Role; import lombok.Data; /** @@ -36,7 +35,5 @@ public class User private String createTime; // 部门对象 private Dept dept; - // 角色对象 - private Role role; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 72b904aad..aa4131b72 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -35,6 +35,13 @@ mybatis: configLocation: classpath:mybatis/mybatis-config.xml # Shiro shiro: + user: + # 登录地址 + loginUrl: /login + # 权限认证失败地址 + unauthorizedUrl: /unauth + # 首页地址 + indexUrl: /index session: # Session超时时间(默认30分钟) expireTime: 30 diff --git a/src/main/resources/mybatis/system/SystemOnlineMapper.xml b/src/main/resources/mybatis/system/SystemOnlineMapper.xml index 92dd1d419..d01564321 100644 --- a/src/main/resources/mybatis/system/SystemOnlineMapper.xml +++ b/src/main/resources/mybatis/system/SystemOnlineMapper.xml @@ -8,7 +8,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -33,8 +32,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - replace into sys_user_online(sessionId, login_name, dept_name, role_name, ipaddr, browser, os, status, start_timestsamp, last_access_time, expireTime) - values (#{sessionId}, #{loginName}, #{deptName}, #{roleName}, #{ipaddr}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime}) + replace into sys_user_online(sessionId, login_name, dept_name, ipaddr, browser, os, status, start_timestsamp, last_access_time, expireTime) + values (#{sessionId}, #{loginName}, #{deptName}, #{ipaddr}, #{browser}, #{os}, #{status}, #{startTimestamp}, #{lastAccessTime}, #{expireTime}) diff --git a/src/main/resources/mybatis/system/SystemRoleMapper.xml b/src/main/resources/mybatis/system/SystemRoleMapper.xml new file mode 100644 index 000000000..df91d437e --- /dev/null +++ b/src/main/resources/mybatis/system/SystemRoleMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mybatis/system/SystemUserMapper.xml b/src/main/resources/mybatis/system/SystemUserMapper.xml index e13035d03..5e500c34e 100644 --- a/src/main/resources/mybatis/system/SystemUserMapper.xml +++ b/src/main/resources/mybatis/system/SystemUserMapper.xml @@ -17,7 +17,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - @@ -28,30 +27,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - - - - - - - - - - - - diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 1a975ad1a..d36944b14 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -32,7 +32,7 @@ image RuoYi - 超级管理员 + 研发部