-
Notifications
You must be signed in to change notification settings - Fork 46
springboot starter data authorization.md
lorne edited this page Dec 6, 2024
·
3 revisions
springboot-starter-data-authorization
数据权限框架
基于JDBC的拦截机制实现对数据表列与行的数据查询权限控制。
- 配置数据库的JDBC驱动地址为
com.codingapi.springboot.authorization.jdbc.AuthorizationJdbcDriver
spring.datasource.driver-class-name=com.codingapi.springboot.authorization.jdbc.AuthorizationJdbcDriver
spring.datasource.url=jdbc:h2:file:./test.db
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.show-sql=true
- 配置数据权限DataAuthorizationFilter的实现 接口定义
/**
* 数据权限过滤器
*/
public interface DataAuthorizationFilter {
/**
* 列权限过滤
* @param tableName 表名
* @param columnName 列名
* @param value 值
* @return 过滤后的值
* @param <T> T
*/
<T> T columnAuthorization(String tableName, String columnName,T value);
/**
* 行权限过滤
* @param tableName 表名
* @param tableAlias 表别名
* @return 过滤后拦截sql条件
*/
Condition rowAuthorization(String tableName, String tableAlias);
/**
* 是否支持列权限过滤
* @param tableName 表名
* @param columnName 列名
* @param value 值
* @return 是否支持
*/
boolean supportColumnAuthorization(String tableName, String columnName, Object value);
/**
* 是否支持行权限过滤
* @param tableName 表名
* @param tableAlias 表别名
* @return 是否支持
*/
boolean supportRowAuthorization(String tableName, String tableAlias);
}
实例实现:
ColumnMaskContext.getInstance().addColumnMask(new IDCardMask());
ColumnMaskContext.getInstance().addColumnMask(new PhoneMask());
ColumnMaskContext.getInstance().addColumnMask(new BankCardMask());
DataAuthorizationContext.getInstance().addDataAuthorizationFilter(new DataAuthorizationFilter() {
@Override
public <T> T columnAuthorization(String tableName, String columnName, T value) {
return ColumnMaskContext.getInstance().mask(value);
}
@Override
public Condition rowAuthorization(String tableName, String tableAlias) {
if (tableName.equalsIgnoreCase("t_user")) {
String conditionTemplate = "%s.id > 1 ";
return Condition.formatCondition(conditionTemplate, tableAlias);
}
return null;
}
@Override
public boolean supportColumnAuthorization(String tableName, String columnName, Object value) {
return true;
}
@Override
public boolean supportRowAuthorization(String tableName, String tableAlias) {
return true;
}
});
实现的拦截器,需要添加到DataAuthorizationContext.getInstance()中才可以使用。可以通过上述实例的手动模式添加, 也可以通过定义DataAuthorizationFilter的@Bean方式添加,当设置为@Bean时既可以自动加入到DataAuthorizationContext.getInstance()中。