Commit 5901a9725fa75966815e45d72d8211a2474db8b8

Authored by Thomas Ziemer
1 parent 3e533eef

feature: Standard-Rechteverwaltung begonnen (WIP)

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