-
Notifications
You must be signed in to change notification settings - Fork 3k
autz
zhōuhào edited this page Sep 28, 2017
·
10 revisions
hsweb除了提供了基本的RDAC权限控制外,还提供了数据权限控制,并且可以灵活拓展.
默认的权限实现hsweb-authorization-basic
基于aop进行控制,将会拦截所有注解Controller的类的方法
//第一种方式: 使用参数注入的方式获取
@RequestMapping
public ResponseMessage<String> getLoginUserId(Authentication auth){
return ok(auth.getUser().getId());
}
//第一种方式: 使用静态方法获取
@RequestMapping
public ResponseMessage<String> getLoginUserId(){
Authentication auth=Authentication.current().orElseThrow(UnAuthorizedException::new);
return ok(auth.getUser().getId());
}
更多Authentication
的细节,请查看源代码
hsweb默认提供了使用注解来声明权限控制,可以在Controller类以及方法上进行注解,如果类和方法上同时存在注解,则将其合并.
//第一种方式: 使用参数注入的方式获取
@RequestMapping("/users")
@Authorize(permission="user",action="query") //代表调用此接口时,需要拥有user的query操作的权限
@RequiresDataAccess //声明要进行数据权限控制
public ResponseMessage<PagerResult> queryUser(QueryParamEntity param){
return ok(userService.selectPager(param));
}
注解的更多属性,请查看源代码
除了使用注解外,还可以通过自定义的方式,告诉hsweb哪些请求需要进行权限控制以及如何控制.
实现AopMethodAuthorizeDefinitionCustomizerParser
接口,并注入给spring
,在方法被拦截到时,会首先调用此接口获取AuthorizeDefinition
,如果返回null
或者EmptyAuthorizeDefinition
则将不进行权限控制.注意: 通过AopMethodAuthorizeDefinitionCustomizerParser
获取的配置将不会进行缓存,需要自行实现.
- 将数据库中的配置转为权限框架需要的配置接口
实现接口:DataAccessConfigConvert
例如:
@Component
public class MyDataAccessConfigConvert implements DataAccessConfigConvert {
@Override
public boolean isSupport(String type, String action, String config) {
return "custom-access".equals(type);
}
@Override
public DataAccessConfig convert(String type, String action, String config) {
//构造配置实例
MyDataAccessConfig myConfig = JSON.parseObject(config, MyDataAccessConfig.class);
myConfig.setAction(action);
myConfig.setType(type);
return myConfig;
}
}
- 创建
DataAccessHandler
用于控制权限
@Component
public class CustomDataAccessHandler implements DataAccessHandler {
@Override
public boolean isSupport(DataAccessConfig access) {
return access instanceof MyDataAccessConfig;
}
@Override
public boolean handle(DataAccessConfig access, AuthorizingContext context) {
MyDataAccessConfig custom = ((MyDataAccessConfig) access);
//可以通过context中的属性,进行数据权限操作,如修改请求的参数等。
//返回true 认证通过
return true;
}
}
hsweb 默认提供了授权的http接口:authorize/login
,使用Post提交 username
,password
进行登录授权。 授权过程中,会通过触发事件的方式来实现自定义的操作,如:用户名密码解密,验证码验证等操作.
类名 | 说明 |
---|---|
AuthorizationDecodeEvent |
接收到请求参数时 |
AuthorizationBeforeEvent |
验证密码前触发 |
AuthorizationFailedEvent |
授权验证失败时触发 |
AuthorizationSuccessEvent |
授权成功时触发 |
AuthorizationExitEvent |
用户注销时触发 |
例如:
@Component
public class CustomAuthorizationSuccessListener implements AuthorizationListener<AuthorizationSuccessEvent>{
@Override
public void on(AuthorizationSuccessEvent event) {
Authentication authentication=event.getAuthentication();
//....
System.out.println(authentication.getUser().getName()+"登录啦");
}
}