> Linux新闻 >

易水组件 5.3.0 发布,优化大量代码,新增日志开关功能

易水公共组件是基于springboot的高度封装的通用型组件,在对spring security和spring security oauth2高度可定制化的功能封装外,还支持第三方登录和sso单点登录功能,使用户能够快速开启QQ登录和微信登录能力,搭建属于自己的认证/授权中心。

此外,工具还提供各种常见的图形验证码、短信验证码和邮件验证码功能,并支持跨域设置和全局异常捕获功能,实现自定义异常信息提示。

另外,组件还包含swagger接口文档功能,支持一键导出离线接口使用文档。

最后,组件提供了大量丰富的配置属性,支持通过属性配置完成各项功能设置,真正实现零侵入、防止暴力破解的无缝接入功能。

在保证功能灵活可用的基础上,易水公共组件还针对国人的使用习惯进行了一些本地化配置,提供了详细完整的中文使用说明文档。总的来说,易水公共组件在保证单机应用的高效性能同时,还能支持分布式署环境,能自动识别单体应用还是集群应用,是目前主流的微服务开发过程中不可或缺的重要伙伴。

本次更新主要更新点如下:

  • 优化加载及业务日志功能,新增日志开关功能

  • 新增动态sql构建功能,动态sql构建随心所欲

  • 新增swagger-ui安全验证功能,线上部署更温馨

  • 新增缓存存储方式,增加快捷注解功能

  • 优化验证码处理逻辑,新增多个api,验证码处理更舒心

  • 优化异常信息提取工具,新增静态方法结果,使用更便捷

  • 优化oauth2扩展支持功能,统一异常信息返回格式

  • 优化oauth token生成方式,实现自动续签功能,扩展token携带信息

  • 优化spring security增强扩展,重构安全处理逻辑

  • 优化spring security令牌生成功能,新增令牌生成功能

  • 优化自定义过滤器定义,方便注入自定义安全处理逻辑

  • 优化登陆校验逻辑,统一全局异常信息返回格式

一 快速启动

在项目中加入以下依赖

<dependency>
    <groupId>com.yishuifengxiao.common</groupId>
    <artifactId>common-spring-boot-starter</artifactId>
    <version>5.3.0</version>
</dependency>

易水组件已经发布到maven中央仓库,最新版本的依赖可参见 https://mvnrepository.com/artifact/com.yishuifengxiao.common/common-spring-boot-starter。

在项目中引入上述依赖之后,就可以直接使用易水组件的相关功能了。

二 组件简要功能介绍

本组件的主要功能如下

2.1 数据库操作

例如操作数据库时再也不需要编写简单的CURD的操作代码,只需要在项目中加入以下代码即可操作数据库了:

 

    @Autowired
    private JdbcHelper jdbcHelper;

也可以使用静态工具类JdbcUtil对数据进行操作。

下面是数据库操作工具JdbcHelper的一些典型接口

        /**
     * 根据主键从指定表查询一条数据
     * 
     * @param <T>        POJO类
     * @param clazz      POJO类
     * @param primaryKey 主键
     * @return 查询到的数据
     */
    <T> T findByPrimaryKey(Class<T> clazz, Object primaryKey);
        /**
     * 查询所有符合条件的数据
     * 
     * @param <T> POJO类
     * @param t   查询条件
     * @return 符合条件的数据
     */
    <T> T findOne(T t);
​
    /**
     * 查询所有符合条件的数据
     * 
     * @param <T>   POJO类
     * @param t     查询条件
     * @param order 排序条件
     * @return 符合条件的数据
     */
    <T> List<T> findAll(T t, Order order);
​
    /**
     * 根据主键全属性更新方式更新一条数据
     * 
     * @param <T> POJO类
     * @param t   待更新的数据
     * @return 受影响的记录的数量
     */
    <T> int updateByPrimaryKey(T t);
​
    /**
     * 根据主键可选属性更新方式更新一条数据
     * 
     * @param <T> POJO类
     * @param t   待更新的数据
     * @return 受影响的记录的数量
     */
    <T> int updateByPrimaryKeySelective(T t);
        /**
     * 根据主键删除一条数据
     * 
     * @param <T>        POJO类
     * @param clazz      操作的对象
     * @param primaryKey 主键值
     * @return 受影响的记录的数量
     */
    <T> int deleteByPrimaryKey(Class<T> clazz, Object primaryKey);
        /**
     * 以全属性方式新增一条数据
     * 
     * @param <T> POJO类
     * @param t   待新增的数据
     * @return 受影响的记录的数量
     */
    <T> int insert(T t);
