易水公共组件是基于springboot的高度封装的通用型组件,在对spring security和spring security oauth2高度可定制化的功能封装外,还支持第三方登录和sso单点登录功能,使用户能够快速开启QQ登录和微信登录能力,搭建属于自己的认证/授权中心。 此外,工具还提供各种常见的图形验证码、短信验证码和邮件验证码功能,并支持跨域设置和全局异常捕获功能,实现自定义异常信息提示。 另外,组件还包含swagger接口文档功能,支持一键导出离线接口使用文档。 最后,组件提供了大量丰富的配置属性,支持通过属性配置完成各项功能设置,真正实现零侵入、防止暴力破解的无缝接入功能。 在保证功能灵活可用的基础上,易水公共组件还针对国人的使用习惯进行了一些本地化配置,提供了详细完整的中文使用说明文档。总的来说,易水公共组件在保证单机应用的高效性能同时,还能支持分布式署环境,能自动识别单体应用还是集群应用,是目前主流的微服务开发过程中不可或缺的重要伙伴。 本次更新主要更新点如下:
一 快速启动在项目中加入以下依赖
<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;
也可以使用静态工具类
下面是数据库操作工具
/**
* 根据主键从指定表查询一条数据
*
* @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 在项目中加入以下启动代码
下面的代码用户应该保证能被
@Configuration
@EnableWebSecurity
public class SecurityConfig extends AbstractSecurityConfig {
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
}
}
该代码的示例代码可参见
实现 【特别注意】
在用户未按照本步骤配置自己的授权逻辑时,组件会默认进行一个缺省实现。在缺省实现的情况下,用户能使用任意用户名配合密码(12345678)进行登录。 加入上述配置之后,只有组件中内置的默认路径能通过授权,访问其他的url都被重定向到 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();
}
在以上代码后,用户即可通过 2.4 swagger-ui快速启动 在配置文件中加入以下配置即可快速开启swagger-ui功能。
yishuifengxiao.swagger.base-package= 需要扫描的控制器代码的路径
加入上述配置后即可通过
【特别鸣谢】 此项功能中的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的方法里携带上
@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();
}
易水工具组件主要是根据 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 加上 完全开启示例代码如下:
@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 实现
完成自定义实现后,按照名字 【特别注意】在用户未按照(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 在项目的任意一个
3 将 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
在完成上述配置 ,访问
注意: 访问的的 url 中的 微信登录 配置微信登录只需要在上述基础上进行一下配置即可
# 微信登录的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
在完成上述配置 ,访问 (责任编辑:IT) |