Browse Source

新增路由器

chenweida 6 years ago
parent
commit
1bef1a83e4
35 changed files with 1185 additions and 197 deletions
  1. 45 0
      common-router-starter/pom.xml
  2. 28 0
      common-router-starter/src/main/java/com/yihu/base/router/RefreshRouteService.java
  3. 90 0
      common-router-starter/src/main/java/com/yihu/base/router/RouteEndPoint.java
  4. 65 0
      common-router-starter/src/main/java/com/yihu/base/router/RouterAutoConfig.java
  5. 101 0
      common-router-starter/src/main/java/com/yihu/base/router/model/RuleRoute.java
  6. 31 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/IPRateLimiter.java
  7. 17 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/IRatelimiter.java
  8. 58 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/filter/RateLimitFilter.java
  9. 13 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/AbstractRateLimitManager.java
  10. 11 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/IRateLimitManager.java
  11. 26 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/SimpleRateLimitManager.java
  12. 7 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/AbstractRateLimitStorage.java
  13. 7 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/IRateLimitStorage.java
  14. 9 0
      common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/RedisRateLimitStorage.java
  15. 104 0
      common-router-starter/src/main/java/com/yihu/base/router/route/SimplerRouter.java
  16. 15 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/manager/AbstractRuleManager.java
  17. 12 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/manager/IRuleManager.java
  18. 27 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/manager/SimpleRuleManager.java
  19. 45 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/storage/AbstractRuleStorage.java
  20. 63 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/storage/IRuleStorage.java
  21. 7 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/storage/JDBCRuleStorage.java
  22. 113 0
      common-router-starter/src/main/java/com/yihu/base/router/rule/storage/RedisRuleStorage.java
  23. 76 0
      common-router-starter/src/main/java/com/yihu/base/router/util/NetworkUtil.java
  24. 2 0
      common-router-starter/src/main/resources/META-INF/spring.factories
  25. 3 0
      common-router-starter/src/main/resources/template.yml
  26. 1 1
      common-security-starter/pom.xml
  27. 2 1
      common-security-starter/src/main/java/com.yihu.base.security/config/ResourceServerConfig.java
  28. 7 2
      demo/pom.xml
  29. 1 0
      demo/src/main/java/com/demo/config/SwaggerConfig.java
  30. 5 0
      demo/src/main/java/com/demo/controller/DemoController.java
  31. 130 130
      demo/src/main/java/com/demo/controller/SecurityController.java
  32. 18 18
      demo/src/main/java/com/demo/service/RBASService.java
  33. 44 44
      demo/src/main/java/com/demo/service/UserService.java
  34. 1 1
      demo/src/main/resources/application.yml
  35. 1 0
      pom.xml

+ 45 - 0
common-router-starter/pom.xml

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>jkzl-start</artifactId>
        <groupId>com.yihu</groupId>
        <version>1.0.0</version>
        <relativePath>../pom.xml</relativePath>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <version>1.0.0</version>
    <artifactId>common-router-starter</artifactId>
    <dependencies>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
    </dependencies>
</project>

+ 28 - 0
common-router-starter/src/main/java/com/yihu/base/router/RefreshRouteService.java

@ -0,0 +1,28 @@
package com.yihu.base.router;
import com.yihu.base.router.route.SimplerRouter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.event.InstanceRegisteredEvent;
import org.springframework.cloud.netflix.zuul.web.ZuulHandlerMapping;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
 * Created by chenweida on 2018/4/19 0019.
 */
public class RefreshRouteService {
    @Resource(name = "zuulDiscoveryRefreshRoutesListener")
    ApplicationListener publisher;
    @Autowired
    private   SimplerRouter routeLocator;
    @Autowired
    private ZuulHandlerMapping zuulHandlerMapping;
    public void refreshRoute() {
        InstanceRegisteredEvent instanceRegisteredEvent=new InstanceRegisteredEvent(routeLocator,null);
        publisher.onApplicationEvent(instanceRegisteredEvent);
    }
}

+ 90 - 0
common-router-starter/src/main/java/com/yihu/base/router/RouteEndPoint.java

@ -0,0 +1,90 @@
package com.yihu.base.router;
import com.yihu.base.router.model.RuleRoute;
import com.yihu.base.router.rule.storage.IRuleStorage;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
/**
 * Created by chenweida on 2018/4/27 0027.
 * 路由规则端点
 */