​
    /**
     * 以可选属性方式新增一条数据
     * 
     * @param <T> POJO类
     * @param t   待新增的数据
     * @return 受影响的记录的数量
     */
    <T> int insertSelective(T t);

 

2.2 spring security使用

在使用组件的安全管理功能时,需要依赖于spring security的功能。

1 在项目中加入 spring security依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2 在项目中加入以下启动代码

下面的代码用户应该保证能被 @ComponentScan扫描到。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends AbstractSecurityConfig {
    
    @Override
    protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    }
​
}

该代码的示例代码可参见 com.yishuifengxiao.common.security.SecurityConfig

实现 UserDetailsService 接口,完成自己的授权逻辑,然后按照名字 userDetailsService将其注入到spring 之中。

【特别注意】

在用户未按照本步骤配置自己的授权逻辑时,组件会默认进行一个缺省实现。在缺省实现的情况下,用户能使用任意用户名配合密码(12345678)进行登录。 加入上述配置之后,只有组件中内置的默认路径能通过授权,访问其他的url都被重定向到 /index这个地址,具体的配置及原因请参照后续说明。 注入的UserDetailsService实例的名字必须为userDetailsService,否则组件会使用默认的缺省实现。 进行上述配置后,组件的安全管理功能是开启的。

2.3 验证码使用

将验证码工具注入到需要使用到验证码的地方

注入代码如下:

  @Autowired
  private CodeProcessor codeProcessor;

在注入一个验证码工具后,通过以下代码即可快速生成一个图形验证码。 具体的示例代码如下:

@GetMapping("/code/image")
@ResponseBody
public Response<String> image(HttpServletRequest request, HttpServletResponse response){
​
  try {
  codeProcessor.create(new ServletWebRequest(request, response),CodeType.IMAGE);
   } catch (ValidateException e) {
       return Response.error(e.getMessage());
   }
 return Response.suc();
    
    }

在以上代码后,用户即可通过 http://ip:port/code/image?image=唯一的随机值 获取图形验证码了。

2.4 swagger-ui

快速启动 在配置文件中加入以下配置即可快速开启swagger-ui功能。

yishuifengxiao.swagger.base-package= 需要扫描的控制器代码的路径
​

加入上述配置后即可通过http://ip:port/doc.html查看swagger-ui增强文档。

输入图片说明

【特别鸣谢】

此项功能中的doc.html界面中功能使用到了刀哥的 swagger-bootstrap-ui 1.9.x 版本中的功能 ,在此特别感谢 刀哥 的大力支持,关于swagger-bootstrap-ui的详细说明请参见刀哥的 swagger-bootstrap-ui文档,如需要更多强悍的swagger功能,使用刀哥的2.0.x以及以上的原生版本。

2.5 全局异常处理

在默认情况下,全局异常处理功能已经开启,如果要关闭此功能,可以通过以下配置进行

yishuifengxiao.error.enable=false

再开启此功能的情况下,可以根据不同的异常配置不同的提示信息,配置格式下

yishuifengxiao.error.map.异常类=提示信息

示例如下

yishuifengxiao.error.map.ConstraintViolationException=已有重复数据

在上述配置中ConstraintViolationException是异常类的名字,例如ConstraintViolationException、DataIntegrityViolationException和DuplicateKeyException,对于多个需要提示的错误,配置成多行即可,例如

yishuifengxiao.error.map.ConstraintViolationException=全局异常捕获到异常信息了
yishuifengxiao.error.map.DataIntegrityViolationException=全局异常捕获到异常信息了
yishuifengxiao.error.map.DuplicateKeyException=全局异常捕获到异常信息了

 

2.6 全局参数校验

全局参数校验主要是解决对于开启了参数校验的情况下需要每次手动判断是否存在异常信息导致产生重复代码的问题而创建了一个AOP切面,同意进行参数校验的结果判断的问题。

在默认情况下,全局参数校验结果判断功能是开启的,如果需要关闭此功能,可以通过以下配置进行

yishuifengxiao.aop.enable=false

在开启全局参数校验结果判断功能的前提下,要想此功能生效,还需要在Controller的方法里携带上BindingResult参数。一个简单的例子如下:

@AuthUser(required = true)
@ApiOperation(value = "更新用户信息", notes = "根据id更新用户基本信息")
@PostMapping("/updateUser")
@ResponseBody
public Response<Object> updateUser(HttpServletRequest request, HttpServletResponse response, 
@Validated @RequestBody AduitDto aduitDto, BindingResult errors) throws CustomException {

    aduitService.updateUser(aduitDto);
    return Response.suc();
}

易水工具组件主要是根据@ResponseBodyBindingResult设置切面的,要想此功能生效,这两个注解不能忘记。

2.7 oauth2功能

使用 oauth2 功能首先需要按照 安全管理 的步骤开启 spring security 的相关功能。

快速启动

1 在项目中加入 oauth 相关的依赖

<dependency>
    <groupId>org.springframework.security.oauth.boot</groupId>
    <artifactId>spring-security-oauth2-autoconfigure</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.yishuifengxiao.common</groupId>
    <artifactId>common-spring-boot-starter</artifactId>
    <version>4.2.1</version>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2 在项目加入以下代码

@Configuration
public class CustomOauth2Config extends Oauth2Config{

}

3 加上@EnableResourceServer和 @EnableAuthorizationServer注解

完全开启示例代码如下:

@Configuration
@EnableWebSecurity
@EnableResourceServer
@EnableAuthorizationServer
public class SecurityConfig extends AbstractSecurityConfig {

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		super.configure(http);
	}

	@Configuration
	public class CustomOauth2Config extends Oauth2Config{

	}

}

4 实现ClientDetailsService接口,完成自己的认证逻辑

完成自定义实现后,按照名字customClientDetailsService向spring中注入一个ClientDetailsService实例

【特别注意】在用户未按照(4)中的步骤配置自己的授权逻辑时,组件会默认进行一个缺省实现。在缺省实现的情况下,用户能使用任意用户名配合密码(12345678)进行登录

2.8 异步消息总线

使用该异步消息总线的示例如下:

@Component
public class DemoEventBus {
 @Resource
 private EventBus asyncEventBus;
 
 @PostConstruct
 public void init() {
 	asyncEventBus.register(this);
 }
}

发送消息

asyncEventBus.post("需要发送的数据");

接收消息

@Subscribe
 public void recieve(Object data) {
 	// 注意guava是根据入参的数据类型进行接收的
 	// 发送的数据可以被多个接收者同时接收
 } 

2.9 第三方登陆

1 在项目的 pom 里增加 spring social 相关的依赖

<dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-core</artifactId>
    <version>${spring-social.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-config</artifactId>
    <version>${spring-social.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-security</artifactId>
    <version>${spring-social.version}</version>
</dependency>

<dependency>
    <groupId>org.springframework.social</groupId>
    <artifactId>spring-social-web</artifactId>
    <version>${spring-social.version}</version>
</dependency>

2 在项目的任意一个 @Configuration下增加 @EnableSocial 注解

3 将SpringSocialConfigurer的实例对象注入到 spring security 之中。

4 在属性配置文件增加相关的配置

一个完整的配置文件的示例如下:

@Configuration
@EnableWebSecurity
@EnableSocial
public class SecurityConfig extends AbstractSecurityConfig {

@Autowired
private  SpringSocialConfigurer socialSecurityConfig;

@Override
protected void configure(HttpSecurity http) throws Exception {
	// 调用父类中的默认配置
    super.configure(http);

    http.apply(socialSecurityConfig);
    }

}

QQ 登录

开启 QQ 登录首先需要在 QQ 互联 申请账号和密码

接下来,在项目的配置文件里增加以下配置

# spring social拦截器拦截的标志,默认为 /auth
yishuifengxiao.security.social.filter-processes-url=/callback
# QQ登录的appId
yishuifengxiao.security.social.qq.app-id=QQ互联上申请的appId
# QQ登录的appSecret
yishuifengxiao.security.social.qq.app-secret=QQ互联上申请的appId对应的appSecret
# QQ登录的成功后的跳转路径
yishuifengxiao.security.social.qq.register-url=/registerUrl
# QQ登录的服务提供商标志,默认为qq
yishuifengxiao.security.social.qq.provider-id=qq

在完成上述配置 ,访问 http://ip:port/callback/qq即可进行 QQ 登录流程了

注意: 访问的的 url 中的/callback/qq 由 yishuifengxiao.social.filter-processes-url 和yishuifengxiao.social.qq.provider-id 两部分共同组成。

微信登录

配置微信登录只需要在上述基础上进行一下配置即可

# 微信登录的appId
yishuifengxiao.security.social.weixin.app-id=微信开发平台上申请的appId
# 微信登录的appSecret
yishuifengxiao.security.social.weixin.app-secret=微信开发平台申请的appId对应的appSecret
# 微信登录的成功后的跳转路径
yishuifengxiao.security.social.weixin.register-url=/registerUrl
# 微信登录的服务提供商标志,默认为weixin
yishuifengxiao.security.social.weixin.provider-id=weixin

在完成上述配置 ,访问http://ip:port/callback/weixin即可进行微信登录流程了



(责任编辑:IT)