diff --git a/new_intall_20180222.sql b/new_intall_20180222.sql index 7bf3aa7bf..2f3086592 100644 --- a/new_intall_20180222.sql +++ b/new_intall_20180222.sql @@ -105,32 +105,32 @@ 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('3', '用户管理', '1', '1', '/system/userView.action', 'C', '0', 'system:user', '#', '2018-01-01', '', 'system', '用户管理菜单'); -insert into sys_menu values('4', '角色管理', '1', '2', '/system/roleView.action', 'C', '0', 'system:role', '#', '2018-01-01', '', 'system', '角色管理菜单'); -insert into sys_menu values('5', '菜单管理', '1', '3', '/system/menuView.action', 'C', '0', 'system:menu', '#', '2018-01-01', '', 'system', '菜单管理菜单'); -insert into sys_menu values('6', '操作日志', '1', '4', '/system/operlogView.action', 'C', '0', 'system:operlog', '#', '2018-01-01', '', 'system', '操作日志菜单'); -insert into sys_menu values('7', '登录日志', '1', '5', '/system/userlogView.action', 'C', '0', 'system:userlog', '#', '2018-01-01', '', 'system', '登录日志菜单'); -insert into sys_menu values('8', '数据监控', '2', '1', '/monitor/druid/index.html', 'C', '0', 'monitor:druid', '#', '2018-01-01', '', 'system', '数据监控菜单'); +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/druid/index.html', 'C', '0', 'monitor:druid:list', '#', '2018-01-01', '', 'system', '数据监控菜单'); --- 三级用户按钮 -insert into sys_menu values('9', '用户新增', '3', '1', '/system/user/add.action', 'F', '0', 'sys:user:add', '#', '2018-01-01', '', 'system', '用户管理新增按钮'); -insert into sys_menu values('10', '用户修改', '3', '2', '/system/user/update.action', 'F', '0', 'sys:user:update', '#', '2018-01-01', '', 'system', '用户管理修改按钮'); -insert into sys_menu values('11', '用户删除', '3', '3', '/system/user/delete.action', 'F', '0', 'sys:user:delete', '#', '2018-01-01', '', 'system', '用户管理删除按钮'); -insert into sys_menu values('12', '用户查询', '3', '4', '/system/user/select.action', 'F', '0', 'sys:user:select', '#', '2018-01-01', '', 'system', '用户管理查询按钮'); -insert into sys_menu values('13', '密码修改', '3', '5', '/system/user/pwdUpdate.action', 'F', '0', 'sys:user:pwdUpdate', '#', '2018-01-01', '', 'system', '用户密码修改按钮'); +insert into sys_menu values('9', '用户新增', '3', '1', '/system/user/add', 'F', '0', 'sys:user:add', '#', '2018-01-01', '', 'system', '用户管理新增按钮'); +insert into sys_menu values('10', '用户修改', '3', '2', '/system/user/update', 'F', '0', 'sys:user:update', '#', '2018-01-01', '', 'system', '用户管理修改按钮'); +insert into sys_menu values('11', '用户删除', '3', '3', '/system/user/delete', 'F', '0', 'sys:user:delete', '#', '2018-01-01', '', 'system', '用户管理删除按钮'); +insert into sys_menu values('12', '用户查询', '3', '4', '/system/user/select', 'F', '0', 'sys:user:select', '#', '2018-01-01', '', 'system', '用户管理查询按钮'); +insert into sys_menu values('13', '密码修改', '3', '5', '/system/user/pwdUpdate', 'F', '0', 'sys:user:pwdUpdate', '#', '2018-01-01', '', 'system', '用户密码修改按钮'); --- 三级角色按钮 -insert into sys_menu values('14', '角色新增', '4', '1', '/system/role/add.action', 'F', '0', 'sys:role:add', '#', '2018-01-01', '', 'system', '角色管理新增按钮'); -insert into sys_menu values('15', '角色修改', '4', '2', '/system/role/update.action', 'F', '0', 'sys:role:update', '#', '2018-01-01', '', 'system', '角色管理修改按钮'); -insert into sys_menu values('16', '角色删除', '4', '3', '/system/role/delete.action', 'F', '0', 'sys:role:delete', '#', '2018-01-01', '', 'system', '角色管理删除按钮'); -insert into sys_menu values('17', '角色查询', '4', '4', '/system/role/select.action', 'F', '0', 'sys:role:select', '#', '2018-01-01', '', 'system', '角色管理查询按钮'); -insert into sys_menu values('18', '角色授权', '4', '5', '/system/role/auth.action', 'F', '0', 'sys:role:auth', '#', '2018-01-01', '', 'system', '角色管理授权按钮'); +insert into sys_menu values('14', '角色新增', '4', '1', '/system/role/add', 'F', '0', 'sys:role:add', '#', '2018-01-01', '', 'system', '角色管理新增按钮'); +insert into sys_menu values('15', '角色修改', '4', '2', '/system/role/update', 'F', '0', 'sys:role:update', '#', '2018-01-01', '', 'system', '角色管理修改按钮'); +insert into sys_menu values('16', '角色删除', '4', '3', '/system/role/delete', 'F', '0', 'sys:role:delete', '#', '2018-01-01', '', 'system', '角色管理删除按钮'); +insert into sys_menu values('17', '角色查询', '4', '4', '/system/role/select', 'F', '0', 'sys:role:select', '#', '2018-01-01', '', 'system', '角色管理查询按钮'); +insert into sys_menu values('18', '角色授权', '4', '5', '/system/role/auth', 'F', '0', 'sys:role:auth', '#', '2018-01-01', '', 'system', '角色管理授权按钮'); --- 三级菜单按钮 -insert into sys_menu values('19', '菜单新增', '5', '1', '/system/role/add.action', 'F', '0', 'sys:menu:add', '#', '2018-01-01', '', 'system', '菜单管理新增按钮'); -insert into sys_menu values('20', '菜单修改', '5', '2', '/system/role/update.action', 'F', '0', 'sys:menu:update', '#', '2018-01-01', '', 'system', '菜单管理修改按钮'); -insert into sys_menu values('21', '菜单删除', '5', '3', '/system/role/delete.action', 'F', '0', 'sys:menu:delete', '#', '2018-01-01', '', 'system', '菜单管理删除按钮'); -insert into sys_menu values('22', '菜单查询', '5', '4', '/system/role/select.action', 'F', '0', 'sys:menu:select', '#', '2018-01-01', '', 'system', '菜单管理查询按钮'); +insert into sys_menu values('19', '菜单新增', '5', '1', '/system/menu/add', 'F', '0', 'sys:menu:add', '#', '2018-01-01', '', 'system', '菜单管理新增按钮'); +insert into sys_menu values('20', '菜单修改', '5', '2', '/system/menu/update', 'F', '0', 'sys:menu:update', '#', '2018-01-01', '', 'system', '菜单管理修改按钮'); +insert into sys_menu values('21', '菜单删除', '5', '3', '/system/menu/delete', 'F', '0', 'sys:menu:delete', '#', '2018-01-01', '', 'system', '菜单管理删除按钮'); +insert into sys_menu values('22', '菜单查询', '5', '4', '/system/menu/select', 'F', '0', 'sys:menu:select', '#', '2018-01-01', '', 'system', '菜单管理查询按钮'); --- 三级日志按钮 -insert into sys_menu values('23', '操作日志查询', '4', '5', '/system/operlog/auth.action', 'F', '0', 'sys:operlog:select', '#', '2018-01-01', '', 'system', '操作日志查询按钮'); -insert into sys_menu values('24', '登录日志查询', '4', '5', '/system/userlog/auth.action', 'F', '0', 'sys:userlog:select', '#', '2018-01-01', '', 'system', '登录日志查询按钮'); +insert into sys_menu values('23', '操作日志查询', '4', '5', '/system/operlog/auth', 'F', '0', 'sys:operlog:select', '#', '2018-01-01', '', 'system', '操作日志查询按钮'); +insert into sys_menu values('24', '登录日志查询', '4', '5', '/system/userlog/auth', 'F', '0', 'sys:userlog:select', '#', '2018-01-01', '', 'system', '登录日志查询按钮'); -- ---------------------------- @@ -191,7 +191,7 @@ create table oper_log ( primary key (operid) ) engine=innodb auto_increment=100 default charset=utf8; -insert into oper_log values(1, 'admin', '2018-01-01', '系统管理-启用/停用-用户', 'delete.do?id=1', '127.0.0.1', 'system/changeUserStatus.action', '0', ''); +insert into oper_log values(1, 'admin', '2018-01-01', '系统管理-启用/停用-用户', 'delete.do?id=1', '127.0.0.1', 'system/changeUserStatus', '0', ''); -- ---------------------------- -- 8、创建数据字典表 diff --git a/src/main/java/com/ruoyi/RuoYiApplication.java b/src/main/java/com/ruoyi/RuoYiApplication.java index 4897b6523..f78564919 100644 --- a/src/main/java/com/ruoyi/RuoYiApplication.java +++ b/src/main/java/com/ruoyi/RuoYiApplication.java @@ -9,10 +9,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; @EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class }) public class RuoYiApplication { - public static void main(String[] args) { SpringApplication.run(RuoYiApplication.class, args); } - } \ No newline at end of file diff --git a/src/main/java/com/ruoyi/framework/config/BaseConfig.java b/src/main/java/com/ruoyi/framework/config/BaseConfig.java new file mode 100644 index 000000000..bee0ee6a5 --- /dev/null +++ b/src/main/java/com/ruoyi/framework/config/BaseConfig.java @@ -0,0 +1,21 @@ +package com.ruoyi.framework.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.core.Ordered; +import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +@Configuration +public class BaseConfig extends WebMvcConfigurerAdapter +{ + /** + * 默认首页的设置,当输入域名是可以自动跳转到默认指定的网页 + */ + @Override + public void addViewControllers(ViewControllerRegistry registry) + { + registry.addViewController("/").setViewName("forward:/index"); + registry.setOrder(Ordered.HIGHEST_PRECEDENCE); + super.addViewControllers(registry); + } +} \ No newline at end of file diff --git a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java index 31aed0e12..20ee5b856 100644 --- a/src/main/java/com/ruoyi/framework/config/ShiroConfig.java +++ b/src/main/java/com/ruoyi/framework/config/ShiroConfig.java @@ -8,12 +8,15 @@ import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.filter.authc.LogoutFilter; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.project.shiro.realm.UserRealm; +import com.ruoyi.project.system.menu.service.MenuService; import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; /** @@ -24,14 +27,22 @@ import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; @Configuration public class ShiroConfig { + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; + + /** + * 缓存管理器 使用Ehcache实现 + */ @Bean public EhCacheManager getEhCacheManager() { EhCacheManager em = new EhCacheManager(); - em.setCacheManagerConfigFile("classpath:config/ehcache.xml"); + em.setCacheManagerConfigFile("classpath:ehcache/ehcache-shiro.xml"); return em; } + /** + * 自定义Realm + */ @Bean UserRealm userRealm(EhCacheManager cacheManager) { @@ -40,6 +51,9 @@ public class ShiroConfig return userRealm; } + /** + * 会话管理器 + */ @Bean SessionDAO sessionDAO() { @@ -47,6 +61,9 @@ public class ShiroConfig return sessionDAO; } + /** + * 安全管理器 + */ @Bean SecurityManager securityManager(UserRealm userRealm) { @@ -56,39 +73,56 @@ public class ShiroConfig return manager; } + /** + * Shiro过滤器配置 + */ @Bean ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + // Shiro的核心安全接口,这个属性是必须的 shiroFilterFactoryBean.setSecurityManager(securityManager); -// shiroFilterFactoryBean.setLoginUrl("/login"); -// shiroFilterFactoryBean.setSuccessUrl("/index"); -// shiroFilterFactoryBean.setUnauthorizedUrl("/403"); + // 身份认证失败,则跳转到登录页面的配置 + shiroFilterFactoryBean.setLoginUrl("/login"); + // 权限认证失败,则跳转到指定页面 + shiroFilterFactoryBean.setUnauthorizedUrl("/unauth"); + // 注销成功,则跳转到指定页面 + LogoutFilter logoutFilter = new LogoutFilter(); + logoutFilter.setRedirectUrl("/login"); + // Shiro连接约束配置,即过滤链的定义 LinkedHashMap filterChainDefinitionMap = new LinkedHashMap<>(); -// filterChainDefinitionMap.put("/css/**", "anon"); -// filterChainDefinitionMap.put("/js/**", "anon"); -// filterChainDefinitionMap.put("/fonts/**", "anon"); -// filterChainDefinitionMap.put("/img/**", "anon"); -// filterChainDefinitionMap.put("/docs/**", "anon"); -// filterChainDefinitionMap.put("/druid/**", "anon"); -// filterChainDefinitionMap.put("/upload/**", "anon"); -// filterChainDefinitionMap.put("/files/**", "anon"); -// filterChainDefinitionMap.put("/logout", "logout"); -// filterChainDefinitionMap.put("/", "anon"); -// filterChainDefinitionMap.put("/blog", "anon"); -// filterChainDefinitionMap.put("/blog/open/**", "anon"); -// filterChainDefinitionMap.put("/**", "authc"); - + // 对静态资源设置匿名访问 + filterChainDefinitionMap.put("/css/**", "anon"); + filterChainDefinitionMap.put("/docs/**", "anon"); + filterChainDefinitionMap.put("/fonts/**", "anon"); + filterChainDefinitionMap.put("/img/**", "anon"); + filterChainDefinitionMap.put("/js/**", "anon"); + filterChainDefinitionMap.put("/druid/**", "anon"); + // 不需要拦截的访问 + filterChainDefinitionMap.put("/login", "anon"); + // 退出 logout地址,shiro去清除session + filterChainDefinitionMap.put("/logout", "logout"); + // 系统权限列表 + MenuService menuService = SpringUtils.getBean(MenuService.class); + filterChainDefinitionMap.putAll(menuService.findAllPerms()); + // 所有请求需要认证 + filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } + /** + * 保证实现了Shiro内部lifecycle函数的bean执行 + */ @Bean("lifecycleBeanPostProcessor") public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() { return new LifecycleBeanPostProcessor(); } + /** + * 开启Shiro代理 + */ @Bean public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { @@ -97,12 +131,18 @@ public class ShiroConfig return proxyCreator; } + /** + * thymeleaf模板引擎和shiro框架的整合 + */ @Bean public ShiroDialect shiroDialect() { return new ShiroDialect(); } + /** + * 开启Shiro注解通知器 + */ @Bean public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor( @Qualifier("securityManager") SecurityManager securityManager) diff --git a/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java b/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java index 934931229..cd27daea4 100644 --- a/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java +++ b/src/main/java/com/ruoyi/framework/core/dao/DynamicObjectBaseDao.java @@ -129,7 +129,20 @@ public class DynamicObjectBaseDao } /** - * 查找对象 + * 查找对象 - 无条件 + * + * @param str + * @param obj + * @return + * @throws Exception + */ + public Object findForList(String str) throws Exception + { + return sqlSessionTemplate.selectList(str); + } + + /** + * 查找对象 - 有条件 * * @param str * @param obj diff --git a/src/main/java/com/ruoyi/project/shiro/common/UserConstants.java b/src/main/java/com/ruoyi/project/shiro/common/UserConstants.java index c566eab54..9c26c449f 100644 --- a/src/main/java/com/ruoyi/project/shiro/common/UserConstants.java +++ b/src/main/java/com/ruoyi/project/shiro/common/UserConstants.java @@ -23,8 +23,8 @@ public class UserConstants /** * 用户名长度限制 */ - public static final int USERNAME_MIN_LENGTH = 5; - public static final int USERNAME_MAX_LENGTH = 20; + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 10; /** * 密码长度限制 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 eeea34dd0..1f45854a4 100644 --- a/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java +++ b/src/main/java/com/ruoyi/project/shiro/realm/UserRealm.java @@ -1,27 +1,32 @@ 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; import org.apache.shiro.authc.ExcessiveAttemptsException; +import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.LockedAccountException; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.RoleBlockedException; import com.ruoyi.project.shiro.exception.UserBlockedException; import com.ruoyi.project.shiro.exception.UserNotExistsException; import com.ruoyi.project.shiro.exception.UserPasswordNotMatchException; import com.ruoyi.project.shiro.exception.UserPasswordRetryLimitExceedException; +import com.ruoyi.project.system.menu.service.IMenuService; import com.ruoyi.project.system.user.domain.User; -import com.ruoyi.project.system.user.service.IUserService; /** * 自定义Realm 处理登录 权限 @@ -34,23 +39,31 @@ public class UserRealm extends AuthorizingRealm private static final Logger log = LoggerFactory.getLogger(LoginService.class); @Autowired - private IUserService userService; + private IMenuService menuService; @Autowired private LoginService loginService; + /** + * 授权 + */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { - // Long userId = ShiroUtils.getUserId(); - // MenuService menuService = SpringUtils.getBean(MenuService.class); - // Set perms = menuService.listPerms(userId); - // SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); - // info.setStringPermissions(perms); - // return info; - return null; + Long userId = ShiroUtils.getUserId(); + Set perms = menuService.findPermsByUserId(userId); + SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); + if (StringTools.isNotEmpty(perms)) + { + // // 权限加入AuthorizationInfo认证对象 + info.setStringPermissions(perms); + } + return info; } + /** + * 登录认证 + */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { @@ -78,7 +91,7 @@ public class UserRealm extends AuthorizingRealm } catch (UserPasswordNotMatchException e) { - throw new AuthenticationException(e.getMessage(), e); + throw new IncorrectCredentialsException(e.getMessage(), e); } catch (UserPasswordRetryLimitExceedException e) { @@ -94,7 +107,7 @@ public class UserRealm extends AuthorizingRealm } catch (Exception e) { - log.error("login error", e); + log.info("对用户[" + username + "]进行登录验证..验证未通过{}", e.getMessage()); throw new AuthenticationException(e.getMessage(), e); } SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user, password, getName()); diff --git a/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java b/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java index d3042a53b..c8346f719 100644 --- a/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java +++ b/src/main/java/com/ruoyi/project/shiro/service/PasswordService.java @@ -80,5 +80,6 @@ public class PasswordService public static void main(String[] args) { System.out.println(new PasswordService().encryptPassword("admin", "admin123", "")); + System.out.println(new PasswordService().encryptPassword("ry", "admin123", "")); } } 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 2dbf9edac..f231391d0 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 @@ -12,11 +12,26 @@ public interface IMenuDao { /** - * 根据用户ID查询权限表 + * 根据用户ID查询菜单 * * @param userId 用户ID * @return 菜单列表 */ public List findMenusByUserId(Long userId); + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public List findPermsByUserId(Long userId); + + /** + * 查询系统所有权限 + * + * @return 权限列表 + */ + public List findAllPerms(); + } diff --git a/src/main/java/com/ruoyi/project/system/menu/dao/MenuDao.java b/src/main/java/com/ruoyi/project/system/menu/dao/MenuDao.java index 0deb9c902..a5b0d067f 100644 --- a/src/main/java/com/ruoyi/project/system/menu/dao/MenuDao.java +++ b/src/main/java/com/ruoyi/project/system/menu/dao/MenuDao.java @@ -15,7 +15,7 @@ public class MenuDao extends DynamicObjectBaseDao implements IMenuDao { /** - * 根据用户ID查询权限表 + * 根据用户ID查询菜单 * * @param userId 用户ID * @return 菜单列表 @@ -35,4 +35,45 @@ public class MenuDao extends DynamicObjectBaseDao implements IMenuDao return permsList; } + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 菜单列表 + */ + @SuppressWarnings("unchecked") + public List findPermsByUserId(Long userId) + { + List permsList = null; + try + { + permsList = (List) this.findForList("SystemMenuMapper.findPermsByUserId", userId); + } + catch (Exception e) + { + e.printStackTrace(); + } + return permsList; + } + + /** + * 查询系统所有权限 + * + * @return 权限列表 + */ + @SuppressWarnings("unchecked") + public List findAllPerms() + { + List permsList = null; + try + { + permsList = (List) this.findForList("SystemMenuMapper.findAllPerms"); + } + catch (Exception e) + { + e.printStackTrace(); + } + return permsList; + } + } diff --git a/src/main/java/com/ruoyi/project/system/menu/service/IMenuService.java b/src/main/java/com/ruoyi/project/system/menu/service/IMenuService.java index 5083b96e8..b10bb580f 100644 --- a/src/main/java/com/ruoyi/project/system/menu/service/IMenuService.java +++ b/src/main/java/com/ruoyi/project/system/menu/service/IMenuService.java @@ -1,6 +1,8 @@ package com.ruoyi.project.system.menu.service; import java.util.List; +import java.util.Map; +import java.util.Set; import com.ruoyi.project.system.menu.domain.Menu; /** @@ -12,11 +14,26 @@ public interface IMenuService { /** - * 根据用户ID查询权限表 + * 根据用户ID查询菜单 * * @param userId 用户ID * @return 菜单列表 */ public List findMenusByUserId(Long userId); + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + public Set findPermsByUserId(Long userId); + + /** + * 查询系统所有权限 + * + * @return 权限列表 + */ + public Map findAllPerms(); + } diff --git a/src/main/java/com/ruoyi/project/system/menu/service/MenuService.java b/src/main/java/com/ruoyi/project/system/menu/service/MenuService.java index 24f064953..df4ea5045 100644 --- a/src/main/java/com/ruoyi/project/system/menu/service/MenuService.java +++ b/src/main/java/com/ruoyi/project/system/menu/service/MenuService.java @@ -1,10 +1,17 @@ package com.ruoyi.project.system.menu.service; +import java.text.MessageFormat; +import java.util.Arrays; +import java.util.HashSet; +import java.util.LinkedHashMap; 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.common.tools.StringTools; import com.ruoyi.project.system.menu.dao.IMenuDao; import com.ruoyi.project.system.menu.domain.Menu; import com.ruoyi.project.util.TreeUtil; @@ -17,20 +24,63 @@ import com.ruoyi.project.util.TreeUtil; @Service("menuService") public class MenuService implements IMenuService { + public static final String PREMISSION_STRING = "perms[\"{0}\"]"; @Autowired private IMenuDao menuDao; /** - * 根据用户ID查询权限表 + * 根据用户ID查询菜单 * * @param userId 用户ID * @return 菜单列表 */ + @Override public List findMenusByUserId(Long userId) { List menus = menuDao.findMenusByUserId(userId); return TreeUtil.getChildPerms(menus, 0); } + /** + * 根据用户ID查询权限 + * + * @param userId 用户ID + * @return 权限列表 + */ + @Override + public Set findPermsByUserId(Long userId) + { + List perms = menuDao.findPermsByUserId(userId); + Set permsSet = new HashSet<>(); + for (String perm : perms) + { + if (StringUtils.isNotBlank(perm)) + { + permsSet.addAll(Arrays.asList(perm.trim().split(","))); + } + } + return permsSet; + } + + /** + * 查询系统所有权限 + * + * @return 权限列表 + */ + @Override + public LinkedHashMap findAllPerms() + { + LinkedHashMap section = new LinkedHashMap<>(); + List permissions = menuDao.findAllPerms(); + if (StringTools.isNotEmpty(permissions)) + { + for (Menu menu : permissions) + { + section.put(menu.getUrl(), MessageFormat.format(PREMISSION_STRING, menu.getPerms())); + } + } + return section; + } + } diff --git a/src/main/java/com/ruoyi/project/system/user/controller/IndexController.java b/src/main/java/com/ruoyi/project/system/user/controller/IndexController.java index e80eb16df..f5d7be4c4 100644 --- a/src/main/java/com/ruoyi/project/system/user/controller/IndexController.java +++ b/src/main/java/com/ruoyi/project/system/user/controller/IndexController.java @@ -1,17 +1,14 @@ package com.ruoyi.project.system.user.controller; import java.util.List; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; -import org.springframework.web.bind.annotation.RequestMapping; - +import org.springframework.web.bind.annotation.GetMapping; import com.ruoyi.framework.core.controller.BaseController; import com.ruoyi.project.system.menu.domain.Menu; import com.ruoyi.project.system.menu.service.IMenuService; import com.ruoyi.project.system.user.domain.User; -import com.ruoyi.project.system.user.service.IUserService; /** * 首页 业务处理 @@ -21,16 +18,12 @@ import com.ruoyi.project.system.user.service.IUserService; @Controller public class IndexController extends BaseController { - - @Autowired - private IUserService userService; - @Autowired private IMenuService menuService; // 系统首页 - @RequestMapping("/index") - public String index(Model model) throws Exception + @GetMapping("/index") + public String index(Model model) { // 取身份信息 User user = getUser(); @@ -42,8 +35,8 @@ public class IndexController extends BaseController } // 系统介绍 - @RequestMapping("/main") - public String main() throws Exception + @GetMapping("/main") + public String main() { return "main"; } diff --git a/src/main/java/com/ruoyi/project/system/user/controller/LoginController.java b/src/main/java/com/ruoyi/project/system/user/controller/LoginController.java index def10b1b4..93ea998f7 100644 --- a/src/main/java/com/ruoyi/project/system/user/controller/LoginController.java +++ b/src/main/java/com/ruoyi/project/system/user/controller/LoginController.java @@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.ruoyi.common.tools.StringTools; -import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.framework.core.controller.BaseController; import com.ruoyi.framework.core.domain.R; @@ -24,14 +23,14 @@ public class LoginController extends BaseController { @GetMapping("/login") - String login() + public String login() { return "login"; } @PostMapping("/login") @ResponseBody - R ajaxLogin(String username, String password) + public R ajaxLogin(String username, String password) { UsernamePasswordToken token = new UsernamePasswordToken(username, password); Subject subject = SecurityUtils.getSubject(); @@ -51,10 +50,9 @@ public class LoginController extends BaseController } } - @GetMapping("/logout") - String logout() + @GetMapping("/unauth") + public String unauth() { - ShiroUtils.logout(); - return "redirect:/login"; + return "/error/unauth"; } } diff --git a/src/main/java/com/ruoyi/project/system/user/controller/UserController.java b/src/main/java/com/ruoyi/project/system/user/controller/UserController.java index 03143ea1e..e6e5f3c78 100644 --- a/src/main/java/com/ruoyi/project/system/user/controller/UserController.java +++ b/src/main/java/com/ruoyi/project/system/user/controller/UserController.java @@ -2,15 +2,14 @@ package com.ruoyi.project.system.user.controller; import java.util.List; import java.util.Map; +import org.apache.shiro.authz.annotation.RequiresPermissions; 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.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import com.ruoyi.common.utils.TableDataInfo; -import com.ruoyi.common.utils.security.ShiroUtils; import com.ruoyi.framework.core.controller.BaseController; import com.ruoyi.project.system.user.domain.User; import com.ruoyi.project.system.user.service.IUserService; @@ -39,11 +38,11 @@ public class UserController extends BaseController return tableDataInfo; } - @RequestMapping(value = "/test", method = RequestMethod.GET) - public String test() + @RequiresPermissions("system:user:list") + @GetMapping("/userList") + public String userList() { return prefix + "/test"; } - } \ No newline at end of file diff --git a/src/main/resources/config/ehcache.xml b/src/main/resources/ehcache/ehcache-shiro.xml similarity index 100% rename from src/main/resources/config/ehcache.xml rename to src/main/resources/ehcache/ehcache-shiro.xml diff --git a/src/main/resources/mybatis/system/SystemMenuMapper.xml b/src/main/resources/mybatis/system/SystemMenuMapper.xml index fd7ed9e35..cd43186c2 100644 --- a/src/main/resources/mybatis/system/SystemMenuMapper.xml +++ b/src/main/resources/mybatis/system/SystemMenuMapper.xml @@ -29,4 +29,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by m.order_num + + + + \ No newline at end of file diff --git a/src/main/resources/templates/error/404.html b/src/main/resources/templates/error/404.html new file mode 100644 index 000000000..180584a2f --- /dev/null +++ b/src/main/resources/templates/error/404.html @@ -0,0 +1,38 @@ + + + + + + + + + RuoYi - 404 + + + + + + + + + + + + +
+

