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,6 +10,7 @@ import net.ziemers.swxercise.db.dao.user.UserDao;
10 import net.ziemers.swxercise.lg.model.user.Profile; 10 import net.ziemers.swxercise.lg.model.user.Profile;
11 import net.ziemers.swxercise.lg.model.user.User; 11 import net.ziemers.swxercise.lg.model.user.User;
12 import net.ziemers.swxercise.lg.user.dto.UserDto; 12 import net.ziemers.swxercise.lg.user.dto.UserDto;
  13 +import net.ziemers.swxercise.lg.user.enums.RightState;
13 14
14 /** 15 /**
15 * Diese Klasse stellt alle Dienste im Kontext einer Benutzerverwaltung zur Verfügung. 16 * Diese Klasse stellt alle Dienste im Kontext einer Benutzerverwaltung zur Verfügung.
@@ -54,7 +55,21 @@ public class UserService { @@ -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 * Findet alle existierenden Benutzer. 71 * Findet alle existierenden Benutzer.
  72 + *
58 * @return alle Benutzer, oder eine leere Collection, falls keine existieren. 73 * @return alle Benutzer, oder eine leere Collection, falls keine existieren.
59 */ 74 */
60 public Collection<User> findAllUsers() { 75 public Collection<User> findAllUsers() {
@@ -64,16 +79,16 @@ public class UserService { @@ -64,16 +79,16 @@ public class UserService {
64 /** 79 /**
65 * Erstellt einen neuen Benutzer, sofern noch keiner mit dem selben Benutzernamen existiert. 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 * @return die Id des neuen Benutzers, wenn die Erstellung erfolgreich war. 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 if (user == null) { 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 // wir füllen das User-Objekt mit Method Chaining 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 .withProfile(profile); 92 .withProfile(profile);
78 93
79 return dao.save(user); 94 return dao.save(user);
@@ -82,6 +97,38 @@ public class UserService { @@ -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 * Löscht den Benutzer mit der übergebenen Id. 132 * Löscht den Benutzer mit der übergebenen Id.
86 * 133 *
87 * @param id die Id des zu löschenden Benutzers 134 * @param id die Id des zu löschenden Benutzers
@@ -102,26 +149,44 @@ public class UserService { @@ -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 * @return das User-Objekt des zurzeit angemeldeten Benutzers. 155 * @return das User-Objekt des zurzeit angemeldeten Benutzers.
107 */ 156 */
108 - public User getSessionUser() { 157 + public User getSessionContextUser() {
109 return sessionContext.getUser(); 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 return false; 191 return false;
127 } 192 }
src/main/java/net/ziemers/swxercise/ui/UserViewController.java
@@ -8,6 +8,7 @@ import javax.inject.Inject; @@ -8,6 +8,7 @@ import javax.inject.Inject;
8 import javax.ws.rs.*; 8 import javax.ws.rs.*;
9 import javax.ws.rs.core.MediaType; 9 import javax.ws.rs.core.MediaType;
10 10
  11 +import net.ziemers.swxercise.lg.user.enums.RightState;
11 import net.ziemers.swxercise.lg.user.service.SessionContext; 12 import net.ziemers.swxercise.lg.user.service.SessionContext;
12 import net.ziemers.swxercise.lg.model.user.User; 13 import net.ziemers.swxercise.lg.model.user.User;
13 import net.ziemers.swxercise.lg.user.dto.UserDto; 14 import net.ziemers.swxercise.lg.user.dto.UserDto;
@@ -28,7 +29,7 @@ public class UserViewController { @@ -28,7 +29,7 @@ public class UserViewController {
28 29
29 /** 30 /**
30 * Liefert alle User-Objekte zurück. 31 * Liefert alle User-Objekte zurück.
31 - * 32 + * <p>
32 * Aufruf: 33 * Aufruf:
33 * GET http://localhost:8080/swxercise/rest/v1/users 34 * GET http://localhost:8080/swxercise/rest/v1/users
34 * 35 *
@@ -37,13 +38,14 @@ public class UserViewController { @@ -37,13 +38,14 @@ public class UserViewController {
37 @GET 38 @GET
38 @Path("v1/users") 39 @Path("v1/users")
39 @Produces(MediaType.APPLICATION_JSON) 40 @Produces(MediaType.APPLICATION_JSON)
  41 + @RolesAllowed(RightState.Constants.SUPERADMIN)
40 public Collection<User> getAllUsers() { 42 public Collection<User> getAllUsers() {
41 return userService.findAllUsers(); 43 return userService.findAllUsers();
42 } 44 }
43 45
44 /** 46 /**
45 * Liefert das User-Objekt mit der gewünschten Id zurück. 47 * Liefert das User-Objekt mit der gewünschten Id zurück.
46 - * 48 + * <p>
47 * Aufruf: 49 * Aufruf:
48 * GET http://localhost:8080/swxercise/rest/v1/user/42 50 * GET http://localhost:8080/swxercise/rest/v1/user/42
49 * 51 *
@@ -53,25 +55,39 @@ public class UserViewController { @@ -53,25 +55,39 @@ public class UserViewController {
53 @GET 55 @GET
54 @Path("v1/user/{id}") 56 @Path("v1/user/{id}")
55 @Produces(MediaType.APPLICATION_JSON) 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 return userService.findUser(id); 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 * Aufruf: 80 * Aufruf:
64 * POST http://localhost:8080/swxercise/rest/v1/user 81 * POST http://localhost:8080/swxercise/rest/v1/user
65 * 82 *
66 * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto} 83 * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto}
67 * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. 84 * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs.
68 -  
69 */ 85 */
70 @POST 86 @POST
71 @Path("v1/user") 87 @Path("v1/user")
72 @Consumes(MediaType.APPLICATION_JSON) 88 @Consumes(MediaType.APPLICATION_JSON)
73 @Produces(MediaType.APPLICATION_JSON) 89 @Produces(MediaType.APPLICATION_JSON)
74 - @RolesAllowed("ADMIN") 90 + @RolesAllowed(RightState.Constants.ADMIN)
75 public RestResponse createUser(UserDto dto) { 91 public RestResponse createUser(UserDto dto) {
76 final Long id = userService.createUser(dto); 92 final Long id = userService.createUser(dto);
77 if (id != null) { 93 if (id != null) {
@@ -84,11 +100,11 @@ public class UserViewController { @@ -84,11 +100,11 @@ public class UserViewController {
84 * Aktualisiert das User-Objekt mit der gewünschten Id mit den Eigenschaften, 100 * Aktualisiert das User-Objekt mit der gewünschten Id mit den Eigenschaften,
85 * welche mittels {@link UserDto} definiert werden. Der Pfadparameter wird 101 * welche mittels {@link UserDto} definiert werden. Der Pfadparameter wird
86 * als erstes ge'marshal't, das DTO im Post-Content danach (REST-Konvention). 102 * als erstes ge'marshal't, das DTO im Post-Content danach (REST-Konvention).
87 - * 103 + * <p>
88 * Aufruf: 104 * Aufruf:
89 * PUT http://localhost:8080/swxercise/rest/v1/user/42 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 * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto} 108 * @param dto das mittels der als JSON-Objekt übergebenenen Eigenschaften zu füllende {@link UserDto}
93 * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. 109 * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs.
94 */ 110 */
@@ -96,15 +112,41 @@ public class UserViewController { @@ -96,15 +112,41 @@ public class UserViewController {
96 @Path("v1/user/{id}") 112 @Path("v1/user/{id}")
97 @Consumes(MediaType.APPLICATION_JSON) 113 @Consumes(MediaType.APPLICATION_JSON)
98 @Produces(MediaType.APPLICATION_JSON) 114 @Produces(MediaType.APPLICATION_JSON)
99 - @RolesAllowed("ADMIN") 115 + @RolesAllowed(RightState.Constants.ADMIN)
100 public RestResponse updateUser(@PathParam("id") Long id, UserDto dto) { 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 return new RestResponse(ResponseState.FAILED); 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 * Aufruf: 150 * Aufruf:
109 * DELETE http://localhost:8080/swxercise/rest/v1/user/42 151 * DELETE http://localhost:8080/swxercise/rest/v1/user/42
110 * 152 *
@@ -114,7 +156,7 @@ public class UserViewController { @@ -114,7 +156,7 @@ public class UserViewController {
114 @DELETE 156 @DELETE
115 @Path("v1/user/{id}") 157 @Path("v1/user/{id}")
116 @Produces(MediaType.APPLICATION_JSON) 158 @Produces(MediaType.APPLICATION_JSON)
117 - @RolesAllowed("ADMIN") 159 + @RolesAllowed(RightState.Constants.ADMIN)
118 public RestResponse deleteUser(@PathParam("id") Long id) { 160 public RestResponse deleteUser(@PathParam("id") Long id) {
119 userService.deleteUser(id); 161 userService.deleteUser(id);
120 return new RestResponse(); 162 return new RestResponse();
@@ -122,7 +164,7 @@ public class UserViewController { @@ -122,7 +164,7 @@ public class UserViewController {
122 164
123 /** 165 /**
124 * Löscht das User-Objekt des zurzeit angemeldeten Benutzers. 166 * Löscht das User-Objekt des zurzeit angemeldeten Benutzers.
125 - * 167 + * <p>
126 * Aufruf: 168 * Aufruf:
127 * DELETE http://localhost:8080/swxercise/rest/v1/user 169 * DELETE http://localhost:8080/swxercise/rest/v1/user
128 * 170 *
@@ -131,6 +173,7 @@ public class UserViewController { @@ -131,6 +173,7 @@ public class UserViewController {
131 @DELETE 173 @DELETE
132 @Path("v1/user") 174 @Path("v1/user")
133 @Produces(MediaType.APPLICATION_JSON) 175 @Produces(MediaType.APPLICATION_JSON)
  176 + @RolesAllowed(RightState.Constants.LOGGED_IN)
134 public RestResponse deleteUser() { 177 public RestResponse deleteUser() {
135 if (userService.deleteUser()) { 178 if (userService.deleteUser()) {
136 return new RestResponse(); 179 return new RestResponse();
@@ -140,7 +183,7 @@ public class UserViewController { @@ -140,7 +183,7 @@ public class UserViewController {
140 183
141 /** 184 /**
142 * Meldet einen Benutzer durch übergebenen username und password mit einem neuen User-{@link SessionContext} an. 185 * Meldet einen Benutzer durch übergebenen username und password mit einem neuen User-{@link SessionContext} an.
143 - * 186 + * <p>
144 * Aufruf: 187 * Aufruf:
145 * POST http://localhost:8080/swxercise/rest/v1/user/login 188 * POST http://localhost:8080/swxercise/rest/v1/user/login
146 * 189 *
@@ -151,6 +194,7 @@ public class UserViewController { @@ -151,6 +194,7 @@ public class UserViewController {
151 @Path("v1/user/login") 194 @Path("v1/user/login")
152 @Consumes(MediaType.APPLICATION_JSON) 195 @Consumes(MediaType.APPLICATION_JSON)
153 @Produces(MediaType.APPLICATION_JSON) 196 @Produces(MediaType.APPLICATION_JSON)
  197 + @RolesAllowed(RightState.Constants.NOT_LOGGED_IN)
154 public RestResponse loginUser(UserDto dto) { 198 public RestResponse loginUser(UserDto dto) {
155 if (userService.loginUser(dto)) { 199 if (userService.loginUser(dto)) {
156 return new RestResponse(); 200 return new RestResponse();
@@ -160,7 +204,7 @@ public class UserViewController { @@ -160,7 +204,7 @@ public class UserViewController {
160 204
161 /** 205 /**
162 * Meldet den angemeldeten Benutzer von seinem User-{@link SessionContext} ab. 206 * Meldet den angemeldeten Benutzer von seinem User-{@link SessionContext} ab.
163 - * 207 + * <p>
164 * Aufruf: 208 * Aufruf:
165 * POST http://localhost:8080/swxercise/rest/v1/user/logout 209 * POST http://localhost:8080/swxercise/rest/v1/user/logout
166 * 210 *
@@ -169,6 +213,7 @@ public class UserViewController { @@ -169,6 +213,7 @@ public class UserViewController {
169 @POST 213 @POST
170 @Path("v1/user/logout") 214 @Path("v1/user/logout")
171 @Produces(MediaType.APPLICATION_JSON) 215 @Produces(MediaType.APPLICATION_JSON)
  216 + @RolesAllowed(RightState.Constants.LOGGED_IN)
172 public RestResponse logoutUser() { 217 public RestResponse logoutUser() {
173 if (userService.logoutUser()) { 218 if (userService.logoutUser()) {
174 return new RestResponse(); 219 return new RestResponse();