diff --git a/README.md b/README.md index 961fd5a2a2c7ce7824adffd5760e40fc714695ab..c1c63742ef2c4c706509f8e4f0a2550abef0ec2d 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,18 @@ AG-Admin是国内首个基于`Spring Cloud`微`服务`化`开发平台`,具有 - 课程地址: http://edu.csdn.net/course/detail/5840 -QQ群号:169824183 +### QQ群号:169824183 + +## AG线上最新体验地址,感谢【[千铭云](https://www.chanmir.com/?u=45433C)】赞助的服务器。 + +http://43.248.136.159:9999/ + +## [老A专属优惠链接](https://www.chanmir.com/?u=45433C),优惠卷:2B3158 + + +### 阿里云服务器太贵?送你阿里云神卷,优惠最高达20% +https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ryr8l9eb&utm_source=ryr8l9eb + ![img](http://upload-images.jianshu.io/upload_images/5700335-002735d1727ec11b.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) @@ -15,6 +26,13 @@ QQ群号:169824183 --------- +# 更新日志 +### 2017年11月17日 v2.2-SNARSHOT + +- ace-admin集成`ace-cache` +- ace-auth集成`rabbitmq` + + # 模块说明 ![img](http://upload-images.jianshu.io/upload_images/5700335-5ceb4c68e4080107.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) @@ -38,14 +56,14 @@ QQ群号:169824183 下载完后端代码后,记得先安装`lombok插件`,否则你的IDE会报代码缺失。 ## 后端工程启动 ### 环境须知 -- mysql数据库一个,redis数据库一个 +- mysql一个,redis一个,rabbitmq一个 - jdk1.8 - IDE插件一个,`lombok插件`,具体百度即可 ### 运行步骤 - 运行数据库脚本:依次运行数据库:ace-admin/db/init.sql、ace-auth-server/db/init.sql - 修改配置数据库配置:ace-admin/src/main/resources/application.yml、ace-gate/src/main/resources/application.yml -- 依次运行main类:CenterBootstrap(ace-center)、ConfigServerBootstrap(ace-config)、GateBootstrap(ace-gate)、AdminBootstrap(ace-admin)、AuthBootstrap(ace-auth-server) +- 按`顺序`运行main类:CenterBootstrap(ace-center)、ConfigServerBootstrap(ace-config)、AdminBootstrap(ace-admin)、AuthBootstrap(ace-auth-server)、GateBootstrap(ace-gate) ### 项目结构 ``` diff --git a/ace-admin/pom.xml b/ace-admin/pom.xml index 8b7bad5eeb5fc9b52dd46f9b432cdbdd53f2730e..a6198164447fcdde51051940d7af99930ef89d7d 100644 --- a/ace-admin/pom.xml +++ b/ace-admin/pom.xml @@ -157,6 +157,21 @@ ace-auth-client 1.0-SNAPSHOT + + com.github.wxiaoqi + ace-cache + 0.0.2-SNAPSHOT + + + org.webjars + jquery + 2.1.4 + + + org.webjars + bootstrap + 3.1.0 + ace-admin @@ -197,30 +212,30 @@ 1.8 - - - - - - - - - - - - - - - - - - - - - - - - + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + package + + build + + + + + ${docker.image.prefix}/${project.build.finalName} + ${project.basedir}/src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + \ No newline at end of file diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/AdminBootstrap.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/AdminBootstrap.java index 70297eb50e5c4033134e9b053a9ed51bf2e59a99..4b927c7c691cab43709bf4e3da8faa0d64a91e18 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/AdminBootstrap.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/AdminBootstrap.java @@ -7,6 +7,8 @@ import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.scheduling.annotation.EnableScheduling; /** @@ -22,6 +24,8 @@ import org.springframework.scheduling.annotation.EnableScheduling; @EnableScheduling @EnableAceAuthClient @ServletComponentScan("com.github.wxiaoqi.security.admin.config.druid") +@ComponentScan({"com.ace.cache","com.github.wxiaoqi.security.admin"}) +@EnableAspectJAutoProxy public class AdminBootstrap { public static void main(String[] args) { new SpringApplicationBuilder(AdminBootstrap.class).web(true).run(args); } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/ElementBiz.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/ElementBiz.java index 9e98aa53ada3f93961c50d3d3c05a79bdcf3cbfe..c44e4a97e30309d275917be273ecc642d083b193 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/ElementBiz.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/ElementBiz.java @@ -1,5 +1,7 @@ package com.github.wxiaoqi.security.admin.biz; +import com.ace.cache.annotation.Cache; +import com.ace.cache.annotation.CacheClear; import com.github.wxiaoqi.security.admin.entity.Element; import com.github.wxiaoqi.security.admin.mapper.ElementMapper; import com.github.wxiaoqi.security.common.biz.BaseBiz; @@ -15,10 +17,29 @@ import java.util.List; */ @Service public class ElementBiz extends BaseBiz { + @Cache(key="permission:ele:u{1}") public List getAuthorityElementByUserId(String userId){ return mapper.selectAuthorityElementByUserId(userId); } public List getAuthorityElementByUserId(String userId,String menuId){ return mapper.selectAuthorityMenuElementByUserId(userId,menuId); } + + @Override + @Cache(key="permission:ele") + public List selectListAll() { + return super.selectListAll(); + } + + @Override + @CacheClear(pre="permission:ele") + public void insertSelective(Element entity) { + super.insertSelective(entity); + } + + @Override + @CacheClear(pre="permission:ele") + public void updateSelectiveById(Element entity) { + super.updateSelectiveById(entity); + } } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/GroupBiz.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/GroupBiz.java index 162077b8f7513ddcdfbc0f1289a0494957c74d2e..eb60a639418b40769eafa33212433417a0e167cf 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/GroupBiz.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/GroupBiz.java @@ -1,19 +1,20 @@ package com.github.wxiaoqi.security.admin.biz; +import com.ace.cache.annotation.CacheClear; import com.github.wxiaoqi.security.admin.constant.AdminCommonConstant; -import com.github.wxiaoqi.security.admin.entity.*; import com.github.wxiaoqi.security.admin.entity.Group; +import com.github.wxiaoqi.security.admin.entity.Menu; +import com.github.wxiaoqi.security.admin.entity.ResourceAuthority; import com.github.wxiaoqi.security.admin.mapper.GroupMapper; import com.github.wxiaoqi.security.admin.mapper.MenuMapper; import com.github.wxiaoqi.security.admin.mapper.ResourceAuthorityMapper; import com.github.wxiaoqi.security.admin.mapper.UserMapper; import com.github.wxiaoqi.security.admin.vo.AuthorityMenuTree; import com.github.wxiaoqi.security.admin.vo.GroupUsers; +import com.github.wxiaoqi.security.common.biz.BaseBiz; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; - -import com.github.wxiaoqi.security.common.biz.BaseBiz; import org.springframework.util.StringUtils; import java.util.*; @@ -25,110 +26,118 @@ import java.util.*; * @create 2017-06-12 8:48 */ @Service -public class GroupBiz extends BaseBiz{ +public class GroupBiz extends BaseBiz { @Autowired private UserMapper userMapper; @Autowired private ResourceAuthorityMapper resourceAuthorityMapper; @Autowired private MenuMapper menuMapper; + @Override public void insertSelective(Group entity) { - if(AdminCommonConstant.ROOT == entity.getParentId()){ - entity.setPath("/"+entity.getCode()); - }else{ + if (AdminCommonConstant.ROOT == entity.getParentId()) { + entity.setPath("/" + entity.getCode()); + } else { Group parent = this.selectById(entity.getParentId()); - entity.setPath(parent.getPath()+"/"+entity.getCode()); + entity.setPath(parent.getPath() + "/" + entity.getCode()); } super.insertSelective(entity); } @Override public void updateById(Group entity) { - if(AdminCommonConstant.ROOT == entity.getParentId()){ - entity.setPath("/"+entity.getCode()); - }else{ + if (AdminCommonConstant.ROOT == entity.getParentId()) { + entity.setPath("/" + entity.getCode()); + } else { Group parent = this.selectById(entity.getParentId()); - entity.setPath(parent.getPath()+"/"+entity.getCode()); + entity.setPath(parent.getPath() + "/" + entity.getCode()); } super.updateById(entity); } /** * 获取群组关联用户 + * * @param groupId * @return */ public GroupUsers getGroupUsers(int groupId) { - return new GroupUsers(userMapper.selectMemberByGroupId(groupId),userMapper.selectLeaderByGroupId(groupId)); + return new GroupUsers(userMapper.selectMemberByGroupId(groupId), userMapper.selectLeaderByGroupId(groupId)); } /** * 变更群主所分配用户 + * * @param groupId * @param members * @param leaders */ - public void modifyGroupUsers(int groupId, String members, String leaders){ + @CacheClear(pre = "permission") + public void modifyGroupUsers(int groupId, String members, String leaders) { mapper.deleteGroupLeadersById(groupId); mapper.deleteGroupMembersById(groupId); - if(!StringUtils.isEmpty(members)){ + if (!StringUtils.isEmpty(members)) { String[] mem = members.split(","); - for(String m:mem){ - mapper.insertGroupMembersById(groupId,Integer.parseInt(m)); + for (String m : mem) { + mapper.insertGroupMembersById(groupId, Integer.parseInt(m)); } } - if(!StringUtils.isEmpty(leaders)){ + if (!StringUtils.isEmpty(leaders)) { String[] mem = leaders.split(","); - for(String m:mem){ - mapper.insertGroupLeadersById(groupId,Integer.parseInt(m)); + for (String m : mem) { + mapper.insertGroupLeadersById(groupId, Integer.parseInt(m)); } } } /** * 变更群组关联的菜单 + * * @param groupId * @param menus */ - public void modifyAuthorityMenu(int groupId, String[] menus){ - resourceAuthorityMapper.deleteByAuthorityIdAndResourceType(groupId+"", AdminCommonConstant.RESOURCE_TYPE_MENU); + @CacheClear(pre = "permission:menu") + public void modifyAuthorityMenu(int groupId, String[] menus) { + resourceAuthorityMapper.deleteByAuthorityIdAndResourceType(groupId + "", AdminCommonConstant.RESOURCE_TYPE_MENU); List menuList = menuMapper.selectAll(); - Map map = new HashMap(); - for(Menu menu:menuList){ - map.put(menu.getId().toString(),menu.getParentId().toString()); + Map map = new HashMap(); + for (Menu menu : menuList) { + map.put(menu.getId().toString(), menu.getParentId().toString()); } Set relationMenus = new HashSet(); relationMenus.addAll(Arrays.asList(menus)); ResourceAuthority authority = null; - for(String menuId:menus){ - findParentID(map,relationMenus,menuId); + for (String menuId : menus) { + findParentID(map, relationMenus, menuId); } - for(String menuId:relationMenus){ + for (String menuId : relationMenus) { authority = new ResourceAuthority(AdminCommonConstant.AUTHORITY_TYPE_GROUP, AdminCommonConstant.RESOURCE_TYPE_MENU); - authority.setAuthorityId(groupId+""); + authority.setAuthorityId(groupId + ""); authority.setResourceId(menuId); authority.setParentId("-1"); resourceAuthorityMapper.insertSelective(authority); } } - private void findParentID(Map map,Set relationMenus,String id){ + private void findParentID(Map map, Set relationMenus, String id) { String parentId = map.get(id); - if(String.valueOf(AdminCommonConstant.ROOT).equals(id)){ - return ; + if (String.valueOf(AdminCommonConstant.ROOT).equals(id)) { + return; } relationMenus.add(parentId); - findParentID(map,relationMenus,parentId); + findParentID(map, relationMenus, parentId); } /** * 分配资源权限 + * * @param groupId * @param menuId * @param elementId */ - public void modifyAuthorityElement(int groupId,int menuId,int elementId){ + @CacheClear(pre = "permission:ele") + public void modifyAuthorityElement(int groupId, int menuId, int elementId) { ResourceAuthority authority = new ResourceAuthority(AdminCommonConstant.AUTHORITY_TYPE_GROUP, AdminCommonConstant.RESOURCE_TYPE_BTN); authority.setAuthorityId(groupId + ""); authority.setResourceId(elementId + ""); @@ -138,13 +147,15 @@ public class GroupBiz extends BaseBiz{ /** * 移除资源权限 + * * @param groupId * @param menuId * @param elementId */ + @CacheClear(pre = "permission:ele") public void removeAuthorityElement(int groupId, int menuId, int elementId) { ResourceAuthority authority = new ResourceAuthority(); - authority.setAuthorityId(groupId+""); + authority.setAuthorityId(groupId + ""); authority.setResourceId(elementId + ""); authority.setParentId("-1"); resourceAuthorityMapper.delete(authority); @@ -153,10 +164,11 @@ public class GroupBiz extends BaseBiz{ /** * 获取群主关联的菜单 + * * @param groupId * @return */ - public List getAuthorityMenu(int groupId){ + public List getAuthorityMenu(int groupId) { List menus = menuMapper.selectMenuByAuthorityId(String.valueOf(groupId), AdminCommonConstant.AUTHORITY_TYPE_GROUP); List trees = new ArrayList(); AuthorityMenuTree node = null; @@ -169,13 +181,18 @@ public class GroupBiz extends BaseBiz{ return trees; } - + /** + * 获取群组关联的资源 + * + * @param groupId + * @return + */ public List getAuthorityElement(int groupId) { ResourceAuthority authority = new ResourceAuthority(AdminCommonConstant.AUTHORITY_TYPE_GROUP, AdminCommonConstant.RESOURCE_TYPE_BTN); - authority.setAuthorityId(groupId+""); + authority.setAuthorityId(groupId + ""); List authorities = resourceAuthorityMapper.select(authority); List ids = new ArrayList(); - for(ResourceAuthority auth:authorities){ + for (ResourceAuthority auth : authorities) { ids.add(Integer.parseInt(auth.getResourceId())); } return ids; diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/MenuBiz.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/MenuBiz.java index ddb1611249c0f8c56ac2cd9ac59941b1bf083d47..6da6f46d55e52a9afdc49dd3b7d2a1a3b51826e6 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/MenuBiz.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/MenuBiz.java @@ -1,10 +1,12 @@ package com.github.wxiaoqi.security.admin.biz; +import com.ace.cache.annotation.Cache; +import com.ace.cache.annotation.CacheClear; +import com.github.wxiaoqi.security.admin.constant.AdminCommonConstant; import com.github.wxiaoqi.security.admin.entity.Menu; +import com.github.wxiaoqi.security.admin.mapper.MenuMapper; import com.github.wxiaoqi.security.common.biz.BaseBiz; -import com.github.wxiaoqi.security.admin.constant.AdminCommonConstant; import org.springframework.stereotype.Service; -import com.github.wxiaoqi.security.admin.mapper.MenuMapper; import java.util.List; @@ -15,43 +17,61 @@ import java.util.List; * @create 2017-06-12 8:48 */ @Service -public class MenuBiz extends BaseBiz { +public class MenuBiz extends BaseBiz { @Override + @Cache(key="permission:menu") + public List selectListAll() { + return super.selectListAll(); + } + + @Override + @CacheClear(pre="permission:menu") public void insertSelective(Menu entity) { - if(AdminCommonConstant.ROOT == entity.getParentId()){ - entity.setPath("/"+entity.getCode()); - }else{ + if (AdminCommonConstant.ROOT == entity.getParentId()) { + entity.setPath("/" + entity.getCode()); + } else { Menu parent = this.selectById(entity.getParentId()); - entity.setPath(parent.getPath()+"/"+entity.getCode()); + entity.setPath(parent.getPath() + "/" + entity.getCode()); } super.insertSelective(entity); } @Override + @CacheClear(pre="permission:menu") public void updateById(Menu entity) { - if(AdminCommonConstant.ROOT == entity.getParentId()){ - entity.setPath("/"+entity.getCode()); - }else{ + if (AdminCommonConstant.ROOT == entity.getParentId()) { + entity.setPath("/" + entity.getCode()); + } else { Menu parent = this.selectById(entity.getParentId()); - entity.setPath(parent.getPath()+"/"+entity.getCode()); + entity.setPath(parent.getPath() + "/" + entity.getCode()); } super.updateById(entity); } + + @Override + @CacheClear(pre="permission:menu") + public void updateSelectiveById(Menu entity) { + super.updateSelectiveById(entity); + } + /** * 获取用户可以访问的菜单 + * * @param id * @return */ - public List getUserAuthorityMenuByUserId(int id){ + @Cache(key = "permission:menu:u{1}") + public List getUserAuthorityMenuByUserId(int id) { return mapper.selectAuthorityMenuByUserId(id); } /** * 根据用户获取可以访问的系统 + * * @param id * @return */ - public List getUserAuthoritySystemByUserId(int id){ + public List getUserAuthoritySystemByUserId(int id) { return mapper.selectAuthoritySystemByUserId(id); } } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/UserBiz.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/UserBiz.java index 65b4cdad714652a01b56e314bf26b84d09e31e8f..ea2c7cea92ed4c5818fa9a6241678b4ba54f098c 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/UserBiz.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/UserBiz.java @@ -1,5 +1,7 @@ package com.github.wxiaoqi.security.admin.biz; +import com.ace.cache.annotation.Cache; +import com.ace.cache.annotation.CacheClear; import com.github.wxiaoqi.security.admin.entity.User; import com.github.wxiaoqi.security.admin.mapper.MenuMapper; import com.github.wxiaoqi.security.admin.mapper.UserMapper; @@ -31,10 +33,8 @@ public class UserBiz extends BaseBiz { } @Override + @CacheClear(pre="user{1.username}") public void updateSelectiveById(User entity) { - -// String password = new BCryptPasswordEncoder(UserConstant.PW_ENCORDER_SALT).encode(entity.getPassword()); -// entity.setPassword(password); super.updateSelectiveById(entity); } @@ -43,6 +43,7 @@ public class UserBiz extends BaseBiz { * @param username * @return */ + @Cache(key="user{1}") public User getUserByUsername(String username){ User user = new User(); user.setUsername(username); diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/WebConfig.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/WebConfig.java index 9fe68744c33c7cf9a8289bfd4483e104f2f12644..1f6b1f29807d8d952241aa09192d72a7542a3755 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/WebConfig.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/config/WebConfig.java @@ -5,7 +5,9 @@ import com.github.wxiaoqi.security.auth.client.interceptor.UserAuthRestIntercept import com.github.wxiaoqi.security.common.handler.GlobalExceptionHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.ArrayList; @@ -14,10 +16,11 @@ import java.util.Collections; /** * Created by ace on 2017/9/8. */ -@Configuration +@Configuration("admimWebConfig") +@Primary public class WebConfig extends WebMvcConfigurerAdapter { @Bean - GlobalExceptionHandler getGlobalExceptionHandler(){ + GlobalExceptionHandler getGlobalExceptionHandler() { return new GlobalExceptionHandler(); } @@ -25,29 +28,36 @@ public class WebConfig extends WebMvcConfigurerAdapter { public void addInterceptors(InterceptorRegistry registry) { ArrayList commonPathPatterns = getExcludeCommonPathPatterns(); registry.addInterceptor(getServiceAuthRestInterceptor()).addPathPatterns("/**").excludePathPatterns(commonPathPatterns.toArray(new String[]{})); - commonPathPatterns .add("/api/user/username/**"); + commonPathPatterns.add("/api/user/validate"); registry.addInterceptor(getUserAuthRestInterceptor()).addPathPatterns("/**").excludePathPatterns(commonPathPatterns.toArray(new String[]{})); super.addInterceptors(registry); } @Bean - ServiceAuthRestInterceptor getServiceAuthRestInterceptor(){ + ServiceAuthRestInterceptor getServiceAuthRestInterceptor() { return new ServiceAuthRestInterceptor(); } @Bean - UserAuthRestInterceptor getUserAuthRestInterceptor(){ + UserAuthRestInterceptor getUserAuthRestInterceptor() { return new UserAuthRestInterceptor(); } - private ArrayList getExcludeCommonPathPatterns(){ + private ArrayList getExcludeCommonPathPatterns() { ArrayList list = new ArrayList<>(); String[] urls = { "/v2/api-docs", - "/swagger-resources/**" + "/swagger-resources/**", + "/cache/**" }; - Collections.addAll(list,urls); + Collections.addAll(list, urls); return list; + } + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + registry.addResourceHandler("/static/cache/**").addResourceLocations( + "classpath:/META-INF/static/"); + super.addResourceHandlers(registry); } } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/ElementController.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/ElementController.java index b2e7fa76aff813170663c77e9fb59b32f2020597..1dfb742dc09c190fed37eeec03f2e1b806eef627 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/ElementController.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/ElementController.java @@ -1,11 +1,8 @@ package com.github.wxiaoqi.security.admin.rest; -import com.github.pagehelper.PageHelper; import com.github.wxiaoqi.security.admin.biz.ElementBiz; import com.github.wxiaoqi.security.admin.biz.UserBiz; import com.github.wxiaoqi.security.admin.entity.Element; -import com.github.wxiaoqi.security.admin.entity.User; -import com.github.wxiaoqi.security.common.biz.BaseBiz; import com.github.wxiaoqi.security.common.msg.ObjectRestResponse; import com.github.wxiaoqi.security.common.msg.TableResultResponse; import com.github.wxiaoqi.security.common.rest.BaseController; @@ -51,7 +48,7 @@ public class ElementController extends BaseController { public ObjectRestResponse getAuthorityElement(String menuId) { int userId = userBiz.getUserByUsername(getCurrentUserName()).getId(); List elements = baseBiz.getAuthorityElementByUserId(userId + "",menuId); - return new ObjectRestResponse>().rel(true).data(elements); + return new ObjectRestResponse>().data(elements); } @RequestMapping(value = "/user/menu", method = RequestMethod.GET) @@ -59,6 +56,6 @@ public class ElementController extends BaseController { public ObjectRestResponse getAuthorityElement() { int userId = userBiz.getUserByUsername(getCurrentUserName()).getId(); List elements = baseBiz.getAuthorityElementByUserId(userId + ""); - return new ObjectRestResponse>().rel(true).data(elements); + return new ObjectRestResponse>().data(elements); } } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/UserRest.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/UserRest.java index 0e29d0d857aac8bfbb7e6c8356243b7e0167c27c..78f0ad201b1ba3a92936ee1468e61dc75ce00205 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/UserRest.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/UserRest.java @@ -20,19 +20,21 @@ public class UserRest { @Autowired private PermissionService permissionService; - @RequestMapping(value = "/user/username/{username}",method = RequestMethod.GET, produces="application/json") - public @ResponseBody UserInfo getUserByUsername(@PathVariable("username")String username) { - return permissionService.getUserByUsername(username); - } - @RequestMapping(value = "/permissions", method = RequestMethod.GET) - public @ResponseBody List getAllPermission(){ + public @ResponseBody + List getAllPermission(){ return permissionService.getAllPermission(); } - @RequestMapping(value = "/user/un/{username}/permissions", method = RequestMethod.GET) public @ResponseBody List getPermissionByUsername(@PathVariable("username") String username){ return permissionService.getPermissionByUsername(username); } + + @RequestMapping(value = "/user/validate", method = RequestMethod.POST) + public @ResponseBody UserInfo validate(String username,String password){ + return permissionService.validate(username,password); + } + + } diff --git a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/service/PermissionService.java b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/service/PermissionService.java index 61c1d7113c254a8f3393e7a2c45faaf9497d9adf..1ad58340bbc68da9bf624716272ce0dc9a356fd7 100644 --- a/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/service/PermissionService.java +++ b/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rpc/service/PermissionService.java @@ -17,6 +17,7 @@ import com.github.wxiaoqi.security.common.util.TreeUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -37,6 +38,8 @@ public class PermissionService { private ElementBiz elementBiz; @Autowired private UserAuthUtil userAuthUtil; + private BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(12); + public UserInfo getUserByUsername(String username) { UserInfo info = new UserInfo(); @@ -46,6 +49,16 @@ public class PermissionService { return info; } + public UserInfo validate(String username,String password){ + UserInfo info = new UserInfo(); + User user = userBiz.getUserByUsername(username); + if (encoder.matches(password, user.getPassword())) { + BeanUtils.copyProperties(user, info); + info.setId(user.getId().toString()); + } + return info; + } + public List getAllPermission() { List menus = menuBiz.selectListAll(); List result = new ArrayList(); diff --git a/ace-admin/src/main/resources/application.yml b/ace-admin/src/main/resources/application.yml index 64b2120cabb2abef2304ddffb959b3365be6ee73..e3a331b8a559bb413416d437d39eaa09b8779a4b 100644 --- a/ace-admin/src/main/resources/application.yml +++ b/ace-admin/src/main/resources/application.yml @@ -1,6 +1,6 @@ logging: level: - tk.mybatis: DEBUG +# tk.mybatis: DEBUG com.github.wxiaoqi.security.admin: DEBUG spring: application: @@ -50,12 +50,11 @@ eureka: # prefer-ip-address: true # ip-address: 127.0.0.1 client: - registerWithEureka: true - fetchRegistry: true serviceUrl: - defaultZone: http://localhost:8761/eureka/ +# defaultZone: http://localhost:8761/eureka/ # docker 部署开启 -# defaultZone: http://center:8761/eureka/ + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ + swagger: basepackage: com.github.wxiaoqi.security.admin service: @@ -76,3 +75,18 @@ auth: token-header: client-token pub-key: path: client/pub.key + +#redis-cache 相关 +redis: + pool: + maxActive: 300 + maxIdle: 100 + maxWait: 1000 + host: 127.0.0.1 + port: 6379 + password: + timeout: 2000 + # 服务或应用名 + sysName: ace-admin + enable: true + database: 0 \ No newline at end of file diff --git a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceFeignInterceptor.java b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceFeignInterceptor.java index ff395749933f7c66b47ff5dd6a7b2d355fa262c7..12b0a2dd0916832e232085ed7710d79109c75f6e 100644 --- a/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceFeignInterceptor.java +++ b/ace-auth/ace-auth-client/src/main/java/com/github/wxiaoqi/security/auth/client/interceptor/ServiceFeignInterceptor.java @@ -11,7 +11,9 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; /** - * Created by ace on 2017/9/15. + * + * @author ace + * @date 2017/9/15 */ public class ServiceFeignInterceptor implements RequestInterceptor { private Logger logger = LoggerFactory.getLogger(ServiceFeignInterceptor.class); @@ -22,10 +24,25 @@ public class ServiceFeignInterceptor implements RequestInterceptor { @Autowired private ServiceAuthUtil serviceAuthUtil; + public ServiceFeignInterceptor() { + } + @Override public void apply(RequestTemplate requestTemplate) { requestTemplate.header(serviceAuthConfig.getTokenHeader(), serviceAuthUtil.getClientToken()); requestTemplate.header(userAuthConfig.getTokenHeader(), BaseContextHandler.getToken()); } + + public void setServiceAuthConfig(ServiceAuthConfig serviceAuthConfig) { + this.serviceAuthConfig = serviceAuthConfig; + } + + public void setUserAuthConfig(UserAuthConfig userAuthConfig) { + this.userAuthConfig = userAuthConfig; + } + + public void setServiceAuthUtil(ServiceAuthUtil serviceAuthUtil) { + this.serviceAuthUtil = serviceAuthUtil; + } } \ No newline at end of file diff --git a/ace-auth/ace-auth-server/pom.xml b/ace-auth/ace-auth-server/pom.xml index e3505450084841adb60663f6ac137e8bfc0a0eb4..c80052941cbda94291db6d1fbf628081ab4f93aa 100644 --- a/ace-auth/ace-auth-server/pom.xml +++ b/ace-auth/ace-auth-server/pom.xml @@ -107,7 +107,36 @@ + ace-auth + + org.springframework.boot + spring-boot-maven-plugin + + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + package + + build + + + + + ${docker.image.prefix}/${project.build.finalName} + ${project.basedir}/src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/ace-auth/ace-auth-server/src/main/docker/Dockerfile b/ace-auth/ace-auth-server/src/main/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..05c55fa0a57de31484fbf305d7df72c6031084c3 --- /dev/null +++ b/ace-auth/ace-auth-server/src/main/docker/Dockerfile @@ -0,0 +1,5 @@ +FROM livingobjects/jre8 +VOLUME /tmp +ADD ace-auth.jar app.jar +RUN bash -c 'touch /app.jar' +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java index 8745b640b8845f970b27af5e64ac6004cd3f6dff..377a492c44d2776a23973c59064cb08225b086d2 100755 --- a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/controller/AuthController.java @@ -1,6 +1,5 @@ package com.github.wxiaoqi.security.auth.controller; -import com.github.pagehelper.PageHelper; import com.github.wxiaoqi.security.auth.service.AuthService; import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationRequest; import com.github.wxiaoqi.security.auth.util.user.JwtAuthenticationResponse; @@ -50,5 +49,4 @@ public class AuthController { authService.invalid(token); return ResponseEntity.ok(true); } - } diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java index c117fc2885e08c51126334be4abfb10eec4c98f1..cb6f62ed8a8a2be886dc6d030588e5bbcc8c424a 100644 --- a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/feign/IUserService.java @@ -3,9 +3,9 @@ package com.github.wxiaoqi.security.auth.feign; import com.github.wxiaoqi.security.api.vo.user.UserInfo; import com.github.wxiaoqi.security.auth.configuration.FeignConfiguration; import org.springframework.cloud.netflix.feign.FeignClient; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; /** @@ -16,11 +16,6 @@ import org.springframework.web.bind.annotation.RequestMethod; */ @FeignClient(value = "ace-admin",configuration = FeignConfiguration.class) public interface IUserService { - /** - * 根据用户名放回用户信息 - * @param username - * @return - */ - @RequestMapping(value = "/api/user/username/{username}", method = RequestMethod.GET) - public UserInfo getUserByUsername(@PathVariable("username") String username); + @RequestMapping(value = "/api/user/validate", method = RequestMethod.POST) + public UserInfo validate(@RequestParam("username") String username, @RequestParam("password") String password); } diff --git a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java index c999a12b8da57005cfd49452c87608fefe487545..c904ae8ce9c4d3616a11551f10bd5add6fa39e01 100755 --- a/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java +++ b/ace-auth/ace-auth-server/src/main/java/com/github/wxiaoqi/security/auth/service/impl/AuthServiceImpl.java @@ -8,6 +8,7 @@ import com.github.wxiaoqi.security.auth.util.user.JwtTokenUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; @Service public class AuthServiceImpl implements AuthService { @@ -26,9 +27,9 @@ public class AuthServiceImpl implements AuthService { @Override public String login(String username, String password) throws Exception { - UserInfo info = userService.getUserByUsername(username); + UserInfo info = userService.validate(username,password); String token = ""; - if (encoder.matches(password, info.getPassword())) { + if (!StringUtils.isEmpty(info.getId())) { token = jwtTokenUtil.generateToken(new JWTInfo(info.getUsername(), info.getId() + "", info.getName())); } return token; diff --git a/ace-auth/ace-auth-server/src/main/resources/application.yml b/ace-auth/ace-auth-server/src/main/resources/application.yml index 3b9fce8de1c5c5034b35115bbda7bfe4fa6deeea..21fc1a3aa0b9f28bb95f25f15475ec6af903c57b 100644 --- a/ace-auth/ace-auth-server/src/main/resources/application.yml +++ b/ace-auth/ace-auth-server/src/main/resources/application.yml @@ -74,9 +74,10 @@ eureka: # ip-address: 127.0.0.1 client: serviceUrl: - defaultZone: http://localhost:8761/eureka/ +# defaultZone: http://localhost:8761/eureka/ # docker 部署开启 -# defaultZone: http://center:8761/eureka/ + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ + jwt: diff --git a/ace-center/pom.xml b/ace-center/pom.xml index 66628b5f7257aac69719ad43bedab9439293ec34..c8eda77fa5bdf8b7df598c8c7286d0bb3d07a6c4 100644 --- a/ace-center/pom.xml +++ b/ace-center/pom.xml @@ -41,30 +41,30 @@ org.springframework.boot spring-boot-maven-plugin - - - - - - - - - - - - - - - - - - - - - - - - + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + package + + build + + + + + ${docker.image.prefix}/${project.build.finalName} + ${project.basedir}/src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + \ No newline at end of file diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java index d8f542598942dd165b02b719d477b46600c67490..07fc3c4cff4bf41e05bfa0ec4d4c09d151783a2c 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/msg/ListRestResponse.java @@ -7,27 +7,11 @@ package com.github.wxiaoqi.security.common.msg; * @create 2017-06-09 7:32 */ public class ListRestResponse { - boolean rel; String msg; T result; int count; - String callback; - public String getCallback() { - return callback; - } - public void setCallback(String callback) { - this.callback = callback; - } - - public boolean isRel() { - return rel; - } - - public void setRel(boolean rel) { - this.rel = rel; - } public String getMsg() { return msg; @@ -63,11 +47,6 @@ public class ListRestResponse { return this; } - public ListRestResponse rel(boolean rel) { - this.setRel(rel); - return this; - } - public ListRestResponse msg(String msg) { this.setMsg(msg); return this; diff --git a/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java b/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java index 910c18125afa1def9dfef4bc100e53a63e69a5ec..b60455ffc6cdaca06f9068bf14b11ee0a49b8128 100644 --- a/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java +++ b/ace-common/src/main/java/com/github/wxiaoqi/security/common/rest/BaseController.java @@ -28,26 +28,29 @@ public class BaseController { @ResponseBody public ObjectRestResponse add(@RequestBody Entity entity){ baseBiz.insertSelective(entity); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/{id}",method = RequestMethod.GET) @ResponseBody public ObjectRestResponse get(@PathVariable int id){ - return new ObjectRestResponse().rel(true).data(baseBiz.selectById(id)); + ObjectRestResponse entityObjectRestResponse = new ObjectRestResponse<>(); + Object o = baseBiz.selectById(id); + entityObjectRestResponse.data((Entity)o); + return entityObjectRestResponse; } @RequestMapping(value = "/{id}",method = RequestMethod.PUT) @ResponseBody public ObjectRestResponse update(@RequestBody Entity entity){ baseBiz.updateSelectiveById(entity); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/{id}",method = RequestMethod.DELETE) @ResponseBody public ObjectRestResponse remove(@PathVariable int id){ baseBiz.deleteById(id); - return new ObjectRestResponse().rel(true); + return new ObjectRestResponse(); } @RequestMapping(value = "/all",method = RequestMethod.GET) diff --git a/ace-config/pom.xml b/ace-config/pom.xml index 517ffea72c92cc0b50908fbc0ebe898574b76253..39a0dba2a61c109badd185fd5072a426b62f2852 100644 --- a/ace-config/pom.xml +++ b/ace-config/pom.xml @@ -26,11 +26,44 @@ + ace-config org.springframework.boot spring-boot-maven-plugin + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + package + + build + + + + + ${docker.image.prefix}/${project.build.finalName} + ${project.basedir}/src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + diff --git a/ace-config/src/main/docker/Dockerfile b/ace-config/src/main/docker/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..5eec517cd842c5a7e53829d057f65ecd3a466578 --- /dev/null +++ b/ace-config/src/main/docker/Dockerfile @@ -0,0 +1,5 @@ +FROM livingobjects/jre8 +VOLUME /tmp +ADD ace-config.jar app.jar +RUN bash -c 'touch /app.jar' +ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] diff --git a/ace-config/src/main/resources/application.yml b/ace-config/src/main/resources/application.yml index aa49cfec9e194c07a3c3253e5c4424fbb34d212c..c03c13615bdf0ffa2971f703507e3db348a4bad3 100644 --- a/ace-config/src/main/resources/application.yml +++ b/ace-config/src/main/resources/application.yml @@ -11,6 +11,14 @@ server: port: 8750 #启动端口 eureka: - client: - service-url: - defaultZone: http://localhost:8761/eureka \ No newline at end of file + instance: + statusPageUrlPath: /info + healthCheckUrlPath: /health + # docker 部署开启 +# prefer-ip-address: true +# ip-address: 127.0.0.1 + client: + serviceUrl: +# defaultZone: http://localhost:8761/eureka/ + # docker 部署开启 + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ diff --git a/ace-gate/ace-gate-server/pom.xml b/ace-gate/ace-gate-server/pom.xml index a40abe5f3a786db8540c7547fbfbcbed0a798260..67e8748371be245b211b49008927a6e322e59c56 100644 --- a/ace-gate/ace-gate-server/pom.xml +++ b/ace-gate/ace-gate-server/pom.xml @@ -66,7 +66,11 @@ ace-gate-ratelimit 1.0-SNAPSHOT - + + com.netflix.feign + feign-jackson + 8.18.0 + ace-gate @@ -75,30 +79,52 @@ org.springframework.boot spring-boot-maven-plugin - - - - - - - - - - - - - - - - - - - - - - - - + + org.apache.maven.plugins + maven-resources-plugin + + + prepare-dockerfile + validate + + copy-resources + + + ${project.build.directory}/docker + + + ${project.basedir}/src/main/docker + true + + + + + + + + com.spotify + docker-maven-plugin + ${docker.plugin.version} + + + package + + build + + + + + ${docker.image.prefix}/${project.build.finalName} + ${project.basedir}/src/main/docker + + + / + ${project.build.directory} + ${project.build.finalName}.jar + + + + org.apache.maven.plugins maven-compiler-plugin diff --git a/ace-gate/ace-gate-server/src/main/docker/Dockerfile b/ace-gate/ace-gate-server/src/main/docker/Dockerfile old mode 100644 new mode 100755 index 99c28b7271114903c15ef2c506da4464898e3b32..5bfd8cd41bede8a487926f84c3f3f3d16b7cb473 --- a/ace-gate/ace-gate-server/src/main/docker/Dockerfile +++ b/ace-gate/ace-gate-server/src/main/docker/Dockerfile @@ -1,5 +1,7 @@ -FROM livingobjects/jre8 -VOLUME /tmp -ADD ace-gate.jar app.jar -RUN bash -c 'touch /app.jar' -ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] +FROM java:8 +VOLUME /tmp +ADD ace-gate.jar app.jar +ADD wait-for-it.sh /wait-for-it.sh +RUN sh -c 'touch /app.jar' +RUN bash -c 'chmod 777 /wait-for-it.sh' +CMD exec java -Djava.security.egd=file:/dev/./urandom -jar /app.jar \ No newline at end of file diff --git a/ace-gate/ace-gate-server/src/main/docker/wait-for-it.sh b/ace-gate/ace-gate-server/src/main/docker/wait-for-it.sh new file mode 100755 index 0000000000000000000000000000000000000000..401a6f1790a2ae9424b84160bb0c1b68e6ff1f45 --- /dev/null +++ b/ace-gate/ace-gate-server/src/main/docker/wait-for-it.sh @@ -0,0 +1,177 @@ +#!/usr/bin/env bash +# Use this script to test if a given TCP host/port are available + +cmdname=$(basename $0) + +echoerr() { if [[ $QUIET -ne 1 ]]; then echo "$@" 1>&2; fi } + +usage() +{ + cat << USAGE >&2 +Usage: + $cmdname host:port [-s] [-t timeout] [-- command args] + -h HOST | --host=HOST Host or IP under test + -p PORT | --port=PORT TCP port under test + Alternatively, you specify the host and port as host:port + -s | --strict Only execute subcommand if the test succeeds + -q | --quiet Don't output any status messages + -t TIMEOUT | --timeout=TIMEOUT + Timeout in seconds, zero for no timeout + -- COMMAND ARGS Execute command with args after the test finishes +USAGE + exit 1 +} + +wait_for() +{ + if [[ $TIMEOUT -gt 0 ]]; then + echoerr "$cmdname: waiting $TIMEOUT seconds for $HOST:$PORT" + else + echoerr "$cmdname: waiting for $HOST:$PORT without a timeout" + fi + start_ts=$(date +%s) + while : + do + if [[ $ISBUSY -eq 1 ]]; then + nc -z $HOST $PORT + result=$? + else + (echo > /dev/tcp/$HOST/$PORT) >/dev/null 2>&1 + result=$? + fi + if [[ $result -eq 0 ]]; then + end_ts=$(date +%s) + echoerr "$cmdname: $HOST:$PORT is available after $((end_ts - start_ts)) seconds" + break + fi + sleep 1 + done + return $result +} + +wait_for_wrapper() +{ + # In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692 + if [[ $QUIET -eq 1 ]]; then + timeout $BUSYTIMEFLAG $TIMEOUT $0 --quiet --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + else + timeout $BUSYTIMEFLAG $TIMEOUT $0 --child --host=$HOST --port=$PORT --timeout=$TIMEOUT & + fi + PID=$! + trap "kill -INT -$PID" INT + wait $PID + RESULT=$? + if [[ $RESULT -ne 0 ]]; then + echoerr "$cmdname: timeout occurred after waiting $TIMEOUT seconds for $HOST:$PORT" + fi + return $RESULT +} + +# process arguments +while [[ $# -gt 0 ]] +do + case "$1" in + *:* ) + hostport=(${1//:/ }) + HOST=${hostport[0]} + PORT=${hostport[1]} + shift 1 + ;; + --child) + CHILD=1 + shift 1 + ;; + -q | --quiet) + QUIET=1 + shift 1 + ;; + -s | --strict) + STRICT=1 + shift 1 + ;; + -h) + HOST="$2" + if [[ $HOST == "" ]]; then break; fi + shift 2 + ;; + --host=*) + HOST="${1#*=}" + shift 1 + ;; + -p) + PORT="$2" + if [[ $PORT == "" ]]; then break; fi + shift 2 + ;; + --port=*) + PORT="${1#*=}" + shift 1 + ;; + -t) + TIMEOUT="$2" + if [[ $TIMEOUT == "" ]]; then break; fi + shift 2 + ;; + --timeout=*) + TIMEOUT="${1#*=}" + shift 1 + ;; + --) + shift + CLI="$@" + break + ;; + --help) + usage + ;; + *) + echoerr "Unknown argument: $1" + usage + ;; + esac +done + +if [[ "$HOST" == "" || "$PORT" == "" ]]; then + echoerr "Error: you need to provide a host and port to test." + usage +fi + +TIMEOUT=${TIMEOUT:-15} +STRICT=${STRICT:-0} +CHILD=${CHILD:-0} +QUIET=${QUIET:-0} + +# check to see if timeout is from busybox? +# check to see if timeout is from busybox? +TIMEOUT_PATH=$(realpath $(which timeout)) +if [[ $TIMEOUT_PATH =~ "busybox" ]]; then + ISBUSY=1 + BUSYTIMEFLAG="-t" +else + ISBUSY=0 + BUSYTIMEFLAG="" +fi + +if [[ $CHILD -gt 0 ]]; then + wait_for + RESULT=$? + exit $RESULT +else + if [[ $TIMEOUT -gt 0 ]]; then + wait_for_wrapper + RESULT=$? + else + wait_for + RESULT=$? + fi +fi + +if [[ $CLI != "" ]]; then + if [[ $RESULT -ne 0 && $STRICT -eq 1 ]]; then + echoerr "$cmdname: strict mode, refusing to execute subprocess" + exit $RESULT + fi + exec $CLI +else + exit $RESULT +fi diff --git a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/config/ZuulConfig.java b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/config/ZuulConfig.java deleted file mode 100644 index de80468c55c2bdfae684b0c4245276daf83adea3..0000000000000000000000000000000000000000 --- a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/config/ZuulConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.github.wxiaoqi.security.gate.config; - -import com.github.wxiaoqi.security.auth.client.interceptor.ServiceFeignInterceptor; -import org.springframework.context.annotation.Bean; - -/** - * Created by ace on 2017/9/12. - */ -//@Configuration -public class ZuulConfig { - @Bean - ServiceFeignInterceptor getClientTokenInterceptor(){ - return new ServiceFeignInterceptor(); - } -} diff --git a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java index 4d45ccc156b3f621a3b723d7f208d6af740360c2..ead97e5280704101107b308f35c97d2da695b332 100644 --- a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java +++ b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/feign/IUserService.java @@ -1,12 +1,8 @@ package com.github.wxiaoqi.security.gate.feign; import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; -import com.github.wxiaoqi.security.gate.config.ZuulConfig; -import org.springframework.cloud.netflix.feign.FeignClient; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; +import feign.Param; +import feign.RequestLine; import java.util.List; @@ -17,13 +13,9 @@ import java.util.List; * @author wanghaobin * @create 2017-06-21 8:11 */ -@FeignClient(value = "ace-admin",configuration = {ZuulConfig.class}) -@RequestMapping("api") public interface IUserService { - @RequestMapping(value = "/user/username/{username}", method = RequestMethod.GET) - public UserInfo getUserByUsername(@PathVariable("username") String username); - @RequestMapping(value = "/user/un/{username}/permissions", method = RequestMethod.GET) - public List getPermissionByUsername(@PathVariable("username") String username); - @RequestMapping(value = "/permissions", method = RequestMethod.GET) + @RequestLine(value = "GET /api/user/un/{username}/permissions") + public List getPermissionByUsername(@Param("username") String username); + @RequestLine(value = "GET /api/permissions") List getAllPermissionInfo(); } diff --git a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java index b8a1e9c7f13dc9b82d28bf1bbfaeeacf19a01e7d..e790c7f383b9ec24f1b941b35466ea3a724cff82 100644 --- a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java +++ b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/filter/AdminAccessFilter.java @@ -3,9 +3,9 @@ package com.github.wxiaoqi.security.gate.filter; import com.alibaba.fastjson.JSON; import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; import com.github.wxiaoqi.security.api.vo.log.LogInfo; -import com.github.wxiaoqi.security.api.vo.user.UserInfo; import com.github.wxiaoqi.security.auth.client.config.ServiceAuthConfig; import com.github.wxiaoqi.security.auth.client.config.UserAuthConfig; +import com.github.wxiaoqi.security.auth.client.interceptor.ServiceFeignInterceptor; import com.github.wxiaoqi.security.auth.client.jwt.ServiceAuthUtil; import com.github.wxiaoqi.security.auth.client.jwt.UserAuthUtil; import com.github.wxiaoqi.security.auth.common.util.jwt.IJWTInfo; @@ -18,14 +18,20 @@ import com.github.wxiaoqi.security.gate.feign.IUserService; import com.github.wxiaoqi.security.gate.utils.DBLog; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; +import com.netflix.appinfo.InstanceInfo; +import com.netflix.discovery.EurekaClient; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; +import feign.Feign; +import feign.jackson.JacksonDecoder; +import feign.jackson.JacksonEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletRequest; import java.net.URLEncoder; import java.util.Collection; @@ -43,7 +49,6 @@ import java.util.regex.Pattern; @Slf4j public class AdminAccessFilter extends ZuulFilter { - @Autowired private IUserService userService; @Autowired private ILogService logService; @@ -65,6 +70,22 @@ public class AdminAccessFilter extends ZuulFilter { @Autowired private ServiceAuthUtil serviceAuthUtil; + @Autowired + private EurekaClient discoveryClient; + + @PostConstruct + public void init() { + InstanceInfo prodSvcInfo = discoveryClient.getNextServerFromEureka("ACE-ADMIN", false); + ServiceFeignInterceptor serviceFeignInterceptor = new ServiceFeignInterceptor(); + serviceFeignInterceptor.setServiceAuthConfig(serviceAuthConfig); + serviceFeignInterceptor.setServiceAuthUtil(serviceAuthUtil); + serviceFeignInterceptor.setUserAuthConfig(userAuthConfig); + this.userService = Feign.builder().encoder(new JacksonEncoder()) + .decoder(new JacksonDecoder()) + .requestInterceptor(serviceFeignInterceptor) + .target(IUserService.class, prodSvcInfo.getHomePageUrl()); + } + @Override public String filterType() { return "pre"; @@ -102,7 +123,7 @@ public class AdminAccessFilter extends ZuulFilter { // 判断资源是否启用权限约束 Collection result = getPermissionInfos(requestUri, method, permissionInfos); if(result.size()>0){ - checkAllow(requestUri, method, ctx, user.getUniqueName()); + checkUserPermission(requestUri, method, ctx, user); } // 申请客户端密钥头 ctx.addZuulRequestHeader(serviceAuthConfig.getTokenHeader(),serviceAuthUtil.getClientToken()); @@ -130,13 +151,12 @@ public class AdminAccessFilter extends ZuulFilter { }); } - private void setCurrentUserInfoAndLog(RequestContext ctx, String username, PermissionInfo pm) { - UserInfo info = userService.getUserByUsername(username); + private void setCurrentUserInfoAndLog(RequestContext ctx, IJWTInfo user, PermissionInfo pm) { String host = ClientUtil.getClientIp(ctx.getRequest()); - ctx.addZuulRequestHeader("userId", info.getId()); - ctx.addZuulRequestHeader("userName", URLEncoder.encode(info.getName())); + ctx.addZuulRequestHeader("userId", user.getId()); + ctx.addZuulRequestHeader("userName", URLEncoder.encode(user.getName())); ctx.addZuulRequestHeader("userHost", ClientUtil.getClientIp(ctx.getRequest())); - LogInfo logInfo = new LogInfo(pm.getMenu(),pm.getName(),pm.getUri(),new Date(),info.getId(),info.getName(),host); + LogInfo logInfo = new LogInfo(pm.getMenu(),pm.getName(),pm.getUri(),new Date(),user.getId(),user.getName(),host); DBLog.getInstance().setLogService(logService).offerQueue(logInfo); } @@ -178,9 +198,9 @@ public class AdminAccessFilter extends ZuulFilter { * @param requestUri * @param method */ - private void checkAllow(final String requestUri, final String method ,RequestContext ctx,String username) { + private void checkUserPermission(final String requestUri, final String method ,RequestContext ctx,IJWTInfo user) { log.debug("uri:" + requestUri + "----method:" + method); - List permissionInfos = getPermissionInfos(ctx.getRequest(), username) ; + List permissionInfos = getPermissionInfos(ctx.getRequest(), user.getUniqueName()) ; Collection result = getPermissionInfos(requestUri, method, permissionInfos); if (result.size() <= 0) { setFailedRequest(JSON.toJSONString(new TokenForbiddenResponse("Token Forbidden!")), 200); @@ -188,7 +208,7 @@ public class AdminAccessFilter extends ZuulFilter { PermissionInfo[] pms = result.toArray(new PermissionInfo[]{}); PermissionInfo pm = pms[0]; if(!"GET".equals(method)){ - setCurrentUserInfoAndLog(ctx, username, pm); + setCurrentUserInfoAndLog(ctx, user, pm); } } } diff --git a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/vo/FrontUser.java b/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/vo/FrontUser.java deleted file mode 100644 index 3386c2ea2435d56638b5090f9868a602083a8fb0..0000000000000000000000000000000000000000 --- a/ace-gate/ace-gate-server/src/main/java/com/github/wxiaoqi/security/gate/vo/FrontUser.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.github.wxiaoqi.security.gate.vo; - -import com.github.wxiaoqi.security.api.vo.authority.PermissionInfo; - -import java.util.List; - -/** - * Created by ace on 2017/8/22. - */ -public class FrontUser { - public String id; - public String username; - public String name; - private String description; - private String image; - private List menus; - private List elements; - public String getImage() { - return image; - } - - public void setImage(String image) { - this.image = image; - } - - - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - public List getMenus() { - return menus; - } - - public void setMenus(List menus) { - this.menus = menus; - } - - public List getElements() { - return elements; - } - - public void setElements(List elements) { - this.elements = elements; - } -} diff --git a/ace-gate/ace-gate-server/src/main/resources/bootstrap.yml b/ace-gate/ace-gate-server/src/main/resources/bootstrap.yml index 1166e27adce6ae057cf085b3ba677b9adfbc2f07..882ce6845937913f321f4e899e7af2ed8960cd5d 100644 --- a/ace-gate/ace-gate-server/src/main/resources/bootstrap.yml +++ b/ace-gate/ace-gate-server/src/main/resources/bootstrap.yml @@ -17,9 +17,9 @@ eureka: # ip-address: 127.0.0.1 client: serviceUrl: - defaultZone: http://localhost:8761/eureka/ +# defaultZone: http://localhost:8761/eureka/ # docker 部署开启 -# defaultZone: http://center:8761/eureka/ + defaultZone: http://${EUREKA_HOST:localhost}:${EUREKA_PORT:8761}/eureka/ #请求和响应GZIP压缩支持 feign: