mirror of
https://github.com/go-admin-team/go-admin.git
synced 2026-09-21 18:20:50 +00:00
Logging in on a deployment with enabledp: true ends on the login page. The login itself succeeds - sys_login_log records it - and then /api/v1/getinfo answers 401 "登录失败", which sends the browser straight back. The query behind it reads: SELECT * FROM sys_user WHERE sys_user.user_id = 1 AND 1 = 0 AND deleted_at = 0 The 1 = 0 comes from the data-permission scope. GetInfo asked for a permission with GetPermissionFromContext, but the group this route sits in installs only the JWT middleware - no PermissionAction - so nothing ever put one in the context and what came back was the zero value. An unset scope is not one of the five recognised ones, and since unknown scopes began failing closed rather than silently matching every row, that zero value now means "match nothing". The route was working by accident before, and only on deployments that enable data permissions: the repository default is enabledp: false, where Permission returns the query untouched. That is why the local suite and CI are both green and the demo site is not. Two different faults, so two different fixes: /getinfo reads the caller's own row - the id comes from the token. A data scope answers "whose rows may this user see", so there is nothing left for it to restrict, and applying one is not a stricter version of the query but a broken one: DataScopeSelf matches on create_by, and an account is created by whoever added it, so a scoped self-read would 401 every user who did not create their own account. It now goes through GetSelf, which does no scoping at all - which is how GetProfile has always read the same row. /sys-api is the opposite case. Its three handlers do read the permission, and they are listing and updating other people's rows, so the middleware belongs there and was simply missing. Added. Those four endpoints were found by checking every handler that reads the permission against the group it is registered on. The check reports four before this commit and none after. No test. Both paths need a *gorm.DB with sys_user and sys_role rows before they reach the line that matters, and this repository's CI has no database - `make build` is CGO_ENABLED=0 with no sqlite tag. What can be tested is the shape of the mistake rather than its effect, and that belongs in tools/checksilent as a rule of its own; it is not in this commit because a site that cannot be logged into should not wait for it.