Commit 5901a9725fa75966815e45d72d8211a2474db8b8
1 parent
3e533eef
feature: Standard-Rechteverwaltung begonnen (WIP)
Showing
3 changed files
with
180 additions
and
31 deletions
src/main/java/net/ziemers/swxercise/lg/user/enums/RightState.java
0 → 100644
1 | +package net.ziemers.swxercise.lg.user.enums; | |
2 | + | |
3 | +/** | |
4 | + * Stellt grundsätzliche Rechte zur Verfügung, die so mit hoher Wahrscheinlichkeit | |
5 | + * in vielen Anwendungen verwendet werden möchten. | |
6 | + */ | |
7 | +public enum RightState { | |
8 | + | |
9 | + NOT_LOGGED_IN(Constants.NOT_LOGGED_IN), | |
10 | + LOGGED_IN(Constants.LOGGED_IN), | |
11 | + ADMIN(Constants.ADMIN), | |
12 | + SUPERADMIN(Constants.SUPERADMIN), | |
13 | + ; | |
14 | + | |
15 | + private String name; | |
16 | + | |
17 | + RightState(final String name) { | |
18 | + this.name = name; | |
19 | + } | |
20 | + | |
21 | + public String getName() { | |
22 | + return name; | |
23 | + } | |
24 | + | |
25 | + private void setName(String name) { | |
26 | + this.name = name; | |
27 | + } | |
28 | + | |
29 | + /* | |
30 | + * Diese Klasse wird verwendet, damit wir innerhalb von Annotationen auf die Namen zugreifen können. | |
31 | + */ | |
32 | + public static class Constants { | |
33 | + public static final String NOT_LOGGED_IN = "NOT_LOGGED_IN"; | |
34 | + public static final String LOGGED_IN = "LOGGED_IN"; | |
35 | + public static final String ADMIN = "ADMIN"; | |
36 | + public static final String SUPERADMIN = "SUPERADMIN"; | |
37 | + } | |
38 | + | |
39 | +} | ... | ... |
src/main/java/net/ziemers/swxercise/lg/user/service/UserService.java
... | ... | @@ -10,6 +10,7 @@ import net.ziemers.swxercise.db.dao.user.UserDao; |
10 | 10 | import net.ziemers.swxercise.lg.model.user.Profile; |
11 | 11 | import net.ziemers.swxercise.lg.model.user.User; |
12 | 12 | import net.ziemers.swxercise.lg.user.dto.UserDto; |
13 | +import net.ziemers.swxercise.lg.user.enums.RightState; | |
13 | 14 | |
14 | 15 | /** |
15 | 16 | * Diese Klasse stellt alle Dienste im Kontext einer Benutzerverwaltung zur Verfügung. |
... | ... | @@ -54,7 +55,21 @@ public class UserService { |
54 | 55 | } |
55 | 56 | |
56 | 57 | /** |
58 | + * Findet den zurzeit angemeldeten Benutzer. | |
59 | + * | |
60 | + * @return den gesuchten Benutzer, oder <code>null</code>, falls ein solcher nicht existiert. | |
61 | + */ | |
62 | + public User findUser() { | |
63 | + final User user = sessionContext.getUser(); | |
64 | + if (user != null) { | |
65 | + return dao.findById(user.getId()); | |
66 | + } | |
67 | + return null; | |
68 | + } | |
69 | + | |
70 | + /** | |
57 | 71 | * Findet alle existierenden Benutzer. |
72 | + * | |
58 | 73 | * @return alle Benutzer, oder eine leere Collection, falls keine existieren. |
59 | 74 | */ |
60 | 75 | public Collection<User> findAllUsers() { |
... | ... | @@ -64,16 +79,16 @@ public class UserService { |
64 | 79 | /** |
65 | 80 | * Erstellt einen neuen Benutzer, sofern noch keiner mit dem selben Benutzernamen existiert. |
66 | 81 | * |
67 | - * @param userDto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers | |
82 | + * @param dto das {@link UserDto} enthält die Eigenschaften des zu erstellenden Benutzers | |
68 | 83 | * @return die Id des neuen Benutzers, wenn die Erstellung erfolgreich war. |
69 | 84 | */ |
70 | - public Long createUser(final UserDto userDto) { | |
71 | - User user = dao.findByUsername(userDto.getUsername()); | |
85 | + public Long createUser(final UserDto dto) { | |
86 | + User user = dao.findByUsername(dto.getUsername()); | |
72 | 87 | if (user == null) { |
73 | - final Profile profile = new Profile(userDto.getUsername(), userDto.getPassword()); | |
88 | + final Profile profile = new Profile(dto.getUsername(), dto.getPassword()); | |
74 | 89 | |
75 | 90 | // wir füllen das User-Objekt mit Method Chaining |
76 | - user = new User(userDto.getFirstname(), userDto.getLastname()) | |
91 | + user = new User(dto.getFirstname(), dto.getLastname()) | |
77 | 92 | .withProfile(profile); |
78 | 93 | |
79 | 94 | return dao.save(user); |
... | ... | @@ -82,6 +97,38 @@ public class UserService { |
82 | 97 | } |
83 | 98 | |
84 | 99 | /** |
100 | + * Aktualisiert den Benutzer mit der übergebenen Id. | |
101 | + * | |
102 | + * @param id die Id des zu aktualisierenden Benutzers | |
103 | + * @param dto das {@link UserDto} enthält die Eigenschaften des zu aktualisierenden Benutzers | |
104 | + * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. | |
105 | + */ | |
106 | + public boolean updateUser(final Long id, final UserDto dto) { | |
107 | + final User user = dao.findById(id); | |
108 | + if (user != null) { | |
109 | + // TODO noch zu implementieren | |
110 | + return false; | |
111 | + } | |
112 | + return false; | |
113 | + } | |
114 | + | |
115 | + /** | |
116 | + * Aktualisiert den zurzeit angemeldeten Benutzer. | |
117 | + * | |
118 | + * @param dto das {@link UserDto} enthält die Eigenschaften des zu aktualisierenden Benutzers | |
119 | + * @return <code>true</code>, wenn das Aktualisieren des Benutzers erfolgreich war. | |
120 | + */ | |
121 | + public boolean updateUser(final UserDto dto) { | |
122 | + // ist zurzeit ein Benutzer angemeldet, können wir ihn aktualisieren | |
123 | + final User user = sessionContext.getUser(); | |
124 | + if (user != null) { | |
125 | + // TODO noch zu implementieren | |
126 | + return false; | |
127 | + } | |
128 | + return false; | |
129 | + } | |
130 | + | |
131 | + /** | |
85 | 132 | * Löscht den Benutzer mit der übergebenen Id. |
86 | 133 | * |
87 | 134 | * @param id die Id des zu löschenden Benutzers |
... | ... | @@ -102,26 +149,44 @@ public class UserService { |
102 | 149 | } |
103 | 150 | |
104 | 151 | /** |
105 | - * Liefert das {@link User}-Objekt des zurzeit angemeldeten Benutzers zurück. | |
152 | + * Liefert das {@link User}-Objekt des zurzeit angemeldeten Benutzers zurück. Das ist derjenige | |
153 | + * Benutzer, der im {@link SessionContext}-Objekt hinterlegt ist. | |
154 | + * | |
106 | 155 | * @return das User-Objekt des zurzeit angemeldeten Benutzers. |
107 | 156 | */ |
108 | - public User getSessionUser() { | |
157 | + public User getSessionContextUser() { | |
109 | 158 | return sessionContext.getUser(); |
110 | 159 | } |
111 | 160 | |
112 | 161 | /** |
113 | - * Prüft, ob der zurzeit angemeldete Benutzer eine Rolle aus der Liste der übergebenen Rollen besitzt. | |
162 | + * Prüft, ob der Benutzer des {@link SessionContext}s ein Recht aus der Liste der übergebenen Rechte besitzt. | |
114 | 163 | * |
115 | - * @param rolesSet die Rollenliste | |
116 | - * @return <code>true</code>, falls der zurzeit angemeldete Benutzer eine der übergebenen Rollen besitzt. | |
164 | + * @param rightsSet die Rechteliste | |
165 | + * @return <code>true</code>, falls der Benutzer eines der übergebenen Rechte besitzt. | |
117 | 166 | */ |
118 | - public boolean isUserAllowed(final Set<String> rolesSet) { | |
119 | - final User user = getSessionUser(); | |
167 | + public boolean isUserAllowed(final Set<String> rightsSet) { | |
168 | + final User user = getSessionContextUser(); | |
120 | 169 | |
121 | - // ist überhaupt ein Benutzer angemeldet? | |
122 | - if (user != null) { | |
123 | - // TODO muss noch implementiert werden | |
124 | - return true; | |
170 | + // Rechte, die nur ein nicht-angemeldeter Benutzer besitzen kann | |
171 | + if (user == null) { | |
172 | + if (rightsSet.contains(RightState.Constants.NOT_LOGGED_IN)) { | |
173 | + return true; | |
174 | + } | |
175 | + } | |
176 | + | |
177 | + // Rechte, die nur ein angemeldeter Benutzer besitzen kann | |
178 | + else { | |
179 | + if (rightsSet.contains(RightState.Constants.LOGGED_IN)) { | |
180 | + return true; | |
181 | + } | |
182 | + if (rightsSet.contains(RightState.Constants.ADMIN)) { | |
183 | + // TODO muss noch implementiert werden | |
184 | + return true; | |
185 | + } | |
186 | + if (rightsSet.contains(RightState.Constants.SUPERADMIN)) { | |
187 | + // TODO muss noch implementiert werden | |
188 | + return true; | |
189 | + } | |
125 | 190 | } |
126 | 191 | return false; |
127 | 192 | } | ... | ... |
src/main/java/net/ziemers/swxercise/ui/UserViewController.java
... | ... | @@ -8,6 +8,7 @@ import javax.inject.Inject; |
8 | 8 | import javax.ws.rs.*; |
9 | 9 | import javax.ws.rs.core.MediaType; |
10 | 10 | |
11 | +import net.ziemers.swxercise.lg.user.enums.RightState; | |
11 | 12 | import net.ziemers.swxercise.lg.user.service.SessionContext; |
12 | 13 | import net.ziemers.swxercise.lg.model.user.User; |
13 | 14 | import net.ziemers.swxercise.lg.user.dto.UserDto; |
... | ... | @@ -28,7 +29,7 @@ public class UserViewController { |
28 | 29 | |
29 | 30 | /** |
30 | 31 | * Liefert alle User-Objekte zurück. |
31 | - * | |
32 | + * <p> | |
32 | 33 | * Aufruf: |
33 | 34 | * GET http://localhost:8080/swxercise/rest/v1/users |
34 | 35 | * |
... | ... | @@ -37,13 +38,14 @@ public class UserViewController { |
37 | 38 | @GET |
38 | 39 | @Path("v1/users") |
39 | 40 | @Produces(MediaType.APPLICATION_JSON) |
41 | + @RolesAllowed(RightState.Constants.SUPERADMIN) | |
40 | 42 | public Collection<User> getAllUsers() { |
41 | 43 | return userService.findAllUsers(); |
42 | 44 | } |
43 | 45 | |
44 | 46 | /** |
45 | 47 | * Liefert das User-Objekt mit der gewünschten Id zurück. |
46 | - * | |
48 | + * <p> | |
47 | 49 | * Aufruf: |
48 | 50 | * GET http://localhost:8080/swxercise/rest/v1/user/42 |
49 | 51 | * |
... | ... | @@ -53,25 +55,39 @@ public class UserViewController { |
53 | 55 | @GET |
54 | 56 | @Path("v1/user/{id}") |
55 | 57 | @Produces(MediaType.APPLICATION_JSON) |
56 | - public User getById(@PathParam("id") Long id) { | |
58 | + @RolesAllowed(RightState.Constants.SUPERADMIN) | |
59 | + public User getUser(@PathParam("id") Long id) { | |
57 | 60 | return userService.findUser(id); |
58 | 61 | } |
59 | 62 | |
60 | 63 | /** |
61 | - * Erstellt ein neues User-Objekt mit den gewünschten Eigenschaften, welche mittels {@link UserDto} definiert werden. | |
64 | + * Liefert das User-Objekt des zurzeit angemeldeten Benutzers zurück. | |
65 | + * <p> | |
66 | + * Aufruf: | |
67 | + * GET http://localhost:8080/swxercise/rest/v1/user | |
62 | 68 | * |
69 | + * @return das User-Objekt als JSON, oder <code>null</code>, falls keines existiert. | |
70 | + */ | |
71 | + @GET | |
72 | + @Path("v1/user") | |
73 | + @Produces(MediaType.APPLICATION_JSON) | |
74 | + @RolesAllowed(RightState.Constants.LOGGED_IN) | |
75 | + public User getUser() { return userService.findUser(); } | |
76 | + | |
77 | + /** | |
78 | + * Erstellt ein neues User-Objekt mit den gewünschten Eigenschaften, welche mittels {@link UserDto} definiert werden. | |
79 | + * <p> | |
63 | 80 | * Aufruf: |
64 | 81 | * POST http://localhost:8080/swxercise/rest/v1/user |
65 | 82 | * |
66 | 83 | * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto} |
67 | 84 | * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. |
68 | - | |
69 | 85 | */ |
70 | 86 | @POST |
71 | 87 | @Path("v1/user") |
72 | 88 | @Consumes(MediaType.APPLICATION_JSON) |
73 | 89 | @Produces(MediaType.APPLICATION_JSON) |
74 | - @RolesAllowed("ADMIN") | |
90 | + @RolesAllowed(RightState.Constants.ADMIN) | |
75 | 91 | public RestResponse createUser(UserDto dto) { |
76 | 92 | final Long id = userService.createUser(dto); |
77 | 93 | if (id != null) { |
... | ... | @@ -84,11 +100,11 @@ public class UserViewController { |
84 | 100 | * Aktualisiert das User-Objekt mit der gewünschten Id mit den Eigenschaften, |
85 | 101 | * welche mittels {@link UserDto} definiert werden. Der Pfadparameter wird |
86 | 102 | * als erstes ge'marshal't, das DTO im Post-Content danach (REST-Konvention). |
87 | - * | |
103 | + * <p> | |
88 | 104 | * Aufruf: |
89 | 105 | * PUT http://localhost:8080/swxercise/rest/v1/user/42 |
90 | 106 | * |
91 | - * @param id die Id des zu aktualisierenden User-Objekts | |
107 | + * @param id die Id des zu aktualisierenden User-Objekts | |
92 | 108 | * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto} |
93 | 109 | * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. |
94 | 110 | */ |
... | ... | @@ -96,15 +112,41 @@ public class UserViewController { |
96 | 112 | @Path("v1/user/{id}") |
97 | 113 | @Consumes(MediaType.APPLICATION_JSON) |
98 | 114 | @Produces(MediaType.APPLICATION_JSON) |
99 | - @RolesAllowed("ADMIN") | |
115 | + @RolesAllowed(RightState.Constants.ADMIN) | |
100 | 116 | public RestResponse updateUser(@PathParam("id") Long id, UserDto dto) { |
101 | - // TODO noch zu implementieren | |
117 | + if (userService.updateUser(id, dto)) { | |
118 | + return new RestResponse(); | |
119 | + } | |
102 | 120 | return new RestResponse(ResponseState.FAILED); |
103 | 121 | } |
104 | 122 | |
105 | 123 | /** |
106 | - * Löscht das User-Objekt mit der gewünschten Id. | |
124 | + * Aktualisiert das User-Objekt des zurzeit angemeldeten Benutzers mit den | |
125 | + * Eigenschaften, welche mittels {@link UserDto} definiert werden. Der | |
126 | + * Pfadparameter wird als erstes ge'marshal't, das DTO im Post-Content | |
127 | + * danach (REST-Konvention). | |
128 | + * <p> | |
129 | + * Aufruf: | |
130 | + * PUT http://localhost:8080/swxercise/rest/v1/user | |
107 | 131 | * |
132 | + * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto} | |
133 | + * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. | |
134 | + */ | |
135 | + @PUT | |
136 | + @Path("v1/user") | |
137 | + @Consumes(MediaType.APPLICATION_JSON) | |
138 | + @Produces(MediaType.APPLICATION_JSON) | |
139 | + @RolesAllowed(RightState.Constants.LOGGED_IN) | |
140 | + public RestResponse updateUser(UserDto dto) { | |
141 | + if (userService.updateUser(dto)) { | |
142 | + return new RestResponse(); | |
143 | + } | |
144 | + return new RestResponse(ResponseState.FAILED); | |
145 | + } | |
146 | + | |
147 | + /** | |
148 | + * Löscht das User-Objekt mit der gewünschten Id. | |
149 | + * <p> | |
108 | 150 | * Aufruf: |
109 | 151 | * DELETE http://localhost:8080/swxercise/rest/v1/user/42 |
110 | 152 | * |
... | ... | @@ -114,7 +156,7 @@ public class UserViewController { |
114 | 156 | @DELETE |
115 | 157 | @Path("v1/user/{id}") |
116 | 158 | @Produces(MediaType.APPLICATION_JSON) |
117 | - @RolesAllowed("ADMIN") | |
159 | + @RolesAllowed(RightState.Constants.ADMIN) | |
118 | 160 | public RestResponse deleteUser(@PathParam("id") Long id) { |
119 | 161 | userService.deleteUser(id); |
120 | 162 | return new RestResponse(); |
... | ... | @@ -122,7 +164,7 @@ public class UserViewController { |
122 | 164 | |
123 | 165 | /** |
124 | 166 | * Löscht das User-Objekt des zurzeit angemeldeten Benutzers. |
125 | - * | |
167 | + * <p> | |
126 | 168 | * Aufruf: |
127 | 169 | * DELETE http://localhost:8080/swxercise/rest/v1/user |
128 | 170 | * |
... | ... | @@ -131,6 +173,7 @@ public class UserViewController { |
131 | 173 | @DELETE |
132 | 174 | @Path("v1/user") |
133 | 175 | @Produces(MediaType.APPLICATION_JSON) |
176 | + @RolesAllowed(RightState.Constants.LOGGED_IN) | |
134 | 177 | public RestResponse deleteUser() { |
135 | 178 | if (userService.deleteUser()) { |
136 | 179 | return new RestResponse(); |
... | ... | @@ -140,7 +183,7 @@ public class UserViewController { |
140 | 183 | |
141 | 184 | /** |
142 | 185 | * Meldet einen Benutzer durch übergebenen username und password mit einem neuen User-{@link SessionContext} an. |
143 | - * | |
186 | + * <p> | |
144 | 187 | * Aufruf: |
145 | 188 | * POST http://localhost:8080/swxercise/rest/v1/user/login |
146 | 189 | * |
... | ... | @@ -151,6 +194,7 @@ public class UserViewController { |
151 | 194 | @Path("v1/user/login") |
152 | 195 | @Consumes(MediaType.APPLICATION_JSON) |
153 | 196 | @Produces(MediaType.APPLICATION_JSON) |
197 | + @RolesAllowed(RightState.Constants.NOT_LOGGED_IN) | |
154 | 198 | public RestResponse loginUser(UserDto dto) { |
155 | 199 | if (userService.loginUser(dto)) { |
156 | 200 | return new RestResponse(); |
... | ... | @@ -160,7 +204,7 @@ public class UserViewController { |
160 | 204 | |
161 | 205 | /** |
162 | 206 | * Meldet den angemeldeten Benutzer von seinem User-{@link SessionContext} ab. |
163 | - * | |
207 | + * <p> | |
164 | 208 | * Aufruf: |
165 | 209 | * POST http://localhost:8080/swxercise/rest/v1/user/logout |
166 | 210 | * |
... | ... | @@ -169,6 +213,7 @@ public class UserViewController { |
169 | 213 | @POST |
170 | 214 | @Path("v1/user/logout") |
171 | 215 | @Produces(MediaType.APPLICATION_JSON) |
216 | + @RolesAllowed(RightState.Constants.LOGGED_IN) | |
172 | 217 | public RestResponse logoutUser() { |
173 | 218 | if (userService.logoutUser()) { |
174 | 219 | return new RestResponse(); | ... | ... |