认证及权限

Controller 权限控制

在 Controller 方法上添加 @Permission 注解实现对请求的权限控制。当 Controller 没有加上 @Permission 时,默认为要求用户登录。

@Permission 注解说明

属性名称说明
roles角色列表, 登录用户需要拥有角色权限
permissionLogin要求登录
permissionPublic公开权限
permissionWithin内部接口

静态资源默认不需要验证权限: /public/,/static/,/js/,/css/,/img/,/assets/

资源服务器的安全配置

配置名称说明
spring.security.oauth2.resourceserver.jwt.secretJWT 秘钥
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 时,为反向角色。拥有某个角色就没有相应的权限。