访问控制
保护 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 角色。
|
本页是否有帮助?
感谢您的反馈