Skip to content

Commit 6efe5a0

Browse files
SteDev2enricovianello
authored andcommitted
Add new isClientOwner preAuthorize method
1 parent 8012d98 commit 6efe5a0

File tree

5 files changed

+35
-10
lines changed

5 files changed

+35
-10
lines changed

iam-login-service/src/main/java/it/infn/mw/iam/api/client/management/ClientManagementAPIController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ public void disableClient(@PathVariable String clientId) {
159159

160160
@PostMapping("/{clientId}/secret")
161161
@ResponseStatus(CREATED)
162-
@PreAuthorize("#iam.hasScope('iam:admin.write') or #iam.hasDashboardRole('ROLE_ADMIN')")
162+
@PreAuthorize("#iam.hasScope('iam:admin.write') or #iam.hasDashboardRole('ROLE_ADMIN') or #iam.isClientOwner('clientId')")
163163
public RegisteredClientDTO rotateClientSecret(@PathVariable String clientId) {
164164
return managementService.generateNewClientSecret(clientId);
165165
}

iam-login-service/src/main/java/it/infn/mw/iam/core/expression/IamMethodSecurityExpressionHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.stereotype.Component;
2323

2424
import it.infn.mw.iam.api.account.AccountUtils;
25+
import it.infn.mw.iam.api.client.service.DefaultClientService;
2526
import it.infn.mw.iam.api.requests.GroupRequestUtils;
2627
import it.infn.mw.iam.core.userinfo.OAuth2AuthenticationScopeResolver;
2728

@@ -30,12 +31,15 @@
3031
public class IamMethodSecurityExpressionHandler extends OAuth2MethodSecurityExpressionHandler {
3132

3233
private final AccountUtils accountUtils;
34+
private final DefaultClientService clientService;
3335
private final GroupRequestUtils groupRequestUtils;
3436
private final OAuth2AuthenticationScopeResolver scopeResolver;
3537

3638
public IamMethodSecurityExpressionHandler(AccountUtils accountUtils,
37-
GroupRequestUtils groupRequestUtils, OAuth2AuthenticationScopeResolver scopeResolver) {
39+
DefaultClientService clientService, GroupRequestUtils groupRequestUtils,
40+
OAuth2AuthenticationScopeResolver scopeResolver) {
3841
this.accountUtils = accountUtils;
42+
this.clientService = clientService;
3943
this.groupRequestUtils = groupRequestUtils;
4044
this.scopeResolver = scopeResolver;
4145
}
@@ -46,7 +50,7 @@ public StandardEvaluationContext createEvaluationContextInternal(Authentication
4650

4751
StandardEvaluationContext ec = super.createEvaluationContextInternal(authentication, mi);
4852
ec.setVariable("iam", new IamSecurityExpressionMethods(authentication, accountUtils,
49-
groupRequestUtils, scopeResolver));
53+
clientService, groupRequestUtils, scopeResolver));
5054
return ec;
5155
}
5256

iam-login-service/src/main/java/it/infn/mw/iam/core/expression/IamSecurityExpressionMethods.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@
2020
import java.util.Collection;
2121
import java.util.Optional;
2222

23+
import org.mitre.oauth2.model.ClientDetailsEntity;
2324
import org.springframework.security.core.Authentication;
2425
import org.springframework.security.core.GrantedAuthority;
2526
import org.springframework.security.oauth2.provider.OAuth2Authentication;
2627

