访问控制

保护 REST 端点

对 REST API 端点的访问可以使用 access token 进行保护。授权服务(Authorization Server)扩展组件可以用来获取 access token。参阅 授权服务 扩展组件的文档了解详情。

匿名访问

某些 REST API 端点可以作为无需认证的接口开放,使用 Jmix 的匿名访问功能。此时,API 请求是通过 anonymous 用户进行,这个用户是 Jmix 应用默认配置的。

对于没有使用 Authentication 请求头调用任何安全端点,都会使用 anonymous 用户进行认证。

如需添加匿名访问端点的白名单,可以使用 jmix.rest.anonymous-url-patterns 应用程序属性配置,URL pattern 以逗号隔开。例如:

jmix.rest.anonymous-url-patterns = \
  /rest/services/productService/getProductInformation,\
  /rest/entities/Product,\
  /rest/entities/Product/*

上面示例中配置的最后一个 pattern 是必须的,因为在更新或删除 Product 实体时,URL 还带有 id 部分。

配置完成后,可以不使用 Authentication 请求头与 ProductService 进行交互:

GetProductInformation Request
GET {{baseRestUrl}}
         /services
         /productService
         /getProductInformation
         ?productId=123
# Authorization: not set

这个请求会成功拿到服务的返回内容:

HTTP/1.1 200
{
  "name": "Apple iPhone",
  "productId": "123",
  "price": 499.99
}

如需为某些 实体 端点提供匿名访问,请确保 anonymous 用户有访问这些实体的权限。可以创建一个 资源角色 然后分配给 anonymous 用户,代码中使用 DatabaseUserRepository.initAnonymousUser() 方法。示例:

@ResourceRole(name = "AnonymousRestRole", code = AnonymousRestRole.CODE, scope = "API")
public interface AnonymousRestRole {

    String CODE = "anonymous-rest-role";

    @EntityAttributePolicy(entityClass = Product.class,
        attributes = "*",
        action = EntityAttributePolicyAction.MODIFY)
    @EntityPolicy(entityClass = Product.class,
        actions = {EntityPolicyAction.READ, EntityPolicyAction.UPDATE})
    void product();
}
@Primary
@Component("UserRepository")
public class DatabaseUserRepository extends AbstractDatabaseUserRepository<User> {
    // ...

    @Override
    protected void initAnonymousUser(User anonymousUser) {
        Collection<GrantedAuthority> authorities = getGrantedAuthoritiesBuilder()
                .addResourceRole(AnonymousRestRole.CODE)
                .build();
        anonymousUser.setAuthorities(authorities);
    }
}
匿名访问功能 不需要 anonymous 用户有 rest-minimal 角色。

预定义角色

REST: minimal accessrest-minimal):支持用户使用 API 与应用程序交互。