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(); | ... | ... |