@RestController
@RequestMapping("/route")
public class RouteEndPoint {
    @Autowired
    private IRuleStorage ruleStorage;
    @Autowired
    private RefreshRouteService refreshRouteService;
    @PostMapping(value = "/rule/save")
    public String saveRule(
            @ApiParam(name = "id", value = "主键", required = true) @RequestParam(required = true, name = "id") String id,
            @ApiParam(name = "path", value = "网关暴露出去的路径  例:/v1/simple2/**", required = true) @RequestParam(required = true, name = "path") String path,
            @ApiParam(name = "serviceId", value = "注册到微服务的Id", required = false) @RequestParam(required = false, name = "serviceId") String serviceId,
            @ApiParam(name = "url", value = "跳转的路径 例:http://localhost:10010/", required = false) @RequestParam(required = false, name = "url") String url,
            @ApiParam(name = "retryable", value = "失败是否重试 ", required = false) @RequestParam(required = false, name = "retryable", defaultValue = "true") Boolean retryable,
            @ApiParam(name = "enabled", value = "是否有用", required = false) @RequestParam(required = false, name = "enabled", defaultValue = "true") Boolean enabled
    ) {
        RuleRoute ruleRoute = new RuleRoute();
        ruleRoute.setId(id);
        ruleRoute.setEnabled(enabled);
        ruleRoute.setPath(path);
        ruleRoute.setServiceId(serviceId);
        ruleRoute.setRetryable(retryable);
        ruleRoute.setUrl(url);
        ruleStorage.saveRuleStorage(ruleRoute);
        return "成功";
    }
    @PostMapping(value = "/rule/update")
    public String updateRule(
            @ApiParam(name = "id", value = "主键", required = true) @RequestParam(required = true, name = "id") String id,
            @ApiParam(name = "path", value = "网关暴露出去的路径 例:/v1/simple2/**", required = true) @RequestParam(required = true, name = "path") String path,
            @ApiParam(name = "serviceId", value = "注册到微服务的Id", required = false) @RequestParam(required = false, name = "serviceId") String serviceId,
            @ApiParam(name = "url", value = "跳转的路径 例:http://localhost:10010/", required = false) @RequestParam(required = false, name = "url") String url,
            @ApiParam(name = "retryable", value = "失败是否重试 ", required = false) @RequestParam(required = false, name = "retryable", defaultValue = "true") Boolean retryable,
            @ApiParam(name = "enabled", value = "是否有用", required = false) @RequestParam(required = false, name = "enabled", defaultValue = "true") Boolean enabled
    ) {
        RuleRoute ruleRoute = ruleStorage.getRuleStorageById(id);
        if (!StringUtils.isEmpty(path)) {
            ruleRoute.setPath(path);
        }
        if (!StringUtils.isEmpty(path)) {
            ruleRoute.setServiceId(serviceId);
        }
        if (!StringUtils.isEmpty(path)) {
            ruleRoute.setRetryable(retryable);
        }
        if (!StringUtils.isEmpty(path)) {
            ruleRoute.setEnabled(enabled);
        }
        if (!StringUtils.isEmpty(path)) {
            ruleRoute.setUrl(url);
        }
        ruleStorage.updateRuleStorage(ruleRoute);
        return "成功";
    }
    @DeleteMapping(value = "/rule/delete")
    public String saveRule(
            @ApiParam(name = "id", value = "主键", required = true) @RequestParam(required = true, name = "id") String id
    ) {
        ruleStorage.deleteRuleStorageById(id);
        return "成功";
    }
    @PostMapping(value = "/rule/refresh")
    public String refresh(
    ) {
        refreshRouteService.refreshRoute();
        return "成功";
    }
}

+ 65 - 0
common-router-starter/src/main/java/com/yihu/base/router/RouterAutoConfig.java

@ -0,0 +1,65 @@
package com.yihu.base.router;
import com.yihu.base.router.route.SimplerRouter;
import com.yihu.base.router.rule.manager.SimpleRuleManager;
import com.yihu.base.router.rule.storage.AbstractRuleStorage;
import com.yihu.base.router.rule.storage.RedisRuleStorage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.core.StringRedisTemplate;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
@EnableZuulProxy
@Import({
        RouteEndPoint.class,
        RefreshRouteService.class})
public class RouterAutoConfig {
    @Autowired
    private StringRedisTemplate redisTemplate;
    @Autowired
    ZuulProperties zuulProperties;
    @Autowired
    ServerProperties server;
    //--------------------------限制规则相关配置 start---------------------------
    //--------------------------限制规则相关配置 end---------------------------
    //--------------------------路由规则相关配置 start---------------------------
    @Bean
    @ConditionalOnMissingBean
    public AbstractRuleStorage ruleStorage() {
        RedisRuleStorage redisRuleStorage = new RedisRuleStorage();
        redisRuleStorage.setRedisTemplate(redisTemplate);
        return redisRuleStorage;
    }
    @Bean
    @ConditionalOnMissingBean
    public SimpleRuleManager simpleRuleManager() {
        SimpleRuleManager simpleRuleManager = new SimpleRuleManager();
        simpleRuleManager.setRuleStorage(ruleStorage());
        return simpleRuleManager;
    }
    @Bean
    @ConditionalOnMissingBean
    public SimplerRouter simplerRouter() {
        SimplerRouter simplerRouter = new SimplerRouter(this.server.getServletPrefix(), this.zuulProperties);
        simplerRouter.setSimpleRuleManager(simpleRuleManager());
        return simplerRouter;
    }
    //--------------------------路由规则相关配置 end---------------------------
}

+ 101 - 0
common-router-starter/src/main/java/com/yihu/base/router/model/RuleRoute.java

