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