《Spring Boot 实战派》--14.开发企业级通用的后台系统
第14章 开发企业级通用的后台系统
使用Spring Boot,免不了开发后台系统。所以,本章通过实现一个基于角色的访问控制后台 系统,来系统地介绍如何使用Spring Security。
本实例的源代码可以在“/14/ManagementSystemDemo”目录下找到。
14.1用JPA实现实体间的映射关系
RBAC ( Role Based Access Control)是基于角色的访问控制,一般分为用户(user)、角 色(role)、权限(permission ) 3个实体。它们的关系如下:
- 角色(role)和权限(permission )是多对多关系。
- 用户(user)和角色(role)也是多对多的关系。
- 用户(user)和权限(permission )之间没有直接的关系。用户需要通过角色作为代理(中 间人)来获取到拥有的权限。
5 张表就能实现角色、用户、权限的映射关系,其中包含3个实体表和2个关系表(角色一权 限关系表、用户一角色关系表)。
14.1.1创建用户实体
用户实体类通过实现UserDetaiis接口实现认证及授权,见以下代码:
package com.example.demo.entity.sysuser; ©Entity public class SysUser implements UserDetails (
//主键及自动增长 @ld @GeneratedValue private long id;
@Column(nullable = false, unique = true) private String name; private String password; private String cnname; private Boolean enabled = Boolean.TRUE; /** * 多对多映用户角色 */ @ManyToMany(cascade = (CascadeType.REFRESH), fetch = FetchType.EAGER)
private List<SysRole> roles; public long getld() { return id; }
/**
* 根据自定义逻辑来返回用户权限。如果用户权限返回空,或者和拦截路径对应权限不同,则验证不通过 */ @Override public Collection<? extends GrantedAuthority> getAuthorities() { List<GrantedAuthority> authorities = new ArrayList<>(); List<SysRole> roles = this.getRoles(); for (SysRole role : roles) {
authorities.add(new SimpleGrantedAuthority(role.getRole())); } return authorities; } }
14.1.2创建角色实体
角色是用户和权限的中间代理表。用户(user)和权限(permission )之间没有直接的关系, 用户(user)需要通过角色作为代理(中间人)来获取拥有的权限,见以下代码:
@Data
@Entity
public class SysRole {
@ld
@GeneratedValue
/**
* 编号
*/
private Integer id;
private String cnname;
/**
* 角色标识,如“管理员”
*/
private String role;
/**
* 角色描述,用于在Ul界面显示角色信息
*/
private String description;
/**
* 是否可用。如果不可用,则不会添加给用户
*/
private Boolean available = Boolean.FALSE;
/**
* 角色一权限关系:多对多关系
*/
@ManyToMany(fetch = FetchType. EAGER)
@JoinTable(name = "SysRolePermission", joinColumns = (@JoinColumn(name ="roleld")), inverseJoinColumns = {@JoinColumn(name = "permissionld")))
private List<SysPermission> permissions;
/**
* 用户一角色关系:多对多关系
*/
@ManyToMany
@JoinTable(name = "SysUserRole", joinColumns = (@JoinColumn(name = "roleld")), inverseJoinColumns = (@JoinColumn(name = "uid")))
/**
* —个角色对应多个用户
*/
private List<SysUser> userinfos;
)
14.1.3创建权限实体
权限和角色存在多对多关系。一般情况下,权限不会和用户直接关联,它用于存放权限信息, 比如权限的名称、HTTP方法、URL路径。具体见以下代码:
@Data
©Entity
public class SysPermission implements Serializable {
@ld
@GeneratedValue
/**
* 主键
*/
private Integer id;
/**
* 名称
*/
private String name;
@Column(columnDefinition = "enumCmenu','button')")
/**
* 资源类型,[menu|button]
*/
private String resourceType;
/**
* 资源路径
*/
private String url;
/**
* 权限字符串。menu
* 例子:role:*; button 例子:role:create,role:update,role:delete,role:view
*/
private String permission;
/**
*父编号
*/
private Long parentld;
/**
* 父编号列表
*/
private String parentlds;
private Boolean available = Boolean.FALSE;
©Transient
private List permissions;
@ManyToMany
@JoinTable(name = "SysRolePermission", joinColumns = {@JoinColumn(name = "permissionld")), inverseJoinColumns = {@JoinColumn(name = "roleld")))
private List<SysRole> roles;
public List getPermissionsO (
return Arrays.asList(this.permission.trimO.split('T'));
}
public void setPermissions(List permissions) {
this.permissions = permissions;
}
}
14.2用Spring Security实现动态授权(RBAC)功能
14.2.1实现管理(增加、删除、修改和查询)管理员角色功能
1、实现控制器
控制器主要指定URL映射和视图,见以下代码:
©Controller
@RequestMapping("admin")
public class SysRoleControlller {
@Autowired
private SysRoleRepository sysRoleRepository;
@RequestMapping("/role/add")
public String addRole() {
return "admin/role/add";
}
@RequestMapping("/role")
public String addRole(SysRole model) {
String role = "ROLE_" + model.getRole();
model.setRole(role);
sysRoleRepository.save(model);
return "redirect:/admin/";
}
)
2、视图页面
这里注意,要提交CSRF的token (根据需求可以不幵启CSFR), token的值需要在HTML 中的head标签中添加。见下面代码<!— CSRF —>注释标签之间的部分,以及在表单(form ) 中的隐臓提交CSRF的token值。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
xmlns:sec ="http://www.thymeleaf.org/thymeleaf - ext「as-sp「ingsecu「ity4">
<head>
<meta charset="UTF-87>
<!— CSRF —>
<meta name="_csrf" th:content="${_csrf.token}7>
<!— default header name is X-CSRF-TOKEN 一>
<meta name="_csrf_header" th:content="${_csrf.headerNaiYie}'7>
<!— CSRF —>
</head>
<body>
<form class="form-horizontal" th:action="@(/admin/role}" method="post">
<div class="form-group">
<label for="name" class-'col-sm-2 control-label"> 角色名〈/label〉
<div class-'col-sm-10">
<input type="text" class="form-contror' name="cnname" id="cnname" placeholder"角色名"/>
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">角色标识</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="role" id="role" placeholder="输入角色标识"/>
</div>
</div>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
<div class="foriri-group',>
<div class二"col-sm-offset-2 col-sm-10">
〈input type="submit" value=”提交"class="btn btn-info" />
</div></div>
</form>
</body>
</html>
14.2.2实现管理权限功能
1.实现权限控制器
权限管理主要是对权限迸行增加、删除' 修改和查询操作。权限要和角色对应起来。在进行操 作时需要附带角色字段,见以下代码:
©Controller
@RequestMapping(7admin/permission")
public class SysPermissionControler {
@Autowired
private SysPermissionRepository sysPermissionRepository;
@Autowired
private SysRoleRepository sysRoleRepository;
@RequestMapping("/add")
public String addPermission(Model model) {
List<SysRole> sysRole = sysRoleRepository.findAII();
model.addAttribute("sysRole", sysRole);
return "admin/permission/add";
}
@PostMapping("/add")
public String addPermission(SysPermission sysPermission, String role) (
List<SysRole> roles = new ArrayList<>();
SysRole rolel = sysRoleRepository.findByRole(role);
roles.add(rolel);
sysPermission.setRoles(roles);
sysPermissionRepository.save(sysPermission);
return "redirect:/admin/";
}
}
2.实现视图模板
在以下代码中,视图中的$(sysRole)是根据控制器返回的参数;“th:each”标签是Thymeleaf 的标签,用于遍历数据。
<form class="form-horizontal" th:action="@(/admin/permission/add}" method="post">
<div class="form-group">
<label for="name" class="col-sm-2 control-label"> 权限名称 </label>
<div class="col-sm-10">
<input type="text" class="form-control" name="name" id="name" placeholder="name"/>
</div>
</div>
<div class="form-group">
<label for="resource_type" name="resource_type" class="col-sm-2 cont「oHabel">权K艮类型
</label>
<div class="col-sm-10">
<select class二"fo「m—control" name='TesourceType">
<option value="menu"/〉
菜单 </option>
<option value="button'7>
按钮 </option>
</select>
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">URL</label>
<div class="col-sm-10">
<input type="text" class="form-control" name="url" id="url" placeholder=Hurl"/>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">角色</label>
<div class="col-sm-10">
<select class="form-control" name='Tole">
<option th:each="sysRole : $(sysRole)" th:text="$(sysRole.cnname)" th:value=,'${sysRole.role}7>
</option>
</select>
</div>
</div>
</div>
</div>
<input type="hidden" th:name=n${_csrf.parameterName}" th:value="${_csrf.token}">
<div class="form-group">
<div class="col-sm--offset-2 col-sm-10">
〈input type二"submit" value="提交"class="btn btn-info'7>
<input type=”「eset" value="重置”class="btn btn-info'7>
</div>
</div>
</form>
14.2.3实现管理管理员功能
管理员密码是需要加密的,这里采用“BCrypt”方式加密。如果读者用自己喜欢的加密方式, 则需要新建加密工具类,同时要在安全配置类重写加密配置方式。
1.实现控制器
主要注意密码加密■'BCryptPasswordEncoder"和角色遍历部分,见以下代码:
@Autowired private SysUserRepository adminUserRepository;
@Autowired private SysRoleRepository sysRoleRepository;
//@PreAuthorize("hasRole('ROLE_admin')") @RequestMapping(7user/add") public String toAddUser(Model model) ( List<SysRole> adminrole = sysRoleRepository.findAII(); model.addAttribute("adminrole", adminrole); return "admin/user/add"; }
//@RequestMapping('7user/add") @PostMapping(*7user") public String addUser(String name, String password, String role) { BCryptPasswordEncoder encoder = new BCryptPasswordEncoderO; String encodePassword 二 encoder.encode(password); SysUser user = new SysUser(name, encodePassword); List<SysRole> roles = new ArrayList<>(); SysRole rolel = sysRoleRepository.findByRole(role); roles.add(rolel); user,setRoles(roles); adminUserRepository.save(user); return "redirect:/admin/"; }
2.视图页面
在视图页面中请注意遍历ll${adminrole}"这个用户角色,见以下代码:
<form th:action="@(/admin/user}" method二"post”〉
<label for=uname"> 用户名 </label>
〈input type="text" name="name" id二"name” placeholder="name7>
<label for="password" >密码</label>
〈input type二"password" name="password" id="password" placeholde「="passwo「cT/>
<label class="col-sm-2 control-label" >角色</label>
<div class="col-sm-10">
<select class=,,form-control" name="role">
<option th:each="adminrole : $(adminrole}" th:text="$(adminrole.cnname)"
th:value="$(adminrole.role}7>
</option></select>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token)">
〈input type="submit" value=”提交"class="btn btn-info" />
</form>
14.2.4配置安全类
配置安全类只需要继承WebSecurityConfigurerAdapter,然后重写其方法即可。这里要注意 以下几点。
•配置认证成功和失败的处理接口,见“successHandle「”和“failu「eHandle「”部分。
•配置加密解密方式,见“Passwo「dEncoder”部分。
•酉己置 UserDetailsServiceo
• CSRF默认是开启的。如果要忽略或关闭,则进行“http.csrfO”配置。
多用户系统的配置请见本书15.2节。配置安全类的方法见以下代码:
©Configuration
/**
*启用方法安全设置
*/
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private AuthenticationSuccessHandler myAuthenticationSuccessHandler;
@ Auto wired
private AuthenticationFailureHandler myAuthenticationFailHandler;
@Bean
/**
*使用BCrypt加密
7
public PasswordEncoder passwordEncoder() (
return new BCryptPasswordEncoder();
}
©Override
protected void configure(HttpSecurity http) throws Exception ( http.antMatcher('7admin/**").
〃指定登录认证的Controller
formLogin0.usemameParameter("uname").passwordParameter("pwd").loginPageC7admin/login").success Handler(
myAuthenticationSuccessHandler).failureHandler(myAuthenticationFailHandler)
.and()
.authorizeRequests()
〃登录相关
.antMatchers(7admin/login", 7admin/role", 7admin/user").permitAII()
//RABC相关
//.antMatchers(7admin/rbac").access("@rbacService.hasPermission(request,authentication)")
//.antMatchers(7admin/**,,).ac#ss("hasRole(,ADMIN,) or
@rbacService.hasPermission(request,authentication)")
.anyRequest().access("@rbacService.hasPermission(request,authentication)")
http.logout().logoutUrl(7admin/logout").permitAII();
// “记住我”功能
http.rememberMe().rememberMeParameter("rememberme"); http.csrf().ignoringAntMatchers(7admin/upload");
〃解决X-Frame-Options deny造成的页面空白,否则后台不能用frame http.headers0.frameOptions().sameOrigin();
}
@Bean
UserDetailsService ServiceO (
return new SysSecurityService();
}
©Override protected void configure(AuthenticationManagerBuilder auth) throws Exception ( auth.userDetailsService(Service()).passwordEncoder(new BCryptPasswordEncoder() ( });
}
)
14.2.5实现基于RBAC权限控制功能
1、仓腱RBAC服务接口
创建一个处理RBAC的接口类,定义“hasPermission"方法,见以下代码:
public interface RbacService {
boolean hasPermission(HttpServletRequest request, Authentication authentication);
}
2、实现RBAC服务
实现“hasPe「mission”方法。根据用户角色,从权限表中查出用户的权限URL,以返回权限
状态,见以下代码:
@Component("rbacService")
public class RbacServicelmpI implements RbacService (
private AntPathMatcher AntPathMatcher = new AntPathMatcher();
@Autowired
private SysPermissionRepository permissionRepository;
@Autowired
private SysUserRepository sysUserRepository;
©Override
public boolean hasPermission(HttpServletRequest request, Authentication authentication) (
Object principal = authentication.getPrincipal();
boolean hasPermission 二 false;
〃登录的用户名
String userName 二((UserDetails) principal).getUsemame();
〃获取请求登录的URL
Set<String> urls=new HashSet<>();//用户具备的系统资源集合,从数据库读取
SysUser sysUser = sysUserRepository.findByName(userName);
for (SysRole role : sysUser.getRolesO) (
for (SysPermission permission : role.getPermissionsO) ( urls.add(permission.getUrl());
}
}
for (String url: urls) (
if (AntPathMatcher.match(url, request.getRequestURlQ)) (
hasPermission = true;
break;
}
)
} return hasPermission;
)
}
3、配置安全类
加入下面的权限控制(这里先注释掉,添加完初始数据后开启),见以下代码:
antMatchers('7admin/**").access("@rbacService.hasPermission(request,authentication)")
4、测试
(1) 在安全配置类中设置允许匿名访问,设置以下代码:
.antMatchers(7admin/**',).permitAII()//.hasRole("ADMIN")
或在测试中添加用户名、密码,并配置权限。
(2) 创建用户和角色。因为加密了密码,所以不能直接在数据库中添加用户。
•创建角色:访问 http://localhost:8080/admin/role/add 进行添加。
•创建用户:访问 http://localhost:8080/admin/user/add 进行添加。
,创建权限:访问 http://localhost:8080/admin/permission/add 进行添加。
(3) 加入以下代码的权限验证,使权限功能启动。
.anyRequest().access("@rbacService.hasPermission(request,authentication)")
(4) 使用添加的用户名、密码进行操作。
在创建用户时要注意,加密密码是不能直接在数据库中添加的,一定要使用上面的方 法,或者使用测试单元进行添加。测试单元的代码可以复制控制器中的添加用户的代码。
14.3 监控 Spring Boot 应用
14.3.1 在 Spring Boot 中集成 Actuator
Actuator是Spring Boot提供的对应用系统监控功能的集成。它可以查看应用系统的配置情况, 如健康、审计、统计和HTTP追踪等。这些特性可以通过HTTP或JMX方式获得。
Actuator同时可以与外部应用监控系统整合,如Prometheus、Graphite、DataDog、Influx、 Wavefronts New Relic等。可以使用这些系统提供的仪表盘、图标、分析和告警等功能统一地监 控和管理应用。
Actuator创建了 Endpointo Endpoint可以被打开和关闭,也可以通过HTTP或JMX暴露出 来,使得它们能被远程进入。它暴露的功能见表14-1。
|
ID |
Description |
默认状态 |
|
auditevents |
显示应用暴露的审计事件(比如认证逬入、订单失败) |
开启 |
|
beans |
查看Bean及其关系列表 |
开启 |
|
caches |
显示有效的缓存 |
开启 |
|
conditions |
显示在配置和自动配置类上条件,以及它们匹配或不匹配的原因 |
开启 |
|
configprops |
显示所有@ConfigurationProperties 的列表 |
开启 |
|
env |
显示当前的环境特性 |
开启 |
|
flyway |
显示数据库迁移路径的详细信息 |
开启 |
|
health |
显示应用的健康状态 |
开启 |
|
httptrace |
显示 HTTP 足迹,最近 100 个 HTTP request/repsponse |
开启 |
|
info |
查看应用信息 |
开启 |
|
integrationgraph |
显示 Integration 图 |
开启 |
|
loggers |
显示和修改配置的loggers |
开启 |
|
liquibase |
显示Liquibase数据库迁移的纤细信息 |
开启 |
|
metrics |
显示应用多样的度量信息 |
开启 |
|
mappings |
显^fr^6^J@RequestMapping 路径 |
开启 |
|
scheduledtasks |
显示应用中的调度任务 |
开启 |
|
sessions |
显示session信息 |
开启 |
|
shutdown |
关闭应用 |
未开启 |
|
threaddump |
执行一个线程dump |
开启 |
如果是 Spring MVC、Spring WebFlux 应用,则支持额外的 Endpoint,比如 heapdump、 jolokia、logfile、prometheus。如果要显示应用信息,则需要进行自定义,如在配置文件中添加以 下代码:
info.ContactUs.email=363694485@qq.com info.ContactUs.phone=13659806466
然后通过GET方法,访问“/info”页面,即可查看到相关信息。
完整的Endpoint可以查看官网内容。
1、打开和关闭Endpoint
在默认情况下,除“shutdown endpoint”外,Endpoint都是打幵的,可以进行开关设置,如 果要打开“shutdown endpoint”,则可以在application.properties文件中增加以下代码:
management.endpoint.shutdown.enabled=true
在上面“shutdown”的位置填写Endpoint的ID,具体见表14-1 o 如果要通过HTTP暴露Actuator的Endpoint,则可以添加以下代码
management.endpoints. web.exposure, include^* management.endpoints.web.exposure.exclude=
参数值表示暴露所有的Endpointo如果要限定,贝何以通过Endpoint的ID进行设置。 比如只暴露“health”和“info”,则可以设置值为:
management.endpoints.web.exposure.include=health,info
如果要通过JMX暴露Actuator的Endpoint,则需要在配置文件中添加以下代码:
management.endpoints.jmx.exposure.include=* management.endpoints.jmx.exposure.exclude=
2、创建一个自定义的指标
如果想自定义一些指标,则可以通过实现Healthindicator接口来实现,或继承 AbstractHealthlndicator类并重写doHealthCheck方法来实现,见以下代码:
©Component
public class MyHealthlndicator extends AbstractHealthlndicator {
©Override
protected void doHealthCheck(Health.Builder builder) throws Exception ( builder.up().withDetail("自定义状态 ”,”0K”);
}
}
3、用 Spring Security 来保证 Endpoint 安全
Endpoint是非常敏感的,必须进行安全保护,可以使用Spring Security通过HTTP认证来保 护它。通过创建一个继承WebSecurityConfigurerAdapter的安全配置类,并配置权限,具体可以 参考以下代码:
©Configuration
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter (
©Override
protected void configure(HttpSecurity http) throws Exception (
http
.authorizeRequestsO .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class)) ,hasRoleCADMIN")
.requestMatchers(EndpointRequest.toAnyEndpointO)
.permitAllO .requestMatchers(PathRequest.toStaticResources().atCommonLocations()) .permitAllO
.antMatchers('7")
.permitAllO .antMatche「s(”/*”) .authenticated()
.and()
.httpBasic();
} }
为了方便使用,可以直接使用Spring Boot的Spring Boot Admin来监控应用。
14.3.2 在 Spring Boot 中集成 Spring Boot Admin 应用监控
Spring Boot Admin用于管理和监控Spring Boot应用程序。这些应用程序通过Spring Boot Admin Client (通过HTTP )注册使用。Spring Boot Admin提供了很多功能,如显示name、id、 versions在线状态、Loggers的日志级别管理、Threads线程管理、Environment管理等。
下面具体演示一下如何使用Spring Boot Admino
1.配置监控服务器端
(1 )在pom.xml文件中加入以下依赖。
—定要记得加入Actuator的依赖,否则不会显示相关信息,见以下代码:
<dependency> <groupld>org.springframework.boot</groupld> <artifactld>spring-boot-starter-actuator</artifactld> </dependency> <dependency> <groupld>org.springframework.boot</groupld> <artifactld>spring-boot-starter-web</artifactld> </dependency> <dependency> <groupld>de.codecentric</groupld> <artifactld>spring-boot-admin-starter-server</artifactld> </dependency>
(2) 在入口类中加上注解@EnableAdminServer,以开启监控功能。
(3) 配置 application.properties 文件。
这里直接监控服务器自己,在配置文件中加入以下代码:
server. port=8090 spring.application.name=Spring Boot Admin Web spring.boot.admin.url=http://localhost:$(server.port) #监控自己设置 spring.boot.admin.client.url=http://localhost:8090 management.endpoints.web.exposure.include^* management.endpoints.web.exposure.exclude= management.endpoints.jmx.exposure.include=* #显示详细的健康信息 management.endpoint.health.show-details=always endpoint.default.web.enable=true info.ContactUs.email=363694485@qq.com info.ContactUs.phone=13659806466 management.endpoint.shutdown.enabled=true management.endpoints.enabled-by-default=true management.endpoint.info.enabled=true spring.security.user.name:actuator spring.security.user.password:actuator spring.security.user.roles:ADMIN
(4) 访问“http://localhost:8090”,可以看到监控的面板,如图14-1所示。这里显示岀了自 定义信息和自定义指标。

2.配置被监控客户端
要使Spring Boot应用程序被监控(客户端),则需要进行下面的配置。
(1 )在pom.xml文件中加入依赖,所需的依赖见以下代码:
<dependency> <groupld>org.springframework.boot</groupld> Cacti factld>spring-boot-starter-web</artifactld> </dependency> <dependency> <groupld>de.codecentric</groupld> <artifactld>spring-boot-admin-starter-client</artifactld> </dependency> <dependency> <groupld>org.springframework.boot</groupld> <artifactld>spring-boot-starter-actuator</artifactld> </dependency>
(2)配置 application.properties;
这里需要配置服务器端的地址(“spring.boot.admin.u「l”的值),见以下代码:
spring.application.name=@project.description® server. port=8080 spring.boot.admin.url=http://localhost:8090 management.security.enabled=false #安全机制一定要设置成false,否则不能检测到客户的微服务信息 logging.file = /log.log #这里要设置微服务输出日志的地址,否则在Spring Boot Admin中不能显示“log”标签进行实时查询日志情况
14.3.3 在Spring Boot中集成Druid连接池监控
Spring Boot 集成 Druid 最简单的方式是引入 Starter ( druid-spring-boot-starter),然后配 置Druid参数。但要注意一点一一权限设置。可能配置好权限后也无法登录,或登录后没有数据, 这是很多人会遇到的情况,这可能是因为配置了其他权限,影响了 Druid的路径,导致Druid某些 访问没有权限。下面介绍权限设置的具体步骤。
(1 )引入依赖,见以下代码:
<dependency> <groupld>com.alibaba</groupld> <artifactld>druid-spring-boot-starter</artifactld> <version>1.1.10</version> </dependency> <dependency> <groupld>log4j</groupld> <artifactld>log4j</artifactld> <version>1.2.17</version> </dependency>
(2 )配置Druid参数。
比如,可以配置访问路径、用户名、密码等,具体用法见以下代码:
spring.datasource.type=com.alibaba.druid.pool. DruidDataSource spring.datasource.driver-class-name=com.mysql.jdbc. Driver spring.datasource.url=jdbc:mysql://localhost:3306/sys?useSSL=true&characterEncoding=utf-8&serverTi mezone=UTC spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.maxActive=20 spring.datasource.druid.maxWait=60000 spring.datasource.druid.timeBetweenEvictionRunsMillis=60000 spring.datasource.druid.minEvictableldleTimeMillis=300000 spring.datasource.druid.validationQuery=SELECT 1 FROM DUAL spring.datasource.druid.testWhileldle=true spring.datasource.druid.testOnBorrow=false spring.datasource.druid.testOnRetum=false spring.datasource.druid.poolPreparedStatements=true spring.datasource.druid.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.druid.filters=stat,wall,Iog4j spring.datasource.druid.connectionProperties=druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 spring.datasource.druid. web-stat-filter.enabled=true spring.datasource.druid.web-stat-filter.url-pattem=/* spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*-bmp,*.png *.css,*.ico,/druid/* spring.datasource.druid.stat-view-servlet.url-pattem=/druid/* spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.1.1 spring.datasource.druid.stat-view-servlet.deny=192.168.1.173 spring.datasource.druid.stat-view-servlet.reset-enable=false spring.datasource.druid.stat-view-servlet.Iogin-usemame=admin spring.datasource.druid.stat-view-servlet.login-password=123456
代码解释如下。
- spring.datasource.type:代表数据库连接交由D「uid管理。
- login-usemame:代表管理员用户名。
- login-password:代表管理员密码。
- url-pattern:代表配置的访问路径。

浙公网安备 33010602011771号