@ -0,0 +1,101 @@
package com.yihu.base.router.model;
/**
 * Created by chenweida on 2018/4/19 0019.
 */
public class RuleRoute {
    /**
     * 主键
     */
    private String id;
    /**
     *  path是代理后的路径
     *  下面2种方式的path
     */
    private String path;
    /**
     * 微服务注册到发现服务的id
     * 即这种方式的 serviceId
     *  serviceId和url 2选1
     * zuul:
         routes:
           svr-simple1:    #这种方式和  svr-base: /base/**  一样  svr-base可以随便写 唯一即可
             path: /v1/simple2/**  #zuul path是代理后的路径
             serviceId: spring-cloud-svr-simple1  #serviceId是微服务name
     */
    private String serviceId;
    /**
     * 微服务的地址
     * 即下面这种方式的url
     *
     * zuul:
        routes:
          svr-simple2:     #这种方式和 上面一样 就是serviceId改成具体的url 但是这种配置方法不能利用eurika的负载均衡
            path: /v1/simple3/** #zuul path是代理后的路径
            url: http://localhost:10010/
     */
    private String url;
    /**
     * 失败是否重试
     * 在serviceId模式才有用
     */
    private Boolean retryable;
    /**
     * 是否有用
     */
    private Boolean enabled;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPath() {
        return path;
    }
    public void setPath(String path) {
        this.path = path;
    }
    public String getServiceId() {
        return serviceId;
    }
    public void setServiceId(String serviceId) {
        this.serviceId = serviceId;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Boolean getRetryable() {
        return retryable;
    }
    public void setRetryable(Boolean retryable) {
        this.retryable = retryable;
    }
    public Boolean getEnabled() {
        return enabled;
    }
    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }
}

+ 31 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/IPRateLimiter.java

@ -0,0 +1,31 @@
package com.yihu.base.router.ratelimit;
import com.yihu.base.router.model.RuleRoute;
import com.yihu.base.router.util.NetworkUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by chenweida on 2018/4/27 0027.
 * IP 规则验证器
 */
