-
Notifications
You must be signed in to change notification settings - Fork 1
阿东 edited this page May 1, 2020
·
2 revisions
@Certification (判断权限和角色)
参数名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
permissions | String[] | 权限组 | 空 |
plogical | Certification.Logical | 关系 Certification.Logical.AND 并且 Certification.Logical.OR 或 |
Certification.Logical.AND |
roles | String[] | 角色组 | 空 |
rlogical | Certification.Logical | 关系 Certification.Logical.AND 并且 Certification.Logical.OR 或 |
Certification.Logical.AND |
@Sightseer(游客:不检查用户token)
参数名称 | 类型 | 说明 | 默认值 |
---|
相关配置
配置名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
spring.security.manager.request.enabled | boolean | 开启权限注解 | true |
spring.security.manager.request.token | String | 请求token的key,在header中获取 | token |
用法
-
1.实现 DataSource 接口,自定义权限和用户token验证,DefaultDataSource为默认实现的用例,可以参考 建议写一个service
-
2.设置spring.security.manager.request.enabled为true,默认为true
-
3.编写一个controller(下面的接口如果没有合格token是无法访问)
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
public User user(){
return new User();
}
}
- 4.使用postman请求 http://localhost:8080/test/user 提示如下
{
"timestamp": "2020-04-30T14:53:06.963+0000",
"status": 500,
"error": "Internal Server Error",
"message": "token invalid",
"path": "/test/user"
}
- 5.自定义异常响应信息如下
@RestControllerAdvice
public class Exceptions {
@ExceptionHandler(TokenException.class)
public String token(TokenException exception){
return exception.getMessage();
}
}
- 6.想对接口设置访问权限或者访问角色,可以使用@Certification注解,如下要求用户必须同时拥有admin和user角色,同时权限必须有select和update
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
@Certification(roles = {"admin","user"},permissions = {"select","update"})
public User user(){
return new User();
}
}
- 7.如果只想用户角色满足一个即可和权限满足一个就行,可以设置如下Certification.Logical.AND表示并且 Certification.Logical.OR表示或者
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
@Certification(roles = {"admin","user"},rlogical = Certification.Logical.OR,permissions = {"select","update"},plogical = Certification.Logical.OR)
public User user(){
return new User();
}
}
- 8.角色和权限支持ant风格匹配
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
@Certification(roles = {"admin:*","user:test:*"},rlogical = Certification.Logical.OR,permissions = {"select:user:*","update:*"},plogical = Certification.Logical.OR)
public User user(){
return new User();
}
}
- 9.想对TestController下面所有的mapper设置权限和角色如下
@Controller
@RequestMapping("test")
@Certification(roles = {"admin","user"},permissions = {"select","update"})
public class TestController {
@PostMapping("user")
public User user(){
return new User();
}
}
- 10.如果你想对某个接口不验证token(@Sightseer 表示不验证token,只能在controller层使用)
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
@Sightseer
public User user(){
return new User();
}
}
- 11.@Certification和@Sightseer可以在方法和类上面使用,优先级如下
优先级:方法@Certification > 方法@Sightseer > 类@Certification > 类@Sightseer
- 12.忽略指定的url(同样也支持ant风格匹配)
spring.security.manager.request.ignore-url="*.js","*.png","*.jpg"
- 13.获取当前登录的用户信息
@Controller
@RequestMapping("test")
public class TestController {
@PostMapping("user")
public User user(){
//获取登录者的终端
Terminal terminal = Terminal.get();
//获取登录信息
User user = terminal.getUser();
return user;
}
}
对资源权限控制,比如图片,excel,或者部分展示数据,都可以看做资源,如果想给项目以外的人访问,还要限定只能今天访问,这样的控制在用户权限的体系难以实现,现在只需要在controller加上@Resources注解即可实现对资源的控制
@Resources (对资源的授权)
参数名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
permissions | String[] | 权限组 | 空 |
plogical | Certification.Logical | 关系 Certification.Logical.AND 并且 Certification.Logical.OR 或 |
Certification.Logical.AND |
相关配置
配置名称 | 类型 | 说明 | 默认值 |
---|---|---|---|
spring.security.manager.request.resources.enabled | boolean | 开启对资源的权限控制 | false |
spring.security.manager.request.resources.mode | JwtAlgorithm | 加密方式(必须填写) | 空 |
spring.security.manager.request.resources.key | string | 对称加密方式的秘钥 | 空 |
spring.security.manager.request.resources.private-key | string | 非对称加密的私钥路径 | 空 |
spring.security.manager.request.resources.public-key | string | 非对称加密的公钥路径 | 空 |
spring.security.manager.request.resources.resources | string | 获取标识的key,默认获取header的resources如果为空获取param中的resources | resources |
用法
- 1.配置相关的参数,这里使用对称加密(秘钥一定好保存好)
spring.security.manager.request.resources.enabled=true
spring.security.manager.request.resources.mode=hmac384
spring.security.manager.request.resources.key=123456ui8765432
spring.security.manager.request.resources.resources=resources
- 2.生成有效的令牌
@Controller
@RequestMapping("test")
public class TestController {
@Autowired
private ResourcesJwtProcessor resourcesJwtProcessor;
@PostMapping("get")
@ResponseBody
public String getData(){
User user = new User();
user.setId("1");
Date now = new Date();
Date hours = DateUtils.setHours(now, 2);
//设置令牌有效时间为2小时,并给与一个"query"权限
return defaultResourcesJwtProcessor.create(user,null,null,hours,null,null,"query");
}
}
- 2.在conllect中加上@Resources注解即可
@GetMapping("query")
@ResponseBody
@Resources(permissions = {"query"})
public String query(){
return "ok";
}