认证及权限
Controller 权限控制
在 Controller 方法上添加 @Permission 注解实现对请求的权限控制。当 Controller 没有加上 @Permission 时,默认为要求用户登录。
@Permission 注解说明
属性名称 | 说明 |
---|---|
roles | 角色列表, 登录用户需要拥有角色权限 |
permissionLogin | 要求登录 |
permissionPublic | 公开权限 |
permissionWithin | 内部接口 |
静态资源默认不需要验证权限: /public/,/static/,/js/,/css/,/img/,/assets/
资源服务器的安全配置
配置名称 | 说明 |
---|---|
spring.security.oauth2.resourceserver.jwt.secret | JWT 秘钥 |
spring.security.oauth2.resourceserver.opaque.introspection-uri | 令牌信息接口 |
spring.security.oauth2.resourceserver.opaque.introspection-client-id | 客户端 ID |
spring.security.oauth2.resourceserver.opaque.introspection-client-secret | 客户端密码 |
资源服务器支持 JWT 和 OpaqueToken 两种格式的 Token 验证。
方法级的安全配置
使用 @Secured 注解限制拥有指定角色的登录用户允许访问
@Secured("ROLE_CUSTOMER", "ROLE_CLIENT")
public String getUsername() {
SecurityContext securityContext = SecurityContextHolder.getContext();
return securityContext.getAuthentication().getName();
}
使用 @PreAuthorize 注解限制符合 SpEL 条件的用户允许访问
@PreAuthorize("hasRole('ROLE_CUSTOMER') or hasRole('ROLE_CLIENT')")
public String getUsername() {
SecurityContext securityContext = SecurityContextHolder.getContext();
return securityContext.getAuthentication().getName();
}
使用 @PostAuthorize 注解限制符合 SpEL 条件的用户允许访问,与 @PreAuthorize 的区别是需要等待方法执行完毕再验证权限,可以通过返回结果来做条件判断。
@PostAuthorize("returnObject.username == authentication.principal.username")
public CustomUser loadUserDetail(String username) {
return userRoleRepository.loadUserByUserName(username);
}
反向角色
角色实体包含 code 和 opposite 两个属性。code 是角色编码,opposite 是是否为反向角色。
默认 opposite 是 false,为正向角色。拥有某个角色就拥有相应的权限。
当 opposite 为 true 时,为反向角色。拥有某个角色就没有相应的权限。