Spring Boot脚手架Mybatis Spring Security JWT权限Spring Cache + Redis
项目可以打成jar部署,也可以打成war部署,默认使用jar
<groupId>com.goblin</groupId>
<artifactId>goblin-restful-client</artifactId>
<!--<packaging>war</packaging>-->
<packaging>jar</packaging>
也可以用Docker部署,要求
docker pull java
maven打包命令 : mvn clean package docker:build
项目所用技术
项目包含了
要求 :
Spring Security在这里仅仅只是用来认证(登录认证).
细粒度的权限是自行实现,resources/manage_system.pdm可以自行查看 manage_permission_resource, manage_role, manage_role_permission_resource, manage_user, manage_user_role
代码中 AdminPermissionInterceptor 进行拦截控制,具体看代码实现,都有注释.
这里没有后台页面,权限的管理需要自行设计页面处理,或者自己插入脚本.
不使用session
com.goblin.ContextUtils
用户相关数据从 ContextUtils 中获取
org.springframework.http.ResponseEntity
使用ResponseEntity对数据进行封装
goblin-generator
|---src
| |---test
|---com
|---goblin
|---generator
|---...
比如 : String resourceType(API:接口,MENU:菜单,BUTTON:按钮)
这样的字段在实体中使用枚举类型
相应的枚举,注释必须完整
注:
/**
* 资源类型(API:接口,MENU:菜单,BUTTON:按钮)
* <p>
* 对应字段 {@link com.goblin.domain.PermissionResource#resourceType}
*/
@Getter
public enum ResourceType implements IEnum {
API( "API" , "接口" ),
MENU( "MENU" , "菜单" ),
BUTTON( "BUTTON" , "按钮" );
/** 数据库存储值 **/
private String value;
/** 相应注释 **/
private String comment;
ResourceType ( String value , String comment ) {
this.value = value;
this.comment = comment;
}
/**
* {@link JsonValue} 指定序列化为该字段,也就是显示时以该字段显示
*/
@JsonValue
public String getComment () {
return comment;
}
}
public class PermissionResource {
private Long id;
private ResourceType resourceType;
// ... ...
}
mybatis-plus:
type-enums-package: com.goblin.manage.bean.domain.enums
示例 :
// controller
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) );
}
// service
public PageInfo listPage ( PageRowBounds pageRowBounds ) {
PageHelper.startPage( pageRowBounds.getOffset(), pageRowBounds.getLimit() );
return new PageInfo( super.selectList( null ) );
}
示例 :
// 排除指定字段
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) ,"-password,-realName" );
}
// 只返回指定字段
@GetMapping
public ResponseEntity< PageInfo > listPage ( PageRowBounds pageRowBounds ) {
return ResponseEntityPro.ok(userService.listPage( pageRowBounds ) ,"password,realName" );
}
# 见 resource_api_uri_show_fields 字段
SELECT * FROM manage_role_permission_resource;
接口对内使用Exception处理 AssertUtils
AssertUtils.isTrue( condition , "操作失败." );
接口对外使用if else流程控制
引入依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>版本 https://github.com/ulisesbocchio/jasypt-spring-boot 获取最新的</version>
</dependency>
设置用于加密/解密属性的主密码
jasypt:
encryptor:
password: goblin
加密
@RunWith( SpringRunner.class )
@SpringBootTest
public class JasyptStringEncryptorTest {
@Autowired
private StringEncryptor stringEncryptor;
@Test
public void name () throws Exception {
final String username = stringEncryptor.encrypt( "root" );
final String password = stringEncryptor.encrypt( "root" );
System.err.println( "username = " + username );
System.err.println( "password = " + password );
}
}
使用
spring:
datasource:
username: ENC(jEmjzNoC9rTYorAj5mI84A==)
password: ENC(jEmjzNoC9rTYorAj5mI84A==)
执行 resources/init-mysql.sql(库名goblin,创建数据库时,记得设置编码为:UTF-8)
默认使用 127.0.0.1:6379
以下都可单独运行
用于监控服务,http://localhost:8888
DemoController
注入攻击,api返回指定/排除字段示例
DistributedDemoController
分布式锁以及异步处理的demo
简单调度