《Spring Boot 实战派》--14.开发企业级通用的后台系统

第14章 开发企业级通用的后台系统

使用Spring Boot,免不了开发后台系统。所以,本章通过实现一个基于角色的访问控制后台 系统,来系统地介绍如何使用Spring Security。

本实例的源代码可以在“/14/ManagementSystemDemo”目录下找到。

 

14.1JPA实现实体间的映射关系

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.2Spring 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:代表配置的访问路径。

 

posted @ 2022-05-21 21:02  IT6889  阅读(110)  评论(0编辑  收藏  举报