404

+

找不到网页!

+ +
+ 对不起,您正在寻找的页面已经找到。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。 + 主页 +
+
+ + + + + + + + diff --git a/src/main/resources/templates/error/500.html b/src/main/resources/templates/error/500.html new file mode 100644 index 000000000..3b74335bb --- /dev/null +++ b/src/main/resources/templates/error/500.html @@ -0,0 +1,38 @@ + + + + + + + + + RuoYi - 500 + + + + + + + + + + + + +
+

500

+

内部服务器错误!

+ +
+ 服务器遇到意外事件,不允许完成请求。我们抱歉。您可以返回主页面。 + 主页 +
+
+ + + + + + + + diff --git a/src/main/resources/templates/error/unauth.html b/src/main/resources/templates/error/unauth.html new file mode 100644 index 000000000..cd1d71170 --- /dev/null +++ b/src/main/resources/templates/error/unauth.html @@ -0,0 +1,38 @@ + + + + + + + + + RuoYi - 403 + + + + + + + + + + + + +
+

403

+

您没有访问权限!

+ +
+ 对不起,您正在寻找的页面已经找到。尝试检查URL的错误,然后按浏览器上的刷新按钮或尝试在我们的应用程序中找到其他内容。 + 主页 +
+
+ + + + + + + + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 98c5b4348..9cc71d663 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -41,7 +41,7 @@
  • 主页
  • @@ -89,7 +89,7 @@