public class IPRateLimiter implements IRatelimiter {
    private Logger logger = LoggerFactory.getLogger(IPRateLimiter.class);
    @Override
    public Boolean rateLimit(HttpServletRequest request) {
        try {
            logger.info("path:" + request.getRequestURI());
            //这边可以根据数据库的配置去判断当前的路径是否是限制的
            String requestIP = NetworkUtil.getIpAddress(request);
            logger.info("ip:" + requestIP);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

+ 17 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/IRatelimiter.java

@ -0,0 +1,17 @@
package com.yihu.base.router.ratelimit;
import com.yihu.base.router.model.RuleRoute;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by chenweida on 2018/4/27 0027.
 * 限制器抽象类
 */
public interface IRatelimiter {
    /**
     * 限制规则
     * @return
     */
    Boolean rateLimit(HttpServletRequest httpServletRequest);
}

+ 58 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/filter/RateLimitFilter.java

@ -0,0 +1,58 @@
package com.yihu.base.router.ratelimit.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.yihu.base.router.ratelimit.manage.SimpleRateLimitManager;
import com.yihu.base.router.util.NetworkUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by chenweida on 2018/4/27 0027.
 * 规则过滤器
 */
public class RateLimitFilter extends ZuulFilter {
    private Logger logger = LoggerFactory.getLogger(RateLimitFilter.class);
    private SimpleRateLimitManager rateLimitManager;
    @Override
    public String filterType() {
        //filterType:返回过滤器的类型。有pre、route、post、error等几种取值
        return "pre";
    }
    @Override
    public int filterOrder() {
        //回一个int值来指定过滤器的执行顺序,不同的过滤器允许返回相同的数字
        return 1;
    }
    @Override
    public boolean shouldFilter() {
        //返回一个boolean值来判断该过滤器是否要执行,true表示执行,false表示不执行。
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        logger.info("path:"+request.getRequestURI());
        logger.info("这边可以根据数据库的配置去判断当前的路径是否是限制的");
        //这边可以根据数据库的配置去判断当前的路径是否是限制的
        //to do....................................
        return true;
    }
    @Override
    public Object run() {
        logger.info("进入zuul过滤器");
        return null;
    }
    public SimpleRateLimitManager getRateLimitManager() {
        return rateLimitManager;
    }
    public void setRateLimitManager(SimpleRateLimitManager rateLimitManager) {
        this.rateLimitManager = rateLimitManager;
    }
}

+ 13 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/AbstractRateLimitManager.java

@ -0,0 +1,13 @@
package com.yihu.base.router.ratelimit.manage;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class AbstractRateLimitManager implements IRateLimitManager {
    @Override
    public Boolean dofilter(HttpServletRequest request) {
        return null;
    }
}

+ 11 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/IRateLimitManager.java

@ -0,0 +1,11 @@
package com.yihu.base.router.ratelimit.manage;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public interface IRateLimitManager {
    Boolean dofilter(HttpServletRequest request);
}

+ 26 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/manage/SimpleRateLimitManager.java

@ -0,0 +1,26 @@
package com.yihu.base.router.ratelimit.manage;
import com.yihu.base.router.ratelimit.IPRateLimiter;
import com.yihu.base.router.ratelimit.IRatelimiter;
import javax.servlet.http.HttpServletRequest;
import java.util.Set;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class SimpleRateLimitManager extends AbstractRateLimitManager {
    //全部的规则校验器
    private Set<IRatelimiter> ratelimiters = null;
    //根据规则校验看当前的路径是否符合
    @Override
    public Boolean dofilter(HttpServletRequest request) {
        for (IRatelimiter ratelimiter : ratelimiters) {
            if (!ratelimiter.rateLimit(request)) {
                return false;
            }
        }
        return true;
    }
}

+ 7 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/AbstractRateLimitStorage.java

@ -0,0 +1,7 @@
package com.yihu.base.router.ratelimit.storage;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class AbstractRateLimitStorage implements IRateLimitStorage {
}

+ 7 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/IRateLimitStorage.java

@ -0,0 +1,7 @@
package com.yihu.base.router.ratelimit.storage;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public interface IRateLimitStorage {
}

+ 9 - 0
common-router-starter/src/main/java/com/yihu/base/router/ratelimit/storage/RedisRateLimitStorage.java

@ -0,0 +1,9 @@
package com.yihu.base.router.ratelimit.storage;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class RedisRateLimitStorage extends AbstractRateLimitStorage {
    private static String redisPre = "router:rateLimit:";
}

+ 104 - 0
common-router-starter/src/main/java/com/yihu/base/router/route/SimplerRouter.java

@ -0,0 +1,104 @@
package com.yihu.base.router.route;
import com.yihu.base.router.model.RuleRoute;
import com.yihu.base.router.rule.manager.SimpleRuleManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.cloud.netflix.zuul.filters.RefreshableRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.SimpleRouteLocator;
import org.springframework.cloud.netflix.zuul.filters.ZuulProperties;
import org.springframework.util.StringUtils;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by chenweida on 2018/4/27 0027.
 * 简单的实现路由器
 */
public class SimplerRouter extends SimpleRouteLocator implements RefreshableRouteLocator {
    public final static Logger logger = LoggerFactory.getLogger(SimplerRouter.class);
    private ZuulProperties properties;
    private SimpleRuleManager simpleRuleManager;
    public SimplerRouter(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
        this.properties = properties;
        logger.info("servletPath:{}", servletPath);
    }
    @Override
    public void refresh() {
        super.doRefresh();
    }
    @Override
    protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {
        LinkedHashMap<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        //从application.properties中加载路由信息  禁用掉
        //routesMap.putAll(super.locateRoutes());
        //从db中加载路由信息
        routesMap.putAll(locateRoutesFromDB());
        //优化一下配置
        LinkedHashMap<String, ZuulProperties.ZuulRoute> values = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        for (Map.Entry<String, ZuulProperties.ZuulRoute> entry : routesMap.entrySet()) {
            String path = entry.getKey();
            // Prepend with slash if not already present.
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (StringUtils.hasText(this.properties.getPrefix())) {
                path = this.properties.getPrefix() + path;
                if (!path.startsWith("/")) {
                    path = "/" + path;
                }
            }
            values.put(path, entry.getValue());
        }
        return values;
    }
    /**
     * 模拟从数据库加载数据
     *
     * @return
     */
    private Map<String, ZuulProperties.ZuulRoute> locateRoutesFromDB() {
        Map<String, ZuulProperties.ZuulRoute> routes = new LinkedHashMap<String, ZuulProperties.ZuulRoute>();
        //现在是写死在代码中,这边可以改成用数据库获取数据
        List<RuleRoute> results = simpleRuleManager.getAllRules();
        for (RuleRoute result : results) {
            //判断配置是否正确
            if (StringUtils.isEmpty(result.getPath())) {
                logger.error(" id: " + result.getId() + " path 为空");
                continue;
            }
            if (StringUtils.isEmpty(result.getServiceId()) && StringUtils.isEmpty(result.getUrl())) {
                logger.error(" id: " + result.getId() + " serviceID,url 都为空");
                continue;
            }
            ZuulProperties.ZuulRoute zuulRoute = new ZuulProperties.ZuulRoute();
            try {
                BeanUtils.copyProperties(result, zuulRoute);
            } catch (Exception e) {
                logger.error("=============从数据库加载Zuul配置失败==============", e);
            }
            routes.put(zuulRoute.getPath(), zuulRoute);
        }
        return routes;
    }
    public SimpleRuleManager getSimpleRuleManager() {
        return simpleRuleManager;
    }
    public void setSimpleRuleManager(SimpleRuleManager simpleRuleManager) {
        this.simpleRuleManager = simpleRuleManager;
    }
}

+ 15 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/manager/AbstractRuleManager.java

@ -0,0 +1,15 @@
package com.yihu.base.router.rule.manager;
import com.yihu.base.router.model.RuleRoute;
import java.util.List;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class AbstractRuleManager implements  IRuleManager{
    @Override
    public List<RuleRoute> getAllRules() {
        return null;
    }
}

+ 12 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/manager/IRuleManager.java

@ -0,0 +1,12 @@
package com.yihu.base.router.rule.manager;
import com.yihu.base.router.model.RuleRoute;
import java.util.List;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public interface IRuleManager {
    List<RuleRoute> getAllRules();
}

+ 27 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/manager/SimpleRuleManager.java

@ -0,0 +1,27 @@
package com.yihu.base.router.rule.manager;
import com.yihu.base.router.model.RuleRoute;
import com.yihu.base.router.rule.storage.IRuleStorage;
import java.util.List;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class SimpleRuleManager extends AbstractRuleManager {
    private IRuleStorage ruleStorage;
    @Override
    public List<RuleRoute> getAllRules() {
        return ruleStorage.listRuleStorage();
    }
    public IRuleStorage getRuleStorage() {
        return ruleStorage;
    }
    public void setRuleStorage(IRuleStorage ruleStorage) {
        this.ruleStorage = ruleStorage;
    }
}

+ 45 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/storage/AbstractRuleStorage.java

@ -0,0 +1,45 @@
package com.yihu.base.router.rule.storage;
import com.yihu.base.router.model.RuleRoute;
import java.util.List;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class AbstractRuleStorage implements IRuleStorage {
    @Override
    public Boolean saveRuleStorage(RuleRoute ruleRoute) {
        return null;
    }
    @Override
    public Boolean deleteRuleStorage(RuleRoute ruleRoute) {
        return null;
    }
    @Override
    public Boolean deleteRuleStorageById(String id) {
        return null;
    }
    @Override
    public Boolean updateRuleStorage(RuleRoute ruleRoute) {
        return null;
    }
    @Override
    public RuleRoute getRuleStorageById(String id) {
        return null;
    }
    @Override
    public List<RuleRoute> listRuleStorage() {
        return null;
    }
    @Override
    public Integer countRuleStorage() {
        return null;
    }
}

+ 63 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/storage/IRuleStorage.java

@ -0,0 +1,63 @@
package com.yihu.base.router.rule.storage;
import com.yihu.base.router.model.RuleRoute;
import java.util.List;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public interface IRuleStorage {
    /**
     * 保存规则
     *
     * @param ruleRoute
     * @return
     */
    Boolean saveRuleStorage(RuleRoute ruleRoute);
    /**
     * 删除规则
     *
     * @param ruleRoute
     * @return
     */
    Boolean deleteRuleStorage(RuleRoute ruleRoute);
    /**
     * 删除规则
     *
     * @param id
     * @return
     */
    Boolean deleteRuleStorageById(String id);
    /**
     * 更新规则
     *
     * @param ruleRoute
     * @return
     */
    Boolean updateRuleStorage(RuleRoute ruleRoute);
    /**
     * 根据ID或者规则
     *
     * @param
     * @return
     */
    RuleRoute getRuleStorageById(String id);
    /**
     * 获取全部的规则
     *
     * @param
     * @return
     */
    List<RuleRoute> listRuleStorage();
    /**
     * 获取规则总数
     *
     * @param
     * @return
     */
    Integer countRuleStorage();
}

+ 7 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/storage/JDBCRuleStorage.java

@ -0,0 +1,7 @@
package com.yihu.base.router.rule.storage;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public class JDBCRuleStorage extends AbstractRuleStorage {
}

+ 113 - 0
common-router-starter/src/main/java/com/yihu/base/router/rule/storage/RedisRuleStorage.java

@ -0,0 +1,113 @@
package com.yihu.base.router.rule.storage;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.JSONToken;
import com.yihu.base.router.model.RuleRoute;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
/**
 * Created by chenweida on 2018/4/27 0027.
 * redis规则存储器
 */
public class RedisRuleStorage extends AbstractRuleStorage {
    private Logger logger = LoggerFactory.getLogger(RedisRuleStorage.class);
    private StringRedisTemplate redisTemplate;
    private static String redisPre = "router:rule:";
    @Override
    public Boolean saveRuleStorage(RuleRoute ruleRoute) {
        try {
            if (StringUtils.isEmpty(ruleRoute.getId())) {
                logger.error("RuleRoute id is null");
                return false;
            }
            String key = id(ruleRoute.getId());
            Object value = redisTemplate.opsForValue().get(key.toString());
            if (!StringUtils.isEmpty(value)) {
                logger.error("RuleRoute id is exists ");
                return false;
            }
            redisTemplate.opsForValue().set(key.toString(), JSON.toJSON(ruleRoute).toString());
            return true;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return false;
        }
    }
    @Override
    public Boolean deleteRuleStorageById(String id) {
        try {
            redisTemplate.delete(id(id));
            return true;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return false;
        }
    }
    @Override
    public Boolean updateRuleStorage(RuleRoute ruleRoute) {
        try {
            if (StringUtils.isEmpty(ruleRoute.getId())) {
                logger.error("RuleRoute id is null");
                return false;
            }
            String key = id(ruleRoute.getId());
            redisTemplate.opsForValue().set(key.toString(), JSON.toJSON(ruleRoute).toString());
            return true;
        } catch (Exception e) {
            logger.error(e.getMessage());
            return false;
        }
    }
    @Override
    public RuleRoute getRuleStorageById(String id) {
        String json = redisTemplate.opsForValue().get(id(id));
        return JSON.parseObject(json, RuleRoute.class);
    }
    @Override
    public List<RuleRoute> listRuleStorage() {
        Set<String> keys = redisTemplate.keys(redisPre + "*");
        List<String> values = redisTemplate.opsForValue().multiGet(keys);
        List<RuleRoute> ruleRoutes = new ArrayList<>();
        for (int i = 0; i < values.size(); i++) {
            ruleRoutes.add(JSON.parseObject(values.get(i), RuleRoute.class));
        }
        return ruleRoutes;
    }
    @Override
    public Integer countRuleStorage() {
        Set<String> keys = redisTemplate.keys(redisPre + "*");
        return keys.size();
    }
    public StringRedisTemplate getRedisTemplate() {
        return redisTemplate;
    }
    public void setRedisTemplate(StringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    private String id(String id) {
        return new StringBuffer(redisPre + id).toString();
    }
}

+ 76 - 0
common-router-starter/src/main/java/com/yihu/base/router/util/NetworkUtil.java

@ -0,0 +1,76 @@
package com.yihu.base.router.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
 * Created by chenweida on 2018/4/27 0027.
 */
public final class NetworkUtil {
    /**
     * Logger for this class
     */
    private static Logger logger = LoggerFactory.getLogger(NetworkUtil.class);
    /**
     * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
     *
     * @param request
     * @return
     * @throws IOException
     */
    public final static String getIpAddress(HttpServletRequest request)  {
        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
        String ip = request.getHeader("X-Forwarded-For");
        if (logger.isInfoEnabled()) {
            logger.info("getIpAddress(HttpServletRequest) - X-Forwarded-For - String ip=" + ip);
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("Proxy-Client-IP");
                if (logger.isInfoEnabled()) {
                    logger.info("getIpAddress(HttpServletRequest) - Proxy-Client-IP - String ip=" + ip);
                }
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("WL-Proxy-Client-IP");
                if (logger.isInfoEnabled()) {
                    logger.info("getIpAddress(HttpServletRequest) - WL-Proxy-Client-IP - String ip=" + ip);
                }
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_CLIENT_IP");
                if (logger.isInfoEnabled()) {
                    logger.info("getIpAddress(HttpServletRequest) - HTTP_CLIENT_IP - String ip=" + ip);
                }
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
                if (logger.isInfoEnabled()) {
                    logger.info("getIpAddress(HttpServletRequest) - HTTP_X_FORWARDED_FOR - String ip=" + ip);
                }
            }
            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
                ip = request.getRemoteAddr();
                if (logger.isInfoEnabled()) {
                    logger.info("getIpAddress(HttpServletRequest) - getRemoteAddr - String ip=" + ip);
                }
            }
        } else if (ip.length() > 15) {
            String[] ips = ip.split(",");
            for (int index = 0; index < ips.length; index++) {
                String strIp = (String) ips[index];
                if (!("unknown".equalsIgnoreCase(strIp))) {
                    ip = strIp;
                    break;
                }
            }
        }
        return ip;
    }
}

+ 2 - 0
common-router-starter/src/main/resources/META-INF/spring.factories

@ -0,0 +1,2 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.yihu.base.router.RouterAutoConfig

+ 3 - 0
common-router-starter/src/main/resources/template.yml

@ -0,0 +1,3 @@
router:
  storage:
    type: redis,jdbc  ## 规则存储器类型 redis 和jdbc  需要外部对应的redis和jdbc的工具支持  默认是redis

+ 1 - 1
common-security-starter/pom.xml

@ -11,7 +11,7 @@
    </parent>
    <artifactId>common-security-starter</artifactId>
    <version>1.0.0</version>
    <version>1.0.0 test</version>
    <dependencies>
        <dependency>

+ 2 - 1
common-security-starter/src/main/java/com.yihu.base.security/config/ResourceServerConfig.java

@ -56,7 +56,8 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                    .successHandler(authenticationSuccessHandler)
                    .failureHandler(authenticationFailureHandler)
                .and()
                    .apply(smsCodeAuthenticationSecurityConfig) //添加自定义短信登陆;
                    .apply(smsCodeAuthenticationSecurityConfig)
        //添加自定义短信登陆;
        ;

+ 7 - 2
demo/pom.xml

@ -12,14 +12,19 @@
    <artifactId>demo</artifactId>
    <dependencies>
        <!--<dependency>-->
            <!--<groupId>com.yihu</groupId>-->
            <!--<artifactId>common-security-starter</artifactId>-->
            <!--<version>1.0.0</version>-->
        <!--</dependency>-->
        <dependency>
            <groupId>com.yihu</groupId>
            <artifactId>common-security-starter</artifactId>
            <artifactId>common-swagger-starter</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.yihu</groupId>
            <artifactId>common-swagger-starter</artifactId>
            <artifactId>common-router-starter</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>

+ 1 - 0
demo/src/main/java/com/demo/config/SwaggerConfig.java

@ -38,6 +38,7 @@ public class SwaggerConfig {
                .apis(RequestHandlerSelectors.any()) // 对所有api进行监控
                .paths(or(
                        regex("/system/.*"),
                        regex("/route/.*"),
                        regex("/security/.*")
                ))
                .build()

+ 5 - 0
demo/src/main/java/com/demo/controller/DemoController.java

@ -34,4 +34,9 @@ public class DemoController {
        }
        return "成功";
    }
    @RequestMapping(value = "/helloworld", method = RequestMethod.GET)
    public String helloworld() {
        System.out.println("helloworld");
        return "成功";
    }
}

+ 130 - 130
demo/src/main/java/com/demo/controller/SecurityController.java

@ -1,130 +1,130 @@
package com.demo.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import net.sf.json.JSONObject;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
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.RestController;
import org.springframework.web.client.RestTemplate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
/**
 * Created by Administrator on 2018/4/3 0003.
 */
@RestController
@RequestMapping("/security")
@Api(tags = "登陆相关", description = "登陆相关demo")
public class SecurityController {
    private RestTemplate restTemplate = new RestTemplate();
    /**
     * @return
     */
    @RequestMapping(value = "/login_usernamePassword", method = RequestMethod.POST)
    @ApiOperation("自定义账号密码模式demo")
    public String loginfo() {
        String result = "";
        try {
            //设置header
            HttpHeaders headers = new HttpHeaders();
            headers.add("Accept", "*/*");
            headers.add("Cache-Control", "no-cache");
            //client_id:client_securt
            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
            //传参数JSON格式
            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
            //  也支持中文
            params.add("username", "admin");
            params.add("password", "123456");
            //设置http请求实体
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "登陆成功:" + result;
    }
    @RequestMapping(value = "/login_sendSms", method = RequestMethod.POST)
    @ApiOperation("发送验证码")
    public String login_sendSms(
            @RequestParam(value = "mobile", required = false)String mobile
    ) {
        String result = "";
        try {
            //设置header
            HttpHeaders headers = new HttpHeaders();
            headers.add("Accept", "*/*");
            headers.add("Cache-Control", "no-cache");
            //client_id:client_securt
            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
            //传参数JSON格式
            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
            //  也支持中文
            params.add("mobile", "admin");
            //设置http请求实体
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "登陆成功:" + result;
    }
    /**
     * @return
     */
    @RequestMapping(value = "/login_mobileCms", method = RequestMethod.POST)
    @ApiOperation("自定义手机号验证码模式")
    public String login_mobileCms() {
        String result = "";
        try {
            //设置header
            HttpHeaders headers = new HttpHeaders();
            headers.add("Accept", "*/*");
            headers.add("Cache-Control", "no-cache");
            //client_id:client_securt
            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
            //传参数JSON格式
            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
            //  也支持中文
            params.add("mobile", "admin");
            params.add("password", "123456");
            //设置http请求实体
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "登陆成功:" + result;
    }
}
//package com.demo.controller;
//
//import io.swagger.annotations.Api;
//import io.swagger.annotations.ApiOperation;
//import net.sf.json.JSONObject;
//import org.springframework.http.HttpEntity;
//import org.springframework.http.HttpHeaders;
//import org.springframework.http.MediaType;
//import org.springframework.util.LinkedMultiValueMap;
//import org.springframework.util.MultiValueMap;
//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.RestController;
//import org.springframework.web.client.RestTemplate;
//
//import java.text.SimpleDateFormat;
//import java.util.Date;
//import java.util.Random;
//import java.util.UUID;
//
///**
// * Created by Administrator on 2018/4/3 0003.
// */
//@RestController
//@RequestMapping("/security")
//@Api(tags = "登陆相关", description = "登陆相关demo")
//public class SecurityController {
//
//    private RestTemplate restTemplate = new RestTemplate();
//
//    /**
//     * @return
//     */
//    @RequestMapping(value = "/login_usernamePassword", method = RequestMethod.POST)
//    @ApiOperation("自定义账号密码模式demo")
//    public String loginfo() {
//        String result = "";
//        try {
//            //设置header
//            HttpHeaders headers = new HttpHeaders();
//            headers.add("Accept", "*/*");
//            headers.add("Cache-Control", "no-cache");
//            //client_id:client_securt
//            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
//            //传参数JSON格式
//            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
//            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
//            //  也支持中文
//            params.add("username", "admin");
//            params.add("password", "123456");
//            //设置http请求实体
//            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
//
//
//            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
//
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return "登陆成功:" + result;
//    }
//
//    @RequestMapping(value = "/login_sendSms", method = RequestMethod.POST)
//    @ApiOperation("发送验证码")
//    public String login_sendSms(
//            @RequestParam(value = "mobile", required = false)String mobile
//    ) {
//        String result = "";
//        try {
//            //设置header
//            HttpHeaders headers = new HttpHeaders();
//            headers.add("Accept", "*/*");
//            headers.add("Cache-Control", "no-cache");
//            //client_id:client_securt
//            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
//            //传参数JSON格式
//            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
//            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
//            //  也支持中文
//            params.add("mobile", "admin");
//            //设置http请求实体
//            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
//
//
//            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
//
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return "登陆成功:" + result;
//    }
//    /**
//     * @return
//     */
//    @RequestMapping(value = "/login_mobileCms", method = RequestMethod.POST)
//    @ApiOperation("自定义手机号验证码模式")
//    public String login_mobileCms() {
//        String result = "";
//        try {
//            //设置header
//            HttpHeaders headers = new HttpHeaders();
//            headers.add("Accept", "*/*");
//            headers.add("Cache-Control", "no-cache");
//            //client_id:client_securt
//            headers.add("Authorization","Basic Y2xpZW50X2lkOmNsaWVudF9zZWNyZXQ==");
//            //传参数JSON格式
//            //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
//            MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
//            //  也支持中文
//            params.add("mobile", "admin");
//            params.add("password", "123456");
//            //设置http请求实体
//            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
//
//
//            result = restTemplate.postForObject("http://localhost:8080/authentication/form", requestEntity, String.class);
//
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//        return "登陆成功:" + result;
//    }
//}

+ 18 - 18
demo/src/main/java/com/demo/service/RBASService.java

@ -1,18 +1,18 @@
package com.demo.service;
import com.yihu.base.security.rbas.RbasServiceProvider;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
/**
 * Created by Administrator on 2018/4/3 0003.
 */
@Component("rbasServiceProvider")
public class RBASService implements RbasServiceProvider {
    @Override
    public Boolean hasPerssion(HttpServletRequest request, Authentication authentication) {
        return true;
    }
}
//package com.demo.service;
//
//import com.yihu.base.security.rbas.RbasServiceProvider;
//import org.springframework.security.core.Authentication;
//import org.springframework.stereotype.Component;
//
//import javax.servlet.http.HttpServletRequest;
//
///**
// * Created by Administrator on 2018/4/3 0003.
// */
//@Component("rbasServiceProvider")
//public class RBASService implements RbasServiceProvider {
//    @Override
//    public Boolean hasPerssion(HttpServletRequest request, Authentication authentication) {
//        return true;
//    }
//}

+ 44 - 44
demo/src/main/java/com/demo/service/UserService.java

@ -1,44 +1,44 @@
package com.demo.service;
import com.yihu.base.security.rbas.ClientServiceProvider;
import com.yihu.base.security.rbas.UserServiceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientRegistrationException;
import org.springframework.security.oauth2.provider.client.BaseClientDetails;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
/**
 * Created by Administrator on 2018/4/3 0003.
 */
@Component
public class UserService implements ClientServiceProvider, UserServiceProvider {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        BaseClientDetails baseClientDetails = new BaseClientDetails();
        baseClientDetails.setClientId("client_id");
        baseClientDetails.setClientSecret("client_secret");
        return baseClientDetails;
    }
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return new User("admin",
                    passwordEncoder.encode("123456"),
                    true,
                    true,
                    true,
                    true
                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER")); //权限
    }
}
//package com.demo.service;
//
//import com.yihu.base.security.rbas.ClientServiceProvider;
//import com.yihu.base.security.rbas.UserServiceProvider;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.security.core.authority.AuthorityUtils;
//import org.springframework.security.core.userdetails.User;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.security.core.userdetails.UsernameNotFoundException;
//import org.springframework.security.crypto.password.PasswordEncoder;
//import org.springframework.security.oauth2.provider.ClientDetails;
//import org.springframework.security.oauth2.provider.ClientRegistrationException;
//import org.springframework.security.oauth2.provider.client.BaseClientDetails;
//import org.springframework.stereotype.Component;
//
//import java.util.ArrayList;
//
///**
// * Created by Administrator on 2018/4/3 0003.
// */
//@Component
//public class UserService implements ClientServiceProvider, UserServiceProvider {
//    @Autowired
//    private PasswordEncoder passwordEncoder;
//
//    @Override
//    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
//        BaseClientDetails baseClientDetails = new BaseClientDetails();
//        baseClientDetails.setClientId("client_id");
//        baseClientDetails.setClientSecret("client_secret");
//        return baseClientDetails;
//    }
//
//    @Override
//    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//        return new User("admin",
//                    passwordEncoder.encode("123456"),
//                    true,
//                    true,
//                    true,
//                    true
//                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER")); //权限
//    }
//}

+ 1 - 1
demo/src/main/resources/application.yml

@ -27,7 +27,7 @@ spring:
  redis:
    host: 172.19.103.88 # Redis server host.
    port: 6379 # Redis server port.
    database: 0
    database: 10
  aop:
    proxy-target-class: true

+ 1 - 0
pom.xml

@ -50,6 +50,7 @@
        <module>/common-data-redis-starter</module>
        <module>/common-data-hbase-starter</module>
        <module>demo</module>
        <module>/common-router-starter</module>
    </modules>
    <properties>