2728
import it.infn.mw.iam.api.account.AccountUtils;
29+
import it.infn.mw.iam.api.client.service.DefaultClientService;
2830
import it.infn.mw.iam.api.requests.GroupRequestUtils;
2931
import it.infn.mw.iam.authn.AbstractExternalAuthenticationToken;
3032
import it.infn.mw.iam.core.IamGroupRequestStatus;
@@ -40,13 +42,16 @@ public class IamSecurityExpressionMethods {
4042

4143
private final Authentication authentication;
4244
private final AccountUtils accountUtils;
45+
private final DefaultClientService clientService;
4346
private final GroupRequestUtils groupRequestUtils;
4447
private final OAuth2AuthenticationScopeResolver scopeResolver;
4548

4649
public IamSecurityExpressionMethods(Authentication authentication, AccountUtils accountUtils,
47-
GroupRequestUtils groupRequestUtils, OAuth2AuthenticationScopeResolver scopeResolver) {
50+
DefaultClientService clientService, GroupRequestUtils groupRequestUtils,
51+
OAuth2AuthenticationScopeResolver scopeResolver) {
4852
this.authentication = authentication;
4953
this.accountUtils = accountUtils;
54+
this.clientService = clientService;
5055
this.groupRequestUtils = groupRequestUtils;
5156
this.scopeResolver = scopeResolver;
5257
}
@@ -153,4 +158,11 @@ public boolean hasDashboardRole(Role role) {
153158
public boolean hasAdminOrGMDashboardRoleOfGroup(String gid) {
154159
return (hasDashboardRole(Role.ROLE_ADMIN) || isGroupManager(gid));
155160
}
161+
162+
public boolean isClientOwner(String clientId) {
163+
Optional<IamAccount> account = accountUtils.getAuthenticatedUserAccount();
164+
Optional<ClientDetailsEntity> client =
165+
clientService.findClientByClientIdAndAccount(clientId, account.orElse(null));
166+
return client.isPresent();
167+
}
156168
}

iam-login-service/src/main/java/it/infn/mw/iam/core/expression/IamWebSecurityExpressionHandler.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.springframework.stereotype.Component;
2323

2424
import it.infn.mw.iam.api.account.AccountUtils;
25+
import it.infn.mw.iam.api.client.service.DefaultClientService;
2526
import it.infn.mw.iam.api.requests.GroupRequestUtils;
2627
import it.infn.mw.iam.core.userinfo.OAuth2AuthenticationScopeResolver;
2728

@@ -30,12 +31,15 @@
3031
public class IamWebSecurityExpressionHandler extends OAuth2WebSecurityExpressionHandler {
3132

3233
private final AccountUtils accountUtils;
34+
private final DefaultClientService clientService;
3335
private final GroupRequestUtils groupRequestUtils;
3436
private final OAuth2AuthenticationScopeResolver scopeResolver;
3537

3638
public IamWebSecurityExpressionHandler(AccountUtils accountUtils,
37-
GroupRequestUtils groupRequestUtils, OAuth2AuthenticationScopeResolver scopeResolver) {
39+
DefaultClientService clientService, GroupRequestUtils groupRequestUtils,
40+
OAuth2AuthenticationScopeResolver scopeResolver) {
3841
this.accountUtils = accountUtils;
42+
this.clientService = clientService;
3943
this.groupRequestUtils = groupRequestUtils;
4044
this.scopeResolver = scopeResolver;
4145
}
@@ -47,7 +51,7 @@ public StandardEvaluationContext createEvaluationContextInternal(Authentication
4751
StandardEvaluationContext ec =
4852
super.createEvaluationContextInternal(authentication, invocation);
4953
ec.setVariable("iam", new IamSecurityExpressionMethods(authentication, accountUtils,
50-
groupRequestUtils, scopeResolver));
54+
clientService, groupRequestUtils, scopeResolver));
5155
return ec;
5256
}
5357

iam-login-service/src/test/java/it/infn/mw/iam/test/util/IamSecurityExpressionsTests.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import it.infn.mw.iam.IamLoginService;
3333
import it.infn.mw.iam.api.account.AccountUtils;
34+
import it.infn.mw.iam.api.client.service.DefaultClientService;
3435
import it.infn.mw.iam.api.requests.GroupRequestUtils;
3536
import it.infn.mw.iam.api.requests.model.GroupRequestDto;
3637
import it.infn.mw.iam.core.expression.IamSecurityExpressionMethods;
@@ -45,6 +46,9 @@ public class IamSecurityExpressionsTests extends GroupRequestsTestUtils {
4546
@Autowired
4647
private AccountUtils accountUtils;
4748

49+
@Autowired
50+
private DefaultClientService clientService;
51+
4852
@Autowired
4953
private GroupRequestUtils groupRequestUtils;
5054

@@ -58,14 +62,15 @@ public class IamSecurityExpressionsTests extends GroupRequestsTestUtils {
5862
public void destroy() {
5963
repo.deleteAll();
6064
}
61-
65+
6266
private IamSecurityExpressionMethods getMethods() {
6367
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
64-
return new IamSecurityExpressionMethods(authentication, accountUtils, groupRequestUtils, scopeResolver);
68+
return new IamSecurityExpressionMethods(authentication, accountUtils, clientService,
69+
groupRequestUtils, scopeResolver);
6570
}
6671

6772
@Test
68-
@WithMockUser(roles = { "ADMIN", "USER" }, username = TEST_ADMIN)
73+
@WithMockUser(roles = {"ADMIN", "USER"}, username = TEST_ADMIN)
6974
public void testIsAdmin() {
7075
assertTrue(getMethods().isAdmin());
7176
assertTrue(getMethods().isUser(TEST_ADMIN_UUID));
@@ -77,7 +82,7 @@ public void testIsAdmin() {
7782
}
7883

7984
@Test
80-
@WithMockUser(roles = { "USER" }, username = TEST_USERNAME)
85+
@WithMockUser(roles = {"USER"}, username = TEST_USERNAME)
8186
public void testIsNotAdmin() {
8287
assertFalse(getMethods().isAdmin());
8388
assertTrue(getMethods().isUser(TEST_USERUUID));

0 commit comments

Comments
 (0)