security动态配置权限(三)

x33g5p2x  于2022-03-02 转载在 其他  
字(18.5k)|赞(0)|评价(0)|浏览(197)

前言:在security基于数据库的认证(二)时,我们懂得了security是怎么从db里获取用户名和密码并且验证的,不过那些些权限还是静态配置的,本章主要讲如何实现动态配置权限

1.要准备的sql

  1. /*
  2. Navicat Premium Data Transfer
  3. Source Server : localhost
  4. Source Server Type : MySQL
  5. Source Server Version : 80018
  6. Source Host : localhost:3306
  7. Source Schema : demo
  8. Target Server Type : MySQL
  9. Target Server Version : 80018
  10. File Encoding : 65001
  11. Date: 02/03/2022 11:49:35
  12. */
  13. SET NAMES utf8mb4;
  14. SET FOREIGN_KEY_CHECKS = 0;
  15. -- ----------------------------
  16. -- Table structure for menu
  17. -- ----------------------------
  18. DROP TABLE IF EXISTS `menu`;
  19. CREATE TABLE `menu` (
  20. `id` int(11) NOT NULL AUTO_INCREMENT,
  21. `url` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '资源路径',
  22. PRIMARY KEY (`id`) USING BTREE
  23. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  24. -- ----------------------------
  25. -- Records of menu
  26. -- ----------------------------
  27. INSERT INTO `menu` VALUES (1, '/db/**');
  28. INSERT INTO `menu` VALUES (2, '/damin/**');
  29. INSERT INTO `menu` VALUES (3, '/user/**');
  30. -- ----------------------------
  31. -- Table structure for menu_role_ref
  32. -- ----------------------------
  33. DROP TABLE IF EXISTS `menu_role_ref`;
  34. CREATE TABLE `menu_role_ref` (
  35. `id` int(11) NOT NULL AUTO_INCREMENT,
  36. `menu_id` int(11) NULL DEFAULT NULL COMMENT '菜单id',
  37. `role_id` int(11) NULL DEFAULT NULL COMMENT '角色id',
  38. PRIMARY KEY (`id`) USING BTREE
  39. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  40. -- ----------------------------
  41. -- Records of menu_role_ref
  42. -- ----------------------------
  43. INSERT INTO `menu_role_ref` VALUES (1, 1, 1);
  44. INSERT INTO `menu_role_ref` VALUES (2, 2, 2);
  45. INSERT INTO `menu_role_ref` VALUES (3, 3, 3);
  46. -- ----------------------------
  47. -- Table structure for role
  48. -- ----------------------------
  49. DROP TABLE IF EXISTS `role`;
  50. CREATE TABLE `role` (
  51. `id` int(11) NOT NULL AUTO_INCREMENT,
  52. `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  53. `description` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  54. PRIMARY KEY (`id`) USING BTREE
  55. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  56. -- ----------------------------
  57. -- Records of role
  58. -- ----------------------------
  59. INSERT INTO `role` VALUES (1, 'ROLE_db', '数据库管理员');
  60. INSERT INTO `role` VALUES (2, 'ROLE_admin', '系统管理员');
  61. INSERT INTO `role` VALUES (3, 'ROLE_user', '用户');
  62. -- ----------------------------
  63. -- Table structure for user
  64. -- ----------------------------
  65. DROP TABLE IF EXISTS `user`;
  66. CREATE TABLE `user` (
  67. `id` int(11) NOT NULL AUTO_INCREMENT,
  68. `username` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  69. `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  70. `enabled` tinyint(1) NULL DEFAULT NULL,
  71. `locked` tinyint(1) NULL DEFAULT NULL,
  72. PRIMARY KEY (`id`) USING BTREE
  73. ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  74. -- ----------------------------
  75. -- Records of user
  76. -- ----------------------------
  77. INSERT INTO `user` VALUES (1, 'root', '$2a$10$O8G0X/sUPAA76MV7U3BwY.3Uo8/QMBcqK678Rwkoz.fowbce.CLtO', 1, 0);
  78. INSERT INTO `user` VALUES (2, 'admin', '$2a$10$O8G0X/sUPAA76MV7U3BwY.3Uo8/QMBcqK678Rwkoz.fowbce.CLtO', 1, 0);
  79. INSERT INTO `user` VALUES (3, 'tom', '$2a$10$O8G0X/sUPAA76MV7U3BwY.3Uo8/QMBcqK678Rwkoz.fowbce.CLtO', 1, 0);
  80. -- ----------------------------
  81. -- Table structure for user_role_ref
  82. -- ----------------------------
  83. DROP TABLE IF EXISTS `user_role_ref`;
  84. CREATE TABLE `user_role_ref` (
  85. `id` int(11) NOT NULL AUTO_INCREMENT,
  86. `user_id` int(11) NULL DEFAULT NULL,
  87. `role_id` int(11) NULL DEFAULT NULL,
  88. PRIMARY KEY (`id`) USING BTREE
  89. ) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
  90. -- ----------------------------
  91. -- Records of user_role_ref
  92. -- ----------------------------
  93. INSERT INTO `user_role_ref` VALUES (1, 1, 1);
  94. INSERT INTO `user_role_ref` VALUES (2, 1, 2);
  95. INSERT INTO `user_role_ref` VALUES (3, 2, 2);
  96. INSERT INTO `user_role_ref` VALUES (4, 3, 3);
  97. SET FOREIGN_KEY_CHECKS = 1;

2.pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.6.4</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>com.yl</groupId>
  12. <artifactId>security-dy</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>security-dy</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>11</java.version>
  18. </properties>
  19. <dependencies>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-security</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-web</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.mybatis.spring.boot</groupId>
  30. <artifactId>mybatis-spring-boot-starter</artifactId>
  31. <version>2.2.2</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>com.alibaba</groupId>
  35. <artifactId>druid-spring-boot-starter</artifactId>
  36. <version>1.1.10</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>mysql</groupId>
  40. <artifactId>mysql-connector-java</artifactId>
  41. <scope>runtime</scope>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. <dependency>
  49. <groupId>org.springframework.security</groupId>
  50. <artifactId>spring-security-test</artifactId>
  51. <scope>test</scope>
  52. </dependency>
  53. </dependencies>
  54. <build>
  55. <resources>
  56. <resource>
  57. <directory>src/main/java</directory>
  58. <includes>
  59. <include>**/*.xml</include>
  60. </includes>
  61. </resource>
  62. <resource>
  63. <directory>src/min/resources</directory>
  64. </resource>
  65. </resources>
  66. <plugins>
  67. <plugin>
  68. <groupId>org.springframework.boot</groupId>
  69. <artifactId>spring-boot-maven-plugin</artifactId>
  70. </plugin>
  71. </plugins>
  72. </build>
  73. </project>

3.application.properties

  1. spring.datasource.url=jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.username=root
  4. spring.datasource.password=root

4.实体类

  1. package com.yl.securitydy.domain;
  2. import org.springframework.security.core.GrantedAuthority;
  3. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  4. import org.springframework.security.core.userdetails.UserDetails;
  5. import java.util.ArrayList;
  6. import java.util.Collection;
  7. import java.util.List;
  8. public class User implements UserDetails {
  9. private Integer id;
  10. private String username;
  11. private String password;
  12. private Boolean enabled;
  13. private Boolean locked;
  14. private List<Role> roles;
  15. public Integer getId() {
  16. return id;
  17. }
  18. public void setId(Integer id) {
  19. this.id = id;
  20. }
  21. public void setUsername(String username) {
  22. this.username = username;
  23. }
  24. @Override
  25. public Collection<? extends GrantedAuthority> getAuthorities() {
  26. List<SimpleGrantedAuthority> list = new ArrayList<>();
  27. for (Role role : roles) {
  28. list.add(new SimpleGrantedAuthority(role.getName()));
  29. }
  30. return list;
  31. }
  32. @Override
  33. public String getPassword() {
  34. return password;
  35. }
  36. @Override
  37. public String getUsername() {
  38. return username;
  39. }
  40. // 账户是否未过期
  41. @Override
  42. public boolean isAccountNonExpired() {
  43. return true;
  44. }
  45. // 账户是否未锁定
  46. @Override
  47. public boolean isAccountNonLocked() {
  48. return !locked;
  49. }
  50. // 凭证是否未过期
  51. @Override
  52. public boolean isCredentialsNonExpired() {
  53. return true;
  54. }
  55. @Override
  56. public boolean isEnabled() {
  57. return enabled;
  58. }
  59. public void setPassword(String password) {
  60. this.password = password;
  61. }
  62. public void setEnabled(Boolean enabled) {
  63. this.enabled = enabled;
  64. }
  65. public void setLocked(Boolean locked) {
  66. this.locked = locked;
  67. }
  68. public List<Role> getRoles() {
  69. return roles;
  70. }
  71. public void setRoles(List<Role> roles) {
  72. this.roles = roles;
  73. }
  74. @Override
  75. public String toString() {
  76. return "User{" +
  77. "id=" + id +
  78. ", username='" + username + '\'' +
  79. ", password='" + password + '\'' +
  80. ", enabled=" + enabled +
  81. ", locked=" + locked +
  82. '}';
  83. }
  84. }
  1. package com.yl.securitydy.domain;
  2. import java.io.Serializable;
  3. public class Role implements Serializable {
  4. private Integer id;
  5. private String name;
  6. private String description;
  7. public Integer getId() {
  8. return id;
  9. }
  10. public void setId(Integer id) {
  11. this.id = id;
  12. }
  13. public String getName() {
  14. return name;
  15. }
  16. public void setName(String name) {
  17. this.name = name;
  18. }
  19. public String getDescription() {
  20. return description;
  21. }
  22. public void setDescription(String description) {
  23. this.description = description;
  24. }
  25. @Override
  26. public String toString() {
  27. return "Role{" +
  28. "id=" + id +
  29. ", name='" + name + '\'' +
  30. ", description='" + description + '\'' +
  31. '}';
  32. }
  33. }
  1. package com.yl.securitydy.domain;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. public class Menu implements Serializable {
  5. private Integer id;
  6. private String url;
  7. private List<Role> roles;
  8. public List<Role> getRoles() {
  9. return roles;
  10. }
  11. public void setRoles(List<Role> roles) {
  12. this.roles = roles;
  13. }
  14. public Integer getId() {
  15. return id;
  16. }
  17. public void setId(Integer id) {
  18. this.id = id;
  19. }
  20. public String getUrl() {
  21. return url;
  22. }
  23. public void setUrl(String url) {
  24. this.url = url;
  25. }
  26. @Override
  27. public String toString() {
  28. return "Menu{" +
  29. "id=" + id +
  30. ", url='" + url + '\'' +
  31. ", roles=" + roles +
  32. '}';
  33. }
  34. }

5.mapper

  1. package com.yl.securitydy.mapper;
  2. import com.yl.securitydy.domain.User;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface UserMapper {
  6. User loadUserByUserName(String username);
  7. }
  1. package com.yl.securitydy.mapper;
  2. import com.yl.securitydy.domain.Role;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import java.util.List;
  5. @Mapper
  6. public interface RoleMapper {
  7. List<Role> getRoleListByUserId(Integer userId);
  8. }
  1. package com.yl.securitydy.mapper;
  2. import com.yl.securitydy.domain.Menu;
  3. import org.apache.ibatis.annotations.Mapper;
  4. import java.util.List;
  5. @Mapper
  6. public interface MenuMapper {
  7. List<Menu> getAllMenuList();
  8. }

6.mapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yl.securitydy.mapper.UserMapper">
  4. <select id="loadUserByUserName" resultType="com.yl.securitydy.domain.User">
  5. select * from user where username = #{username}
  6. </select>
  7. </mapper>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yl.securitydy.mapper.RoleMapper">
  4. <select id="getRoleListByUserId" resultType="com.yl.securitydy.domain.Role">
  5. select * from role where id in (select role_id from user_role_ref where user_id = #{userId})
  6. </select>
  7. </mapper>
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="com.yl.securitydy.mapper.MenuMapper">
  4. <resultMap id="baseResultMap" type="com.yl.securitydy.domain.Menu">
  5. <id property="id" column="id"/>
  6. <result property="url" column="url"/>
  7. <collection property="roles" ofType="com.yl.securitydy.domain.Role">
  8. <id property="id" column="rid"/>
  9. <result property="name" column="name"/>
  10. <result property="description" column="description"/>
  11. </collection>
  12. </resultMap>
  13. <select id="getAllMenuList" resultMap="baseResultMap">
  14. select m.*,r.id rid,r.name,r.description from menu m left join menu_role_ref mrr on m.id = mrr.menu_id left join role r on r.id = mrr.role_id;
  15. </select>
  16. </mapper>

7.service

  1. package com.yl.securitydy.service;
  2. import com.yl.securitydy.domain.Role;
  3. import com.yl.securitydy.domain.User;
  4. import com.yl.securitydy.mapper.RoleMapper;
  5. import com.yl.securitydy.mapper.UserMapper;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.security.core.userdetails.UserDetails;
  8. import org.springframework.security.core.userdetails.UserDetailsService;
  9. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  10. import org.springframework.stereotype.Service;
  11. import java.util.List;
  12. @Service
  13. public class UserService implements UserDetailsService {
  14. @Autowired
  15. UserMapper userMapper;
  16. @Autowired
  17. RoleMapper roleMapper;
  18. @Override
  19. public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  20. User user = userMapper.loadUserByUserName(username);
  21. if (user == null) {
  22. throw new UsernameNotFoundException("用户不存在");
  23. }
  24. List<Role> roles = roleMapper.getRoleListByUserId(user.getId());
  25. user.setRoles(roles);
  26. return user;
  27. }
  28. }
  1. package com.yl.securitydy.service;
  2. import com.yl.securitydy.domain.Menu;
  3. import com.yl.securitydy.mapper.MenuMapper;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Service;
  6. import java.util.List;
  7. @Service
  8. public class MenuService {
  9. @Autowired
  10. MenuMapper menuMapper;
  11. public List<Menu> getAllMenuList(){
  12. return menuMapper.getAllMenuList();
  13. }
  14. }

8.自定义源数据拦截器

  1. package com.yl.securitydy.config;
  2. import com.yl.securitydy.domain.Menu;
  3. import com.yl.securitydy.domain.Role;
  4. import com.yl.securitydy.service.MenuService;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.security.access.ConfigAttribute;
  7. import org.springframework.security.access.SecurityConfig;
  8. import org.springframework.security.web.FilterInvocation;
  9. import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.AntPathMatcher;
  12. import java.util.Collection;
  13. import java.util.List;
  14. @Component
  15. public class MyFilter implements FilterInvocationSecurityMetadataSource {
  16. AntPathMatcher antPathMatcher = new AntPathMatcher();
  17. @Autowired
  18. MenuService menuService;
  19. // 判断请求路径需要那些角色可以访问
  20. @Override
  21. public Collection<ConfigAttribute> getAttributes(Object object) throws IllegalArgumentException {
  22. //获取请求地址
  23. String requestUrl = ((FilterInvocation) object).getRequestUrl();
  24. List<Menu> menuList = menuService.getAllMenuList();
  25. for (Menu menu : menuList) {
  26. if (antPathMatcher.matchStart(menu.getUrl(),requestUrl)) {
  27. List<Role> roles = menu.getRoles();
  28. String[] roleStrs = new String[roles.size()];
  29. for (int i = 0;i < roles.size();i++) {
  30. roleStrs[i] = roles.get(i).getName();
  31. }
  32. return SecurityConfig.createList(roleStrs);
  33. }
  34. }
  35. // 对于没有匹配到的一些请求地址,默认其登录后就可以访问
  36. return SecurityConfig.createList("ROLE_login");
  37. }
  38. @Override
  39. public Collection<ConfigAttribute> getAllConfigAttributes() {
  40. return null;
  41. }
  42. @Override
  43. public boolean supports(Class<?> clazz) {
  44. return true;
  45. }
  46. }

9.自定义决策管理器

  1. package com.yl.securitydy.config;
  2. import org.springframework.security.access.AccessDecisionManager;
  3. import org.springframework.security.access.AccessDeniedException;
  4. import org.springframework.security.access.ConfigAttribute;
  5. import org.springframework.security.authentication.AnonymousAuthenticationToken;
  6. import org.springframework.security.authentication.InsufficientAuthenticationException;
  7. import org.springframework.security.core.Authentication;
  8. import org.springframework.security.core.GrantedAuthority;
  9. import org.springframework.stereotype.Component;
  10. import java.util.Collection;
  11. @Component
  12. public class MyAccess implements AccessDecisionManager {
  13. //获取当前用户拥有的角色并且和访问地址需要的角色做匹配,然后决策
  14. @Override
  15. public void decide(Authentication authentication, Object object, Collection<ConfigAttribute> configAttributes) throws AccessDeniedException, InsufficientAuthenticationException {
  16. for (ConfigAttribute attribute : configAttributes) {
  17. if ("ROLE_login".equals(attribute.getAttribute())) {
  18. // 如果用户时匿名用户登录直接抛异常
  19. if (authentication instanceof AnonymousAuthenticationToken) {
  20. throw new AccessDeniedException("非法请求!");
  21. } else {
  22. //放行
  23. return;
  24. }
  25. }
  26. Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
  27. for (GrantedAuthority authority : authorities) {
  28. if (authority.getAuthority().equals(attribute.getAttribute())) {
  29. //放行
  30. return;
  31. }
  32. }
  33. }
  34. throw new AccessDeniedException("非法请求!");
  35. }
  36. @Override
  37. public boolean supports(ConfigAttribute attribute) {
  38. return true;
  39. }
  40. @Override
  41. public boolean supports(Class<?> clazz) {
  42. return true;
  43. }
  44. }

10.securityconfig

  1. package com.yl.securitydy.config;
  2. import com.yl.securitydy.service.UserService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.security.config.annotation.ObjectPostProcessor;
  7. import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  8. import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  9. import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  10. import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  11. import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
  12. @Configuration
  13. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  14. @Autowired
  15. UserService userService;
  16. @Autowired
  17. MyFilter myFilter;
  18. @Autowired
  19. MyAccess myAccess;
  20. @Bean
  21. BCryptPasswordEncoder bCryptPasswordEncoder() {
  22. return new BCryptPasswordEncoder();
  23. }
  24. @Override
  25. protected void configure(AuthenticationManagerBuilder auth) throws Exception {
  26. auth.userDetailsService(userService);
  27. }
  28. @Override
  29. protected void configure(HttpSecurity http) throws Exception {
  30. http.authorizeRequests()
  31. .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() {
  32. @Override
  33. public <O extends FilterSecurityInterceptor> O postProcess(O object) {
  34. object.setAccessDecisionManager(myAccess);
  35. object.setSecurityMetadataSource(myFilter);
  36. return object;
  37. }
  38. })
  39. .and()
  40. .formLogin()
  41. .permitAll()
  42. .and()
  43. .csrf().disable();
  44. }
  45. }

11.controller

  1. package com.yl.securitydy.controller;
  2. import org.springframework.web.bind.annotation.GetMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. @RestController
  5. public class HelloController {
  6. @GetMapping("/hello")
  7. public String hello() {
  8. return "hello";
  9. }
  10. @GetMapping("/db/hello")
  11. public String db() {
  12. return "hello db";
  13. }
  14. @GetMapping("/admin/hello")
  15. public String admin() {
  16. return "hello admin";
  17. }
  18. @GetMapping("/user/hello")
  19. public String user() {
  20. return "hello user";
  21. }
  22. }

12.测试

1.登录root账号(其拥有两个角色,可以访问/db/hello和/admin/hello)

2.root账号访问不了/user/hello接口

相关文章