hsweb提供了一个灵活的权限控制,设置方式,实现了多维度,可自定义的RBAC和数据权限控制.
以下例子在快速入门的基础上建立
- 引入依赖
<!--权限控制-->
<dependency>
<groupId>org.hswebframework.web</groupId>
<artifactId>hsweb-authorization-basic</artifactId>
<version>${hsweb.framework.version}</version>
</dependency>
- 在启动类上注解:
@EnableAopAuthorize
@SpringBootApplication
@MapperScan(basePackages = "com.mycompany.dao", markerInterface = Dao.class)
@EnableAopAuthorize //开启AOP权限控制
public class MyProjectApplication {
public static void main(String[] args) {
SpringApplication.run(MyProjectApplication.class, args);
}
}
- 在
application.yml
中加入配置
hsweb:
users:
admin:
name: 超级管理员
username: admin
password: admin
roles: #用户的角色
- id: admin
name: 管理员
- id: user
name: 用户
permissions: # 用户的权限
- id: test #权限标识,可以理解为资源
actions: query,get,update,delete #用户持有对该资源的操作
dataAccesses: # 数据权限配置,此配置表示在对test进行query操作的时候,不能查询password和salt字段
- action: query
type: DENY_FIELDS
fields:
- password
- salt
- 在
TestController
中加入权限控制,在类上注解@Authorize(permission = "test")
@RestController
@RequestMapping("/test")
@Authorize(permission = "test")
public class TestController implements SimpleGenericEntityController<TestEntity, String, QueryParamEntity> {
@Autowired
TestService testService;
@Override
public CrudService<TestEntity, String> getService() {
return testService;
}
}
- 启动服务,使用postman访问:
GET http://localhost:8080/test
.返回
{
"message": "用户未登录",
"result": {
"index": 3,
"text": "用户未登录",
"value": "expired",
"mask": 8
},
"status": 401,
"timestamp": 1537342065201
}
- 调用登录接口登录
POST http://localhost:8080/authorize/login
username=admin&password=admin
返回:
{
"result": {
"userId": "admin"
},
"status": 200,
"timestamp": 1537342179265
}
7.再次访问GET http://localhost:8080/test
.返回正常数据.
通过接口GET http://localhost:8080/authorize/me
可查看当前登录用户的权限信息.
通过接口GET http://localhost:8080/authorize/exit
可退出登录.
可通过在Controller方法参数中直接注入org.hswebframework.web.authorization.Authentication
接口获取当前登录用户权限信息.
也可以通过静态方法方式获取:
Authentication authentication= Authentication.current().orElseThrow(UnAuthorizedException::new);
可调用此接口的方法进行用户权限获取以及判断:
//用户是否可以进行test的query操作
authentication.hasPermission("test", "query");
//用户是否拥有admin角色
authentication.hasRole("admin");
//获取用户在进行test的query操作时,不能操作的字段列表
Set<String> denyFiledList= authentication.getPermission("test")
.map(permission->permission.findDenyFields("query"))
.orElseThrow(AccessDenyException::new);
//获取用户在进行test的query操作时,能访问部门(department)(含子部门(children))数据的范围
Set<Object> canQueryDepartment= authentication.getPermission("test")
.map(permission->permission.findScope("query","department","children"))
.orElseThrow(AccessDenyException::new);
在上述说明中是通过配置文件来进行用户以及权限配置的,在hsweb-system模块中还提供了使用数据库来来进行更灵活的权限信息配置
默认使用sessionId
来作为用户的token
,你也可以通过拓展来实现自定义的token
策略: