Skip to content

Commit 1099d88

Browse files
Rahul VermaandricDu
Rahul Verma
authored andcommitted
🐛fix: Error while generating tokens for Client Credentials grant (#103)
* Added Custom Application Token Enhancer and Refactored for explicit JSON Views * Added Groups in User and App JWT * Cleanup * Cleanup * Cleanup * Cleanup
1 parent 323ef0a commit 1099d88

27 files changed

+558
-219
lines changed

src/main/java/org/overture/ego/config/AuthConfig.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
import org.springframework.context.annotation.Configuration;
2727
import org.springframework.context.annotation.Primary;
2828
import org.springframework.security.authentication.AuthenticationManager;
29+
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
30+
import org.springframework.security.crypto.password.PasswordEncoder;
2931
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
3032
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
3133
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
@@ -75,6 +77,11 @@ public TokenStore tokenStore() {
7577
return new JwtTokenStore(accessTokenConverter());
7678
}
7779

80+
@Bean
81+
public PasswordEncoder passwordEncoder() {
82+
return new BCryptPasswordEncoder();
83+
}
84+
7885
@Bean
7986
public JwtAccessTokenConverter accessTokenConverter() {
8087
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
@@ -93,12 +100,10 @@ public DefaultTokenServices tokenServices() {
93100
return defaultTokenServices;
94101
}
95102

96-
97103
@Override
98104
public void configure(ClientDetailsServiceConfigurer clients)
99105
throws Exception {
100106
clients.withClientDetails(clientDetailsService);
101-
102107
}
103108

104109
@Bean

src/main/java/org/overture/ego/controller/ApplicationController.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.overture.ego.controller;
1818

19+
import com.fasterxml.jackson.annotation.JsonView;
1920
import io.swagger.annotations.ApiImplicitParam;
2021
import io.swagger.annotations.ApiImplicitParams;
2122
import io.swagger.annotations.ApiResponse;
@@ -31,6 +32,7 @@
3132
import org.overture.ego.service.ApplicationService;
3233
import org.overture.ego.service.GroupService;
3334
import org.overture.ego.service.UserService;
35+
import org.overture.ego.view.Views;
3436
import org.springframework.beans.factory.annotation.Autowired;
3537
import org.springframework.data.domain.Pageable;
3638
import org.springframework.http.HttpHeaders;
@@ -75,9 +77,10 @@ public class ApplicationController {
7577
})
7678
@ApiResponses(
7779
value = {
78-
@ApiResponse(code = 200, message = "Page of applications", response = PageDTO.class)
80+
@ApiResponse(code = 200, message = "Page of Applications", response = PageDTO.class)
7981
}
8082
)
83+
@JsonView(Views.REST.class)
8184
public @ResponseBody
8285
PageDTO<Application> getApplicationsList(
8386
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -112,6 +115,7 @@ Application create(
112115
@ApiResponse(code = 200, message = "Application Details", response = Application.class)
113116
}
114117
)
118+
@JsonView(Views.REST.class)
115119
public @ResponseBody
116120
Application get(
117121
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -164,9 +168,10 @@ public void deleteApplication(
164168
})
165169
@ApiResponses(
166170
value = {
167-
@ApiResponse(code = 200, message = "Page of users of group", response = PageDTO.class)
171+
@ApiResponse(code = 200, message = "Page of Users of group", response = PageDTO.class)
168172
}
169173
)
174+
@JsonView(Views.REST.class)
170175
public @ResponseBody
171176
PageDTO<User> getApplicationUsers(
172177
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -204,9 +209,10 @@ PageDTO<User> getApplicationUsers(
204209
})
205210
@ApiResponses(
206211
value = {
207-
@ApiResponse(code = 200, message = "Page of applications of group", response = PageDTO.class)
212+
@ApiResponse(code = 200, message = "Page of Applications of group", response = PageDTO.class)
208213
}
209214
)
215+
@JsonView(Views.REST.class)
210216
public @ResponseBody
211217
PageDTO<Group> getApplicationsGroups(
212218
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,

src/main/java/org/overture/ego/controller/GroupController.java

+9-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.overture.ego.controller;
1818

19+
import com.fasterxml.jackson.annotation.JsonView;
1920
import io.swagger.annotations.ApiImplicitParam;
2021
import io.swagger.annotations.ApiImplicitParams;
2122
import io.swagger.annotations.ApiResponse;
@@ -31,6 +32,7 @@
3132
import org.overture.ego.service.ApplicationService;
3233
import org.overture.ego.service.GroupService;
3334
import org.overture.ego.service.UserService;
35+
import org.overture.ego.view.Views;
3436
import org.springframework.beans.factory.annotation.Autowired;
3537
import org.springframework.data.domain.Pageable;
3638
import org.springframework.http.HttpHeaders;
@@ -79,9 +81,10 @@ public class GroupController {
7981
})
8082
@ApiResponses(
8183
value = {
82-
@ApiResponse(code = 200, message = "Page of groups", response = PageDTO.class)
84+
@ApiResponse(code = 200, message = "Page of Groups", response = PageDTO.class)
8385
}
8486
)
87+
@JsonView(Views.REST.class)
8588
public @ResponseBody
8689
PageDTO<Group> getGroupsList(
8790
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -116,6 +119,7 @@ Group createGroup(
116119
@ApiResponse(code = 200, message = "Group Details", response = Group.class)
117120
}
118121
)
122+
@JsonView(Views.REST.class)
119123
public @ResponseBody
120124
Group getGroup(
121125
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -169,9 +173,10 @@ public void deleteGroup(
169173
})
170174
@ApiResponses(
171175
value = {
172-
@ApiResponse(code = 200, message = "Page of applications of group", response = PageDTO.class)
176+
@ApiResponse(code = 200, message = "Page of Applications of group", response = PageDTO.class)
173177
}
174178
)
179+
@JsonView(Views.REST.class)
175180
public @ResponseBody
176181
PageDTO<Application> getGroupsApplications(
177182
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -241,9 +246,10 @@ public void deleteAppsFromGroup(
241246
})
242247
@ApiResponses(
243248
value = {
244-
@ApiResponse(code = 200, message = "Page of users of group", response = PageDTO.class)
249+
@ApiResponse(code = 200, message = "Page of Users of group", response = PageDTO.class)
245250
}
246251
)
252+
@JsonView(Views.REST.class)
247253
public @ResponseBody
248254
PageDTO<User> getGroupsUsers(
249255
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,

src/main/java/org/overture/ego/controller/UserController.java

+12-6
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.overture.ego.controller;
1818

19+
import com.fasterxml.jackson.annotation.JsonView;
1920
import io.swagger.annotations.*;
2021
import lombok.extern.slf4j.Slf4j;
2122
import org.overture.ego.model.dto.PageDTO;
@@ -28,6 +29,7 @@
2829
import org.overture.ego.service.ApplicationService;
2930
import org.overture.ego.service.GroupService;
3031
import org.overture.ego.service.UserService;
32+
import org.overture.ego.view.Views;
3133
import org.springframework.beans.factory.annotation.Autowired;
3234
import org.springframework.data.domain.Pageable;
3335
import org.springframework.http.HttpHeaders;
@@ -75,13 +77,14 @@ public class UserController {
7577
})
7678
@ApiResponses(
7779
value = {
78-
@ApiResponse(code = 200, message = "Page of users", response = PageDTO.class)
80+
@ApiResponse(code = 200, message = "Page of Users", response = PageDTO.class)
7981
}
8082
)
83+
@JsonView(Views.REST.class)
8184
public @ResponseBody
8285
PageDTO<User> getUsersList(
8386
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
84-
@ApiParam(value="Query string compares to users Name, Email, First Name, and Last Name fields.", required=false ) @RequestParam(value = "query", required = false) String query,
87+
@ApiParam(value="Query string compares to Users Name, Email, First Name, and Last Name fields.", required=false ) @RequestParam(value = "query", required = false) String query,
8588
@ApiIgnore @Filters List<SearchFilter> filters,
8689
Pageable pageable)
8790
{
@@ -113,6 +116,7 @@ User create(
113116
@ApiResponse(code = 200, message = "User Details", response = User.class)
114117
}
115118
)
119+
@JsonView(Views.REST.class)
116120
public @ResponseBody
117121
User getUser(
118122
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -165,9 +169,10 @@ public void deleteUser(
165169
})
166170
@ApiResponses(
167171
value = {
168-
@ApiResponse(code = 200, message = "Page of groups of user", response = PageDTO.class)
172+
@ApiResponse(code = 200, message = "Page of Groups of user", response = PageDTO.class)
169173
}
170174
)
175+
@JsonView(Views.REST.class)
171176
public @ResponseBody
172177
PageDTO<Group> getUsersGroups(
173178
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -187,7 +192,7 @@ PageDTO<Group> getUsersGroups(
187192
@RequestMapping(method = RequestMethod.POST, value = "/{id}/groups")
188193
@ApiResponses(
189194
value = {
190-
@ApiResponse(code = 200, message = "Add groups to user", response = String.class)
195+
@ApiResponse(code = 200, message = "Add Groups to user", response = String.class)
191196
}
192197
)
193198
public @ResponseBody
@@ -196,7 +201,7 @@ String addGroupsToUser(
196201
@PathVariable(value = "id", required = true) String userId,
197202
@RequestBody(required = true) List<String> groupIDs) {
198203
userService.addUsersToGroups(userId,groupIDs);
199-
return "User added to : "+groupIDs.size() + " groups successfully.";
204+
return "User added to : "+groupIDs.size() + " Group(s) successfully.";
200205
}
201206

202207
@AdminScoped
@@ -239,6 +244,7 @@ public void deleteGroupFromUser(
239244
@ApiResponse(code = 200, message = "Page of apps of user", response = PageDTO.class)
240245
}
241246
)
247+
@JsonView(Views.REST.class)
242248
public @ResponseBody
243249
PageDTO<Application> getUsersApplications(
244250
@RequestHeader(value = HttpHeaders.AUTHORIZATION, required = true) final String accessToken,
@@ -258,7 +264,7 @@ PageDTO<Application> getUsersApplications(
258264
@RequestMapping(method = RequestMethod.POST, value = "/{id}/applications")
259265
@ApiResponses(
260266
value = {
261-
@ApiResponse(code = 200, message = "Add applications to user", response = String.class)
267+
@ApiResponse(code = 200, message = "Add Applications to user", response = String.class)
262268
}
263269
)
264270
public @ResponseBody

src/main/java/org/overture/ego/model/dto/PageDTO.java

+3
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
package org.overture.ego.model.dto;
1818

1919

20+
import com.fasterxml.jackson.annotation.JsonView;
2021
import lombok.Getter;
2122
import lombok.NonNull;
23+
import org.overture.ego.view.Views;
2224
import org.springframework.data.domain.Page;
2325

2426
import java.util.List;
2527

2628
@Getter
29+
@JsonView(Views.REST.class)
2730
public class PageDTO<T> {
2831

2932
private final int limit;

src/main/java/org/overture/ego/model/entity/Application.java

+28-10
Original file line numberDiff line numberDiff line change
@@ -19,36 +19,43 @@
1919
import com.fasterxml.jackson.annotation.JsonIgnore;
2020
import com.fasterxml.jackson.annotation.JsonInclude;
2121
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
22+
import com.fasterxml.jackson.annotation.JsonView;
2223
import lombok.*;
2324
import org.hibernate.annotations.LazyCollection;
2425
import org.hibernate.annotations.LazyCollectionOption;
2526
import org.overture.ego.model.enums.Fields;
27+
import org.overture.ego.view.Views;
2628

2729
import javax.persistence.*;
30+
import java.util.ArrayList;
2831
import java.util.HashSet;
2932
import java.util.List;
3033
import java.util.Set;
34+
import java.util.stream.Collectors;
3135

3236
@Entity
3337
@Table(name = "egoapplication")
3438
@Data
35-
@ToString(exclude={"groups","users"})
39+
@ToString(exclude={"wholeGroups","wholeUsers"})
3640
@JsonPropertyOrder({"id", "name", "clientId", "clientSecret", "redirectUri", "description", "status"})
37-
@JsonInclude(JsonInclude.Include.ALWAYS)
41+
@JsonInclude(JsonInclude.Include.CUSTOM)
3842
@EqualsAndHashCode(of={"id"})
3943
@NoArgsConstructor
4044
@RequiredArgsConstructor
45+
@JsonView(Views.REST.class)
4146
public class Application {
4247

4348
@Id
4449
@Column(nullable = false, name = Fields.ID, updatable = false)
4550
@GeneratedValue(strategy = GenerationType.IDENTITY)
4651
int id;
4752

53+
@JsonView({Views.JWTAccessToken.class,Views.REST.class})
4854
@NonNull
4955
@Column(nullable = false, name = Fields.NAME)
5056
String name;
5157

58+
@JsonView({Views.JWTAccessToken.class,Views.REST.class})
5259
@NonNull
5360
@Column(nullable = false, name = Fields.CLIENTID)
5461
String clientId;
@@ -57,24 +64,27 @@ public class Application {
5764
@Column(nullable = false, name = Fields.CLIENTSECRET)
5865
String clientSecret;
5966

67+
@JsonView({Views.JWTAccessToken.class,Views.REST.class})
6068
@Column(name = Fields.REDIRECTURI)
6169
String redirectUri;
6270

71+
@JsonView({Views.JWTAccessToken.class,Views.REST.class})
6372
@Column(name = Fields.DESCRIPTION)
6473
String description;
6574

75+
@JsonView(Views.JWTAccessToken.class)
6676
@Column(name = Fields.STATUS)
6777
String status;
6878

69-
@ManyToMany(mappedBy = "applications", cascade = CascadeType.ALL)
79+
@ManyToMany(mappedBy = "wholeApplications", cascade = CascadeType.ALL)
7080
@LazyCollection(LazyCollectionOption.FALSE)
7181
@JsonIgnore
72-
Set<Group> groups;
82+
Set<Group> wholeGroups;
7383

74-
@ManyToMany(mappedBy = "applications", cascade = CascadeType.ALL)
84+
@ManyToMany(mappedBy = "wholeApplications", cascade = CascadeType.ALL)
7585
@LazyCollection(LazyCollectionOption.FALSE)
7686
@JsonIgnore
77-
Set<User> users;
87+
Set<User> wholeUsers;
7888

7989
@JsonIgnore
8090
public HashSet<String> getURISet(){
@@ -83,6 +93,14 @@ public HashSet<String> getURISet(){
8393
return output;
8494
}
8595

96+
@JsonView(Views.JWTAccessToken.class)
97+
public List<String> getGroups(){
98+
if(this.wholeGroups == null) {
99+
return new ArrayList<String>();
100+
}
101+
return this.wholeGroups.stream().map(g -> g.getName()).collect(Collectors.toList());
102+
}
103+
86104
public void update(Application other) {
87105
this.name = other.name;
88106
this.clientId = other.clientId;
@@ -94,12 +112,12 @@ public void update(Application other) {
94112
// Do not update ID;
95113

96114
// Update Users and Groups only if provided (not null)
97-
if (other.users != null) {
98-
this.users = other.users;
115+
if (other.wholeUsers != null) {
116+
this.wholeUsers = other.wholeUsers;
99117
}
100118

101-
if (other.groups != null) {
102-
this.groups = other.groups;
119+
if (other.wholeGroups != null) {
120+
this.wholeGroups = other.wholeGroups;
103121
}
104122
}
105123

0 commit comments

Comments
 (0)