|
| 1 | +springboot-starter-data-authorization |
| 2 | + |
| 3 | +数据权限框架 |
| 4 | + |
| 5 | +## 框架介绍 |
| 6 | + |
| 7 | +基于JDBC的拦截机制实现对数据表列与行的数据查询权限控制。 |
| 8 | + |
| 9 | +## 使用教程 |
| 10 | + |
| 11 | +1. 配置数据库的JDBC驱动地址为 `com.codingapi.springboot.authorization.jdbc.AuthorizationJdbcDriver` |
| 12 | +``` |
| 13 | +spring.datasource.driver-class-name=com.codingapi.springboot.authorization.jdbc.AuthorizationJdbcDriver |
| 14 | +spring.datasource.url=jdbc:h2:file:./test.db |
| 15 | +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect |
| 16 | +spring.jpa.hibernate.ddl-auto=create-drop |
| 17 | +spring.jpa.show-sql=true |
| 18 | +
|
| 19 | +``` |
| 20 | +2. 配置数据权限DataAuthorizationFilter的实现 |
| 21 | +接口定义 |
| 22 | +```java |
| 23 | + |
| 24 | +/** |
| 25 | + * 数据权限过滤器 |
| 26 | + */ |
| 27 | +public interface DataAuthorizationFilter { |
| 28 | + |
| 29 | + /** |
| 30 | + * 列权限过滤 |
| 31 | + * @param tableName 表名 |
| 32 | + * @param columnName 列名 |
| 33 | + * @param value 值 |
| 34 | + * @return 过滤后的值 |
| 35 | + * @param <T> T |
| 36 | + */ |
| 37 | + <T> T columnAuthorization(String tableName, String columnName,T value); |
| 38 | + |
| 39 | + /** |
| 40 | + * 行权限过滤 |
| 41 | + * @param tableName 表名 |
| 42 | + * @param tableAlias 表别名 |
| 43 | + * @return 过滤后拦截sql条件 |
| 44 | + */ |
| 45 | + Condition rowAuthorization(String tableName, String tableAlias); |
| 46 | + |
| 47 | + /** |
| 48 | + * 是否支持列权限过滤 |
| 49 | + * @param tableName 表名 |
| 50 | + * @param columnName 列名 |
| 51 | + * @param value 值 |
| 52 | + * @return 是否支持 |
| 53 | + */ |
| 54 | + boolean supportColumnAuthorization(String tableName, String columnName, Object value); |
| 55 | + |
| 56 | + /** |
| 57 | + * 是否支持行权限过滤 |
| 58 | + * @param tableName 表名 |
| 59 | + * @param tableAlias 表别名 |
| 60 | + * @return 是否支持 |
| 61 | + */ |
| 62 | + boolean supportRowAuthorization(String tableName, String tableAlias); |
| 63 | +} |
| 64 | + |
| 65 | + |
| 66 | +``` |
| 67 | +实例实现: |
| 68 | +``` |
| 69 | +
|
| 70 | +ColumnMaskContext.getInstance().addColumnMask(new IDCardMask()); |
| 71 | +ColumnMaskContext.getInstance().addColumnMask(new PhoneMask()); |
| 72 | +ColumnMaskContext.getInstance().addColumnMask(new BankCardMask()); |
| 73 | +
|
| 74 | +DataAuthorizationContext.getInstance().addDataAuthorizationFilter(new DataAuthorizationFilter() { |
| 75 | + @Override |
| 76 | + public <T> T columnAuthorization(String tableName, String columnName, T value) { |
| 77 | + return ColumnMaskContext.getInstance().mask(value); |
| 78 | + } |
| 79 | +
|
| 80 | + @Override |
| 81 | + public Condition rowAuthorization(String tableName, String tableAlias) { |
| 82 | + if (tableName.equalsIgnoreCase("t_user")) { |
| 83 | + String conditionTemplate = "%s.id > 1 "; |
| 84 | + return Condition.formatCondition(conditionTemplate, tableAlias); |
| 85 | + } |
| 86 | + return null; |
| 87 | + } |
| 88 | +
|
| 89 | + @Override |
| 90 | + public boolean supportColumnAuthorization(String tableName, String columnName, Object value) { |
| 91 | + return true; |
| 92 | + } |
| 93 | +
|
| 94 | + @Override |
| 95 | + public boolean supportRowAuthorization(String tableName, String tableAlias) { |
| 96 | + return true; |
| 97 | + } |
| 98 | +}); |
| 99 | +``` |
| 100 | + |
| 101 | +实现的拦截器,需要添加到DataAuthorizationContext.getInstance()中才可以使用。可以通过上述实例的手动模式添加, |
| 102 | +也可以通过定义DataAuthorizationFilter的@Bean方式添加,当设置为@Bean时既可以自动加入到DataAuthorizationContext.getInstance()中。 |
| 103 | + |
0 commit comments