《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接口实现认证及授权,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | package com.example.demo.entity.sysuser; ©Entity public class SysUser implements UserDetails ( <br> //主键及自动增长 @ld @GeneratedValue private long id;<br> @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) <br> private List<SysRole> roles; public long getld() { return id; }<br> /**<br> * 根据自定义逻辑来返回用户权限。如果用户权限返回空,或者和拦截路径对应权限不同,则验证不通过 */ @Override public Collection<? extends GrantedAuthority> getAuthorities() { List<GrantedAuthority> authorities = new ArrayList<>(); List<SysRole> roles = this .getRoles(); for (SysRole role : roles) { <br> authorities.add( new SimpleGrantedAuthority(role.getRole())); } return authorities; } } |
14.1.2创建角色实体
角色是用户和权限的中间代理表。用户(user)和权限(permission )之间没有直接的关系, 用户(user)需要通过角色作为代理(中间人)来获取拥有的权限,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | @Data @Entity public class SysRole { @ld @GeneratedValue /** * 编号 */ private Integer id; private String cnname; /** * 角色标识,如“管理员” */ private String role;<br> /** * 角色描述,用于在Ul界面显示角色信息 */ private String description;<br> /** * 是否可用。如果不可用,则不会添加给用户 */ private Boolean available = Boolean.FALSE;<br> /** * 角色一权限关系:多对多关系 */ @ManyToMany (fetch = FetchType. EAGER) @JoinTable (name = "SysRolePermission" , joinColumns = ( @JoinColumn (name = "roleld" )), inverseJoinColumns = { @JoinColumn (name = "permissionld" ))) private List<SysPermission> permissions;<br> /** * 用户一角色关系:多对多关系 */ @ManyToMany @JoinTable (name = "SysUserRole" , joinColumns = ( @JoinColumn (name = "roleld" )), inverseJoinColumns = ( @JoinColumn (name = "uid" ))) /** * —个角色对应多个用户 */ private List<SysUser> userinfos; ) |
14.1.3创建权限实体
权限和角色存在多对多关系。一般情况下,权限不会和用户直接关联,它用于存放权限信息, 比如权限的名称、HTTP方法、URL路径。具体见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | @Data ©Entity public class SysPermission implements Serializable { <br> @ld @GeneratedValue /** * 主键 */ private Integer id; /** * 名称 */ private String name;<br> @Column (columnDefinition = "enumCmenu','button')" ) /** * 资源类型,[menu|button] */ private String resourceType;<br> /** * 资源路径 */ private String url;<br> /** * 权限字符串。menu <br> * 例子:role:*; button 例子:role:create,role:update,role:delete,role:view */ private String permission;<br> /** *父编号 */ private Long parentld;<br> /** * 父编号列表 */ private String parentlds;<br> private Boolean available = Boolean.FALSE;<br> <strong>©Transient</strong> private List permissions;<br> @ManyToMany @JoinTable (name = "SysRolePermission" , joinColumns = { @JoinColumn (name = "permissionld" )), inverseJoinColumns = { @JoinColumn (name = "roleld" ))) private List<SysRole> roles;<br> public List getPermissionsO ( return Arrays.asList( this .permission.trimO.split( 'T' )); }<br> public void setPermissions(List permissions) { this .permissions = permissions;<br> }<br>} |
14.2用Spring Security实现动态授权(RBAC)功能
14.2.1实现管理(增加、删除、修改和查询)管理员角色功能
1、实现控制器
控制器主要指定URL映射和视图,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ©Controller @RequestMapping ( "admin" ) public class SysRoleControlller { <br> @Autowired private SysRoleRepository sysRoleRepository; <br><br> @RequestMapping ( "/role/add" ) public String addRole() { return "admin/role/add" ; }<br> @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值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | <!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.实现权限控制器
权限管理主要是对权限迸行增加、删除' 修改和查询操作。权限要和角色对应起来。在进行操 作时需要附带角色字段,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ©Controller @RequestMapping (7admin/permission") public class SysPermissionControler {<br> @Autowired private SysPermissionRepository sysPermissionRepository;<br> @Autowired private SysRoleRepository sysRoleRepository;<br> @RequestMapping ( "/add" ) public String addPermission(Model model) { List<SysRole> sysRole = sysRoleRepository.findAII(); model.addAttribute( "sysRole" , sysRole); return "admin/permission/add" ;<br> } <br> @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 的标签,用于遍历数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <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"和角色遍历部分,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | @Autowired private SysUserRepository adminUserRepository; <br> @Autowired private SysRoleRepository sysRoleRepository;<br> //@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" ; }<br> //@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}"这个用户角色,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <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节。配置安全类的方法见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | ©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"方法,见以下代码:
1 2 3 | public interface RbacService { boolean hasPermission(HttpServletRequest request, Authentication authentication); } |
2、实现RBAC服务
实现“hasPe「mission”方法。根据用户角色,从权限表中查出用户的权限URL,以返回权限
状态,见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | @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、配置安全类
加入下面的权限控制(这里先注释掉,添加完初始数据后开启),见以下代码:
1 | antMatchers('7admin/** ").access(" @rbacService .hasPermission(request,authentication)") |
4、测试
(1) 在安全配置类中设置允许匿名访问,设置以下代码:
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) 加入以下代码的权限验证,使权限功能启动。
1 | .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。如果要显示应用信息,则需要进行自定义,如在配置文件中添加以 下代码:
1 2 | info.ContactUs.email= 363694485 @qq .com info.ContactUs.phone= 13659806466 |
然后通过GET方法,访问“/info”页面,即可查看到相关信息。
完整的Endpoint可以查看官网内容。
1、打开和关闭Endpoint
在默认情况下,除“shutdown endpoint”外,Endpoint都是打幵的,可以进行开关设置,如 果要打开“shutdown endpoint”,则可以在application.properties文件中增加以下代码:
1 | management.endpoint.shutdown.enabled= true |
在上面“shutdown”的位置填写Endpoint的ID,具体见表14-1 o 如果要通过HTTP暴露Actuator的Endpoint,则可以添加以下代码
1 2 | management.endpoints. web.exposure, include^* management.endpoints.web.exposure.exclude= |
参数值表示暴露所有的Endpointo如果要限定,贝何以通过Endpoint的ID进行设置。 比如只暴露“health”和“info”,则可以设置值为:
1 | management.endpoints.web.exposure.include=health,info |
如果要通过JMX暴露Actuator的Endpoint,则需要在配置文件中添加以下代码:
1 2 | management.endpoints.jmx.exposure.include=* management.endpoints.jmx.exposure.exclude= |
2、创建一个自定义的指标
如果想自定义一些指标,则可以通过实现Healthindicator接口来实现,或继承 AbstractHealthlndicator类并重写doHealthCheck方法来实现,见以下代码:
1 2 3 4 5 6 | ©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的安全配置类,并配置权限,具体可以 参考以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 | ©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的依赖,否则不会显示相关信息,见以下代码:
1 2 3 4 5 6 7 8 9 | <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 文件。
这里直接监控服务器自己,在配置文件中加入以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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文件中加入依赖,所需的依赖见以下代码:
1 2 3 4 5 6 7 8 9 10 11 | <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”的值),见以下代码:
1 2 3 4 5 | 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 )引入依赖,见以下代码:
1 2 3 4 5 6 7 8 9 10 | <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参数。
比如,可以配置访问路径、用户名、密码等,具体用法见以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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:代表配置的访问路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?