问题反馈的网站怎么做,山亭 网站建设,做水果网站行,服装网站建设图文章目录 简介方法一添加数据库依赖配置数据库连接创建用户角色表创建Spring Data JPA实体和仓库实现自定义的网关过滤器配置网关过滤器几个简单的测试API 方法二创建数据库访问接口实现数据库访问接口创建用户角色判断逻辑创建网关过滤器配置网关过滤器 总结 简介
在一些特定… 文章目录 简介方法一添加数据库依赖配置数据库连接创建用户角色表创建Spring Data JPA实体和仓库实现自定义的网关过滤器配置网关过滤器几个简单的测试API 方法二创建数据库访问接口实现数据库访问接口创建用户角色判断逻辑创建网关过滤器配置网关过滤器 总结 简介
在一些特定的业务需求下要求创建只读用户但是由于一些查询请求使用的是POST方法因此在网关层面配置只允许请求GET方法又无法满足。所以就想到了是否可以在 JDBC 层面控制判断角色并且只允许执行 SELECT 类型的SQL语句。
在Spring Boot项目中我们可以通过结合网关和JDBC来实现基于角色的数据库访问权限控制。具体来说我们可以通过拦截用户请求并判断其角色然后根据角色限制用户执行的SQL语句。
方法一
添加数据库依赖
在 pom.xml 文件中添加数据库相关依赖如 spring-boot-starter-jdbc 和相应数据库驱动。
配置数据库连接
首先我们需要配置数据库连接以便能够与数据库进行交互。在 application.properties 或 application.yml 文件中添加以下配置信息
spring:datasource:url: jdbc:mysql://localhost:3306/mydatabase?useSSLfalseusername: rootpassword: passworddriver-class-name: com.mysql.jdbc.Driver这里使用了MySQL数据库作为示例你可以根据实际情况配置相应的数据库连接信息。
创建用户角色表
为了实现角色的判断和数据库访问权限的控制我们需要创建一个用户角色表其中包含用户ID和角色字段。示例中我们创建一个名为 user_roles 的表
CREATE TABLE user_roles (id INT AUTO_INCREMENT PRIMARY KEY,user_id INT NOT NULL,role VARCHAR(20) NOT NULL
);你可以根据实际需求扩展该表的字段例如添加其他用户属性。
创建Spring Data JPA实体和仓库
接下来我们创建与 user_roles 表对应的实体类和Spring Data JPA仓库接口。在 src/main/java 目录下创建一个 com.example.demo.entity 包并在其中创建一个 UserRole 类
import javax.persistence.*;Entity
Table(name user_roles)
public class UserRole {IdGeneratedValue(strategy GenerationType.IDENTITY)private Long id;Column(name user_id)private Long userId;private String role;// 省略构造函数、getter和setter方法
}然后在同一个包中创建一个 UserRoleRepository 接口继承自 JpaRepository
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRoleRepository extends JpaRepositoryUserRole, Long {UserRole findByUserId(Long userId);
}这样我们就创建了实体类和仓库接口用于操作用户角色数据。
实现自定义的网关过滤器
接下来我们需要实现一个自定义的网关过滤器用于拦截用户请求并进行角色判断。在 src/main/java 目录下创建一个 com.example.demo.filter 包并在其中创建一个 DatabaseFilter 类
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import reactor.core.publisher.Mono;Component
public class DatabaseFilter extends AbstractGatewayFilterFactoryDatabaseFilter.Config {private final UserRepository userRepository;private final UserRoleChecker userRoleChecker;public DatabaseFilter(UserRepository userRepository, UserRoleChecker userRoleChecker) {super(Config.class);this.userRepository userRepository;this.userRoleChecker userRoleChecker}Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) - {ServerHttpRequest request exchange.getRequest();String userId request.getHeaders().getFirst(UserId);if (!StringUtils.isEmpty(userId)) {Long userIdLong Long.parseLong(userId);User user userRepository.findById(userIdLong).orElse(null);if (user ! null) {UserRole userRole userRoleRepository.findByUserId(userIdLong);if (userRole ! null) {if (config.getReadOnlyRoles().contains(userRole.getRole())) {// 只读角色只允许执行SELECT查询语句String method request.getMethodValue();if (!GET.equals(method)) {exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}}}}}return chain.filter(exchange);};}public static class Config {private ListString readOnlyRoles;public ListString getReadOnlyRoles() {return readOnlyRoles;}public void setReadOnlyRoles(ListString readOnlyRoles) {this.readOnlyRoles readOnlyRoles;}}
}在这个过滤器中我们首先从请求头中获取用户ID然后通过该ID查询用户角色。如果用户角色是只读角色即在配置中指定的只读角色列表中则判断请求方法是否为GET如果不是GET方法则返回HTTP状态码403拒绝请求。如果用户角色不是只读角色或者用户ID或角色不存在将请求传递给下一个过滤器。
配置网关过滤器
最后我们需要在网关配置文件中配置过滤器。在src/main/resources目录下的application.yml文件中添加以下配置信息
spring:cloud:gateway:routes:- id: jdbc-routeuri: http://localhost:8080predicates:- Path/api/**filters:- DatabaseFilterreadOnlyRoles: [ROLE_READ_ONLY]其中 readOnlyRoles 参数指定只读角色的名称这里使用了 ROLE_READ_ONLY 作为示例。 /api/** 表示拦截以 /api/ 开头的请求将其传递给 http://localhost:8080 的目标服务。
几个简单的测试API
这里提供了一个简单的示例代码用于演示如何从JDBC入手结合网关根据用户角色限制执行的SQL语句。请注意这只是一个简单的示例你可以根据具体需求进行扩展和优化。
RestController
RequestMapping(/api)
public class UserController {Autowiredprivate UserRepository userRepository;GetMapping(/users)public ListUser getAllUsers() {return userRepository.findAll();}GetMapping(/users/{id})public User getUserById(PathVariable Long id) {return userRepository.findById(id).orElse(null);}PostMapping(/users)public User createUser(RequestBody User user) {return userRepository.save(user);}PutMapping(/users/{id})public User updateUser(PathVariable Long id, RequestBody User user) {User existingUser userRepository.findById(id).orElse(null);if (existingUser ! null) {existingUser.setName(user.getName());existingUser.setEmail(user.getEmail());// ... 更新其他属性return userRepository.save(existingUser);}return null;}DeleteMapping(/users/{id})public void deleteUser(PathVariable Long id) {userRepository.deleteById(id);}
}在这个示例中我们定义了几个用户管理的API接口包括获取所有用户、根据ID获取用户、创建用户、更新用户和删除用户。根据之前配置的网关过滤器在只读角色的情况下只有GET请求方法能够执行成功而其他方法将返回HTTP状态码403。
方法二
创建数据库访问接口
创建一个数据库访问接口用于执行SQL查询。可以使用Spring JDBC或者使用ORM框架如MyBatis。
public interface UserRepository {ListUser findAll();
}实现数据库访问接口
在实现类中使用 JdbcTemplate 或者其他数据库操作工具执行SQL语句。
Repository
public class JdbcUserRepository implements UserRepository {private final JdbcTemplate jdbcTemplate;public JdbcUserRepository(JdbcTemplate jdbcTemplate) {this.jdbcTemplate jdbcTemplate;}Overridepublic ListUser findAll() {String sql SELECT * FROM users;return jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class));}
}创建用户角色判断逻辑
创建一个用于判断用户角色的逻辑可以使用Spring Security或者自定义注解来实现。
Component
public class UserRoleChecker {public boolean isReadOnlyUser(User user) {// 根据用户角色判断是否只读用户return user.getRole().equals(READ_ONLY);}
}创建网关过滤器
创建一个网关过滤器用于在请求到达Controller之前进行权限判断并阻止非只读用户执行非SELECT的SQL查询。
Component
public class DatabaseFilter implements GlobalFilter, Ordered {private final UserRepository userRepository;private final UserRoleChecker userRoleChecker;public DatabaseFilter(UserRepository userRepository, UserRoleChecker userRoleChecker) {this.userRepository userRepository;this.userRoleChecker userRoleChecker;}Overridepublic MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求中的用户信息User user getUserFromRequest(exchange.getRequest());// 判断用户角色是否只读用户boolean isReadOnlyUser userRoleChecker.isReadOnlyUser(user);// 获取请求的SQL语句String sql getSqlFromRequest(exchange.getRequest());// 如果是非只读用户且SQL语句不是SELECT则拒绝请求if (!isReadOnlyUser !sql.startsWith(SELECT)) {exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);return exchange.getResponse().setComplete();}return chain.filter(exchange);}Overridepublic int getOrder() {return -1; // 设置过滤器优先级确保在其他过滤器之前执行}private User getUserFromRequest(ServerHttpRequest request) {// 从请求中获取用户信息可以从请求头、Cookie或者其他方式获取// 示例中直接返回一个固定的用户return new User(readonly, READ_ONLY);}private String getSqlFromRequest(ServerHttpRequest request) {// 从请求中获取SQL语句可以从请求参数、请求体或者其他方式获取。示例中直接返回一个固定的SQL语句。return SELECT * FROM users;}}
配置网关过滤器
在Spring Boot的配置类中配置网关过滤器。
Configuration
public class GatewayConfig {private final UserRepository userRepository;private final UserRoleChecker userRoleChecker;public GatewayConfig(UserRepository userRepository, UserRoleChecker userRoleChecker) {this.userRepository userRepository;this.userRoleChecker userRoleChecker;}Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(database, r - r.path(/api/**).filters(f - f.filter(new DatabaseFilter(userRepository, userRoleChecker))).uri(http://localhost:8080)).build();}
}上述示例中配置了一个名为database的路由该路由会匹配所有以/api/开头的请求并通过 DatabaseFilter 过滤器进行权限判断。如果用户角色是只读用户且SQL语句不是以SELECT开头则拒绝请求。
总结
通过以上步骤我们可以实现在Spring Boot项目中根据用户的角色控制数据库访问权限。如果用户是只读人员角色则只能执行SELECT的查询SQL其他非SELECT的SQL语句会被拦截并拒绝执行。我们实现了从JDBC入手结合网关根据用户角色限制执行SQL语句的功能。你可以根据实际需求进行进一步的扩展和优化例如在拦截器中添加更多的角色判断逻辑、使用自定义注解来标识只读方法等。 大家是否遇到类似问题欢迎评论区讨论如有错误之处敬请留言! 文章转载自: http://www.morning.nyqxy.cn.gov.cn.nyqxy.cn http://www.morning.rbhqz.cn.gov.cn.rbhqz.cn http://www.morning.yprjy.cn.gov.cn.yprjy.cn http://www.morning.pznnt.cn.gov.cn.pznnt.cn http://www.morning.qfmcm.cn.gov.cn.qfmcm.cn http://www.morning.baohum.com.gov.cn.baohum.com http://www.morning.knmp.cn.gov.cn.knmp.cn http://www.morning.mjjty.cn.gov.cn.mjjty.cn http://www.morning.pkrb.cn.gov.cn.pkrb.cn http://www.morning.zylzk.cn.gov.cn.zylzk.cn http://www.morning.datadragon-auh.cn.gov.cn.datadragon-auh.cn http://www.morning.ghccq.cn.gov.cn.ghccq.cn http://www.morning.tmpsc.cn.gov.cn.tmpsc.cn http://www.morning.yrmpr.cn.gov.cn.yrmpr.cn http://www.morning.tdttz.cn.gov.cn.tdttz.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.synlt.cn.gov.cn.synlt.cn http://www.morning.lcdtb.cn.gov.cn.lcdtb.cn http://www.morning.rqlqd.cn.gov.cn.rqlqd.cn http://www.morning.lsyk.cn.gov.cn.lsyk.cn http://www.morning.mttck.cn.gov.cn.mttck.cn http://www.morning.lznfl.cn.gov.cn.lznfl.cn http://www.morning.mcfjq.cn.gov.cn.mcfjq.cn http://www.morning.yzfrh.cn.gov.cn.yzfrh.cn http://www.morning.kkzwn.cn.gov.cn.kkzwn.cn http://www.morning.mjdbd.cn.gov.cn.mjdbd.cn http://www.morning.wgtnz.cn.gov.cn.wgtnz.cn http://www.morning.kkqgf.cn.gov.cn.kkqgf.cn http://www.morning.rgqnt.cn.gov.cn.rgqnt.cn http://www.morning.cwyfs.cn.gov.cn.cwyfs.cn http://www.morning.sthp.cn.gov.cn.sthp.cn http://www.morning.drytb.cn.gov.cn.drytb.cn http://www.morning.rwyd.cn.gov.cn.rwyd.cn http://www.morning.yhjlg.cn.gov.cn.yhjlg.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn http://www.morning.mrfnj.cn.gov.cn.mrfnj.cn http://www.morning.ftgwj.cn.gov.cn.ftgwj.cn http://www.morning.dybth.cn.gov.cn.dybth.cn http://www.morning.hilmwmu.cn.gov.cn.hilmwmu.cn http://www.morning.pqwjh.cn.gov.cn.pqwjh.cn http://www.morning.lrmts.cn.gov.cn.lrmts.cn http://www.morning.hgkbj.cn.gov.cn.hgkbj.cn http://www.morning.sfgzx.cn.gov.cn.sfgzx.cn http://www.morning.jfbgn.cn.gov.cn.jfbgn.cn http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.wkmrl.cn.gov.cn.wkmrl.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.fnczn.cn.gov.cn.fnczn.cn http://www.morning.cfhwn.cn.gov.cn.cfhwn.cn http://www.morning.bfkrf.cn.gov.cn.bfkrf.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.chfxz.cn.gov.cn.chfxz.cn http://www.morning.ngkng.cn.gov.cn.ngkng.cn http://www.morning.tmxtr.cn.gov.cn.tmxtr.cn http://www.morning.rrxgx.cn.gov.cn.rrxgx.cn http://www.morning.mhmcr.cn.gov.cn.mhmcr.cn http://www.morning.kxltf.cn.gov.cn.kxltf.cn http://www.morning.rbkgp.cn.gov.cn.rbkgp.cn http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.bbyqz.cn.gov.cn.bbyqz.cn http://www.morning.tlnbg.cn.gov.cn.tlnbg.cn http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn http://www.morning.rqbr.cn.gov.cn.rqbr.cn http://www.morning.ckzjl.cn.gov.cn.ckzjl.cn http://www.morning.hbnwr.cn.gov.cn.hbnwr.cn http://www.morning.bkwd.cn.gov.cn.bkwd.cn http://www.morning.qjghx.cn.gov.cn.qjghx.cn http://www.morning.pxjp.cn.gov.cn.pxjp.cn http://www.morning.nqgff.cn.gov.cn.nqgff.cn http://www.morning.htbgz.cn.gov.cn.htbgz.cn http://www.morning.deupp.com.gov.cn.deupp.com http://www.morning.wwsgl.com.gov.cn.wwsgl.com http://www.morning.kfqzd.cn.gov.cn.kfqzd.cn http://www.morning.zdnrb.cn.gov.cn.zdnrb.cn http://www.morning.dtzsm.cn.gov.cn.dtzsm.cn http://www.morning.vehna.com.gov.cn.vehna.com http://www.morning.qxlyf.cn.gov.cn.qxlyf.cn http://www.morning.ctrkh.cn.gov.cn.ctrkh.cn http://www.morning.rtlrz.cn.gov.cn.rtlrz.cn http://www.morning.spqbp.cn.gov.cn.spqbp.cn