Skip to content

Commit bac0b9d

Browse files
committed
bugfix: share permission bugfix
1 parent aabc1d4 commit bac0b9d

File tree

8 files changed

+81
-43
lines changed

8 files changed

+81
-43
lines changed

security/src/main/java/datart/security/manager/PermissionDataCache.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public void setAuthenticationInfo(SimpleAuthenticationInfo authenticationInfo) {
104104

105105
public void clear() {
106106
threadScope.clear();
107+
requestScope.clear();
107108
}
108109

109110
}

security/src/main/java/datart/security/manager/RequestScopePermissionDataCache.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,11 @@ public Boolean getCachedPermission(Permission permission) {
4848
public void setPermissionCache(Permission permission, Boolean permitted) {
4949
permissionCache.put(permission, permitted);
5050
}
51+
52+
public void clear() {
53+
authorizationInfo = null;
54+
authenticationInfo = null;
55+
currentOrg = null;
56+
permissionCache.clear();
57+
}
5158
}

security/src/main/java/datart/security/manager/shiro/ShiroSecurityManager.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public ShiroSecurityManager(MessageResolver messageResolver,
6969

7070
@Override
7171
public void login(PasswordToken token) throws RuntimeException {
72-
72+
logoutCurrent();
7373
User user = userMapper.selectByNameOrEmail(token.getSubject());
7474
if (user == null) {
7575
Exceptions.tr(BaseException.class, "login.fail");
@@ -98,6 +98,7 @@ public boolean validateUser(String username, String password) throws AuthExcepti
9898

9999
@Override
100100
public String login(String jwtToken) throws AuthException {
101+
logoutCurrent();
101102
PasswordToken passwordToken = JwtUtils.toPasswordToken(jwtToken);
102103
if (!JwtUtils.validTimeout(passwordToken)) {
103104
Exceptions.tr(AuthException.class, "login.session.timeout");
@@ -118,7 +119,9 @@ public String login(String jwtToken) throws AuthException {
118119
public void logoutCurrent() {
119120
permissionDataCache.clear();
120121
Subject subject = SecurityUtils.getSubject();
121-
subject.logout();
122+
if (subject != null) {
123+
subject.logout();
124+
}
122125
}
123126

124127
@Override
@@ -256,7 +259,7 @@ public void runAs(String userNameOrEmail) {
256259

257260
@Override
258261
public void releaseRunAs() {
259-
SecurityUtils.getSubject().releaseRunAs();
262+
logoutCurrent();
260263
}
261264

262265

server/src/main/java/datart/server/base/params/ShareAuthorizedToken.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
@Data
2828
public class ShareAuthorizedToken {
2929

30+
private String createBy;
31+
3032
private String permissionBy;
3133

3234
@NotNull

server/src/main/java/datart/server/config/interceptor/LoginInterceptor.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import datart.core.base.annotations.SkipLogin;
2222
import datart.core.base.consts.Const;
2323
import datart.core.base.exception.Exceptions;
24-
import datart.core.common.MessageResolver;
2524
import datart.core.common.RequestContext;
2625
import datart.security.exception.AuthException;
2726
import datart.security.manager.DatartSecurityManager;
@@ -48,17 +47,26 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
4847
if (!(handler instanceof HandlerMethod)) {
4948
return true;
5049
}
50+
Exception loginException = null;
51+
String token = request.getHeader(Const.TOKEN);
52+
if (token != null) {
53+
try {
54+
token = securityManager.login(token);
55+
response.setHeader(Const.TOKEN, token);
56+
return securityManager.isAuthenticated();
57+
} catch (Exception e) {
58+
loginException = e;
59+
}
60+
}
5161
HandlerMethod handlerMethod = (HandlerMethod) handler;
5262
if (handlerMethod.getMethodAnnotation(SkipLogin.class) != null) {
5363
return true;
5464
}
55-
String token = request.getHeader(Const.TOKEN);
56-
if (token == null) {
57-
Exceptions.tr(AuthException.class, "login.not-login");
65+
if (loginException != null) {
66+
throw loginException;
5867
}
59-
token = securityManager.login(token);
60-
response.setHeader(Const.TOKEN, token);
61-
return securityManager.isAuthenticated();
68+
Exceptions.tr(AuthException.class, "login.not-login");
69+
return false;
6270
}
6371

6472
@Override

server/src/main/java/datart/server/controller/ShareController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,11 @@ public ResponseData<ShareToken> create(@Validated @RequestBody ShareCreateParam
5858

5959
@ApiOperation(value = "update a share")
6060
@PutMapping(value = "{shareId}")
61-
public ResponseData<Boolean> update(
61+
public ResponseData<ShareInfo> update(
6262
@PathVariable String shareId,
6363
@Validated @RequestBody ShareUpdateParam updateParam) {
6464
updateParam.setId(shareId);
65-
return ResponseData.success(shareService.update(updateParam));
65+
return ResponseData.success(shareService.updateShare(updateParam));
6666
}
6767

6868
@ApiOperation(value = "delete a share")

server/src/main/java/datart/server/service/ShareService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ public interface ShareService extends BaseCRUDService<Share, ShareMapperExt> {
1515

1616
ShareToken createShare(String shareUser, ShareCreateParam createParam);
1717

18+
ShareInfo updateShare(ShareUpdateParam updateParam);
19+
1820
List<ShareInfo> listShare(String vizId);
1921

2022
ShareVizDetail getShareViz(ShareToken shareToken);

server/src/main/java/datart/server/service/impl/ShareServiceImpl.java

Lines changed: 46 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,49 @@ public ShareToken createShare(String shareUser, ShareCreateParam createParam) {
149149
return shareToken;
150150
}
151151

152+
@Override
153+
public ShareInfo updateShare(ShareUpdateParam updateParam) {
154+
Share retrieve = retrieve(updateParam.getId());
155+
requirePermission(retrieve, Const.MANAGE);
156+
157+
Share update = new Share();
158+
BeanUtils.copyProperties(updateParam, update);
159+
if (updateParam.getRowPermissionBy() != null) {
160+
update.setRowPermissionBy(updateParam.getRowPermissionBy().name());
161+
} else {
162+
update.setRowPermissionBy(ShareRowPermissionBy.CREATOR.name());
163+
}
164+
update.setAuthenticationMode(updateParam.getAuthenticationMode().name());
165+
166+
Set<String> roleIds = new HashSet<>();
167+
if (!CollectionUtils.isEmpty(updateParam.getRoles())) {
168+
for (String role : updateParam.getRoles()) {
169+
roleIds.add('r' + role);
170+
}
171+
}
172+
if (!CollectionUtils.isEmpty(updateParam.getUsers())) {
173+
for (String user : updateParam.getUsers()) {
174+
Role role = roleService.getPerUserRole(retrieve.getOrgId(), user);
175+
roleIds.add('u' + role.getId());
176+
}
177+
}
178+
179+
if (ShareAuthenticationMode.CODE.equals(updateParam.getAuthenticationMode())) {
180+
update.setAuthenticationCode(SecurityUtils.randomPassword());
181+
}
182+
183+
update.setRoles(JSON.toJSONString(roleIds));
184+
update.setUpdateBy(getCurrentUser().getId());
185+
update.setUpdateTime(new Date());
186+
shareMapper.updateByPrimaryKeySelective(update);
187+
188+
ShareInfo shareInfo = new ShareInfo();
189+
BeanUtils.copyProperties(update, shareInfo);
190+
shareInfo.setId(update.getId());
191+
shareInfo.setAuthenticationMode(updateParam.getAuthenticationMode());
192+
return shareInfo;
193+
}
194+
152195
@Override
153196
public List<ShareInfo> listShare(String vizId) {
154197
List<Share> shares = shareMapper.selectByViz(vizId);
@@ -246,7 +289,9 @@ public Download download(ShareToken shareToken, String downloadId) {
246289

247290
private ShareVizDetail getVizDetail(ShareAuthorizedToken authorizedToken) {
248291

249-
getSecurityManager().runAs(authorizedToken.getPermissionBy());
292+
User user = userMapperExt.selectByPrimaryKey(authorizedToken.getCreateBy());
293+
294+
getSecurityManager().runAs(user.getUsername());
250295

251296
ShareVizDetail shareVizDetail = new ShareVizDetail();
252297

@@ -304,35 +349,6 @@ private ShareVizDetail getVizDetail(ShareAuthorizedToken authorizedToken) {
304349
return shareVizDetail;
305350
}
306351

307-
@Override
308-
public boolean update(BaseUpdateParam updateParam) {
309-
Share retrieve = retrieve(updateParam.getId());
310-
requirePermission(retrieve, Const.MANAGE);
311-
312-
ShareUpdateParam shareUpdateParam = (ShareUpdateParam) updateParam;
313-
Share update = new Share();
314-
BeanUtils.copyProperties(shareUpdateParam, update);
315-
update.setRowPermissionBy(shareUpdateParam.getRowPermissionBy().name());
316-
update.setAuthenticationMode(shareUpdateParam.getAuthenticationMode().name());
317-
318-
Set<String> roleIds = new HashSet<>();
319-
if (!CollectionUtils.isEmpty(shareUpdateParam.getRoles())) {
320-
for (String role : shareUpdateParam.getRoles()) {
321-
roleIds.add('r' + role);
322-
}
323-
}
324-
if (!CollectionUtils.isEmpty(shareUpdateParam.getUsers())) {
325-
for (String user : shareUpdateParam.getUsers()) {
326-
Role role = roleService.getPerUserRole(retrieve.getOrgId(), user);
327-
roleIds.add('u' + role.getId());
328-
}
329-
}
330-
update.setRoles(JSON.toJSONString(roleIds));
331-
update.setUpdateBy(getCurrentUser().getId());
332-
update.setUpdateTime(new Date());
333-
return 1 == shareMapper.updateByPrimaryKeySelective(update);
334-
}
335-
336352
private ShareAuthorizedToken validateExecutePermission(String authorizedToken, ViewExecuteParam executeParam) {
337353
if (StringUtils.isBlank(authorizedToken)) {
338354
Exceptions.tr(PermissionDeniedException.class, "message.provider.execute.permission.denied");
@@ -361,7 +377,6 @@ private void authenticationShare(Share share, ShareToken shareToken) {
361377
}
362378
break;
363379
case LOGIN:
364-
365380
// 验证用户是否存在
366381
User user = null;
367382
if (StringUtils.isBlank(shareToken.getUsername())) {

0 commit comments

Comments
 (0)