mirror of https://github.com/halo-dev/halo
feat: add more role templates (#2488)
#### What type of PR is this? /kind improvement /area core /milestone 2.0 #### What this PR does / why we need it: 补充角色模板 #### Which issue(s) this PR fixes: Fixes #2342 https://github.com/halo-dev/halo/issues/2391 #### Special notes for your reviewer: /cc @halo-dev/sig-halo #### Does this PR introduce a user-facing change? ```release-note None ```pull/2499/head
parent
7de944f61d
commit
3995adba32
|
@ -143,8 +143,6 @@ public class Role extends AbstractExtension {
|
||||||
|
|
||||||
String[] verbs;
|
String[] verbs;
|
||||||
|
|
||||||
String pluginName;
|
|
||||||
|
|
||||||
public Builder apiGroups(String... apiGroups) {
|
public Builder apiGroups(String... apiGroups) {
|
||||||
this.apiGroups = apiGroups;
|
this.apiGroups = apiGroups;
|
||||||
return this;
|
return this;
|
||||||
|
|
|
@ -59,7 +59,7 @@ public class AttachmentEndpoint implements CustomEndpoint {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public RouterFunction<ServerResponse> endpoint() {
|
public RouterFunction<ServerResponse> endpoint() {
|
||||||
var tag = "storage.halo.run/v1alpha1/Attachment";
|
var tag = "api.console.halo.run/v1alpha1/Attachment";
|
||||||
return SpringdocRouteBuilder.route()
|
return SpringdocRouteBuilder.route()
|
||||||
.POST("/attachments/upload", contentType(MediaType.MULTIPART_FORM_DATA), this::upload,
|
.POST("/attachments/upload", contentType(MediaType.MULTIPART_FORM_DATA), this::upload,
|
||||||
builder -> builder
|
builder -> builder
|
||||||
|
|
|
@ -110,7 +110,8 @@ public class PostReconciler implements Reconciler<Reconciler.Request> {
|
||||||
}
|
}
|
||||||
if (excerpt.getAutoGenerate()) {
|
if (excerpt.getAutoGenerate()) {
|
||||||
contentService.getContent(spec.getReleaseSnapshot())
|
contentService.getContent(spec.getReleaseSnapshot())
|
||||||
.subscribe(content -> {
|
.blockOptional()
|
||||||
|
.ifPresent(content -> {
|
||||||
String contentRevised = content.content();
|
String contentRevised = content.content();
|
||||||
status.setExcerpt(getExcerpt(contentRevised));
|
status.setExcerpt(getExcerpt(contentRevised));
|
||||||
});
|
});
|
||||||
|
|
|
@ -74,7 +74,8 @@ public class DefaultRoleService implements RoleService {
|
||||||
}
|
}
|
||||||
visited.add(roleName);
|
visited.add(roleName);
|
||||||
extensionClient.fetch(Role.class, roleName)
|
extensionClient.fetch(Role.class, roleName)
|
||||||
.subscribe(role -> {
|
.blockOptional()
|
||||||
|
.ifPresent(role -> {
|
||||||
result.add(role);
|
result.add(role);
|
||||||
Map<String, String> annotations = role.getMetadata().getAnnotations();
|
Map<String, String> annotations = role.getMetadata().getAnnotations();
|
||||||
if (annotations != null) {
|
if (annotations != null) {
|
||||||
|
|
|
@ -178,6 +178,12 @@ public class RequestInfoFactory {
|
||||||
requestInfo.resource = requestInfo.parts[0];
|
requestInfo.resource = requestInfo.parts[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// has name and no subresource but verb=create, then this is a non-resource request
|
||||||
|
if (StringUtils.isNotBlank(requestInfo.name) && StringUtils.isBlank(requestInfo.subresource)
|
||||||
|
&& "create".equals(requestInfo.verb)) {
|
||||||
|
requestInfo.isResourceRequest = false;
|
||||||
|
}
|
||||||
|
|
||||||
// if there's no name on the request and we thought it was a get before, then the actual
|
// if there's no name on the request and we thought it was a get before, then the actual
|
||||||
// verb is a list or a watch
|
// verb is a list or a watch
|
||||||
if (requestInfo.name.length() == 0 && "get".equals(requestInfo.verb)) {
|
if (requestInfo.name.length() == 0 && "get".equals(requestInfo.verb)) {
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-attachments
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-attachments\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "Attachments Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Attachment Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:attachments:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "storage.halo.run" ]
|
||||||
|
resources: [ "attachments" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "attachments" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- nonResourceURLs: [ "/apis/api.console.halo.run/attachments/upload" ]
|
||||||
|
verbs: [ "post" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-attachments
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/module: "Attachments Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Attachment View"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:attachments:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "storage.halo.run" ]
|
||||||
|
resources: [ "attachments" ]
|
||||||
|
verbs: [ "get", "list" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "attachments" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,25 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-categories
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-categories\" ]"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "categories" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-categories
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "categories" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,38 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-comments
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-comments\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "Comments Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Comment Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:comments:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "comments", "replies" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "comments", "comments/reply", "replies" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-comments
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/module: "Comments Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Comment View"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:comments:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "comments", "replies" ]
|
||||||
|
verbs: [ "get", "list" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "comments", "comments/reply", "replies" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,32 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-menus
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-menus\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "Menus Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Menu Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:menus:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "" ]
|
||||||
|
resources: [ "menus", "menuitems" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-menus
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/module: "Menus Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Menu Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:menus:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "" ]
|
||||||
|
resources: [ "menus", "menuitems" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,41 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-posts
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: |
|
||||||
|
[ "role-template-view-posts", "role-template-manage-snaphosts", "role-template-manage-tags", "role-template-manage-categories" ]
|
||||||
|
rbac.authorization.halo.run/module: "Posts Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Post Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:posts:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "posts" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "posts", "posts/publish", "contents", "contents/publish" ]
|
||||||
|
verbs: [ "create", "patch", "update", "delete", "deletecollection" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-posts
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: |
|
||||||
|
[ "role-template-view-snaphosts", "role-template-view-tags", "role-template-view-categories" ]
|
||||||
|
rbac.authorization.halo.run/module: "Posts Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Post View"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:posts:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "posts" ]
|
||||||
|
verbs: [ "get", "list" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "posts", "contents" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,39 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-singlepages
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-singlepages\", \"role-template-manage-snaphosts\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "SinglePages Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "SinglePage Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:singlepages:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "singlepages" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "singlepages", "singlepages/publish", "contents", "contents/publish" ]
|
||||||
|
verbs: [ "create", "patch", "update", "delete", "deletecollection" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-singlepages
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-snaphosts\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "SinglePages Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "SinglePage View"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:singlepages:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "singlepages" ]
|
||||||
|
verbs: [ "get", "list" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "singlepages", "contents" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,25 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-snaphosts
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-snaphosts\" ]"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "snaphosts" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-snaphosts
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "snaphosts" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,25 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-tags
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-tags\" ]"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "tags" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-tags
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
halo.run/hidden: "true"
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "content.halo.run" ]
|
||||||
|
resources: [ "tags" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,40 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-manage-themes
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/dependencies: "[ \"role-template-view-themes\" ]"
|
||||||
|
rbac.authorization.halo.run/module: "Themes Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Theme Manage"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:themes:manage"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "theme.halo.run" ]
|
||||||
|
resources: [ "themes" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "themes", "themes/reload-setting" ]
|
||||||
|
verbs: [ "*" ]
|
||||||
|
- nonResourceURLs: [ "/apis/api.console.halo.run/themes/install" ]
|
||||||
|
verbs: [ "post" ]
|
||||||
|
---
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: role-template-view-themes
|
||||||
|
labels:
|
||||||
|
halo.run/role-template: "true"
|
||||||
|
annotations:
|
||||||
|
rbac.authorization.halo.run/module: "Themes Management"
|
||||||
|
rbac.authorization.halo.run/display-name: "Theme View"
|
||||||
|
rbac.authorization.halo.run/ui-permissions: |
|
||||||
|
["system:themes:view"]
|
||||||
|
rules:
|
||||||
|
- apiGroups: [ "theme.halo.run" ]
|
||||||
|
resources: [ "themes" ]
|
||||||
|
verbs: [ "get", "list" ]
|
||||||
|
- apiGroups: [ "api.console.halo.run" ]
|
||||||
|
resources: [ "singlepages" ]
|
||||||
|
verbs: [ "get", "list" ]
|
|
@ -0,0 +1,5 @@
|
||||||
|
apiVersion: v1alpha1
|
||||||
|
kind: "Role"
|
||||||
|
metadata:
|
||||||
|
name: guest
|
||||||
|
rules: [ ]
|
|
@ -168,6 +168,21 @@ public class RequestInfoResolverTest {
|
||||||
String.format("%s: expected non-resource request", errorCase.desc));
|
String.format("%s: expected non-resource request", errorCase.desc));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<ErrorCases> postCases =
|
||||||
|
List.of(new ErrorCases("api resource has name and no subresource but post",
|
||||||
|
"/api/version/themes/install"),
|
||||||
|
new ErrorCases("apis resource has name and no subresource but post",
|
||||||
|
"/apis/api.halo.run/v1alpha1/themes/install"));
|
||||||
|
for (ErrorCases errorCase : postCases) {
|
||||||
|
var request =
|
||||||
|
method(HttpMethod.POST, errorCase.url).build();
|
||||||
|
RequestInfo apiRequestInfo = RequestInfoFactory.INSTANCE.newRequestInfo(request);
|
||||||
|
if (apiRequestInfo.isResourceRequest()) {
|
||||||
|
throw new RuntimeException(
|
||||||
|
String.format("%s: expected non-resource request", errorCase.desc));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Reference in New Issue