Commit bcfa4333a2ba10031ef3b727ddaca26ad28c9828
1 parent
bb6de6b9
feature: Recht hinzufügen, Rollen verknüpfen
Showing
5 changed files
with
112 additions
and
29 deletions
src/main/java/net/ziemers/swxercise/lg/model/user/Role.java
@@ -69,6 +69,12 @@ public class Role extends BaseEntity { | @@ -69,6 +69,12 @@ public class Role extends BaseEntity { | ||
69 | this.rights = rights; | 69 | this.rights = rights; |
70 | } | 70 | } |
71 | 71 | ||
72 | + public boolean addRight(final RightState right) { | ||
73 | + // TODO Doubletten verhindern | ||
74 | + this.rights.add(right); | ||
75 | + return true; | ||
76 | + } | ||
77 | + | ||
72 | @ManyToOne | 78 | @ManyToOne |
73 | public Role getParent() { | 79 | public Role getParent() { |
74 | return parent; | 80 | return parent; |
src/main/java/net/ziemers/swxercise/lg/user/enums/RightState.java
@@ -22,7 +22,8 @@ public enum RightState { | @@ -22,7 +22,8 @@ public enum RightState { | ||
22 | 22 | ||
23 | public static RightState getByName(final String name) { | 23 | public static RightState getByName(final String name) { |
24 | for (RightState value : values()) { | 24 | for (RightState value : values()) { |
25 | - if (value.name().equals(name)) { | 25 | + // die Groß-/Kleinschreibung soll beim Vergleich keine Rolle spielen |
26 | + if (value.name().equalsIgnoreCase(name)) { | ||
26 | return value; | 27 | return value; |
27 | } | 28 | } |
28 | } | 29 | } |
src/main/java/net/ziemers/swxercise/lg/user/service/RoleService.java
1 | package net.ziemers.swxercise.lg.user.service; | 1 | package net.ziemers.swxercise.lg.user.service; |
2 | 2 | ||
3 | +import com.sun.mail.imap.Rights; | ||
3 | import net.ziemers.swxercise.db.dao.user.RoleDao; | 4 | import net.ziemers.swxercise.db.dao.user.RoleDao; |
4 | import net.ziemers.swxercise.lg.model.user.Role; | 5 | import net.ziemers.swxercise.lg.model.user.Role; |
5 | import net.ziemers.swxercise.lg.model.user.User; | 6 | import net.ziemers.swxercise.lg.model.user.User; |
6 | import net.ziemers.swxercise.lg.user.dto.RoleDto; | 7 | import net.ziemers.swxercise.lg.user.dto.RoleDto; |
8 | +import net.ziemers.swxercise.lg.user.enums.RightState; | ||
7 | 9 | ||
8 | import javax.ejb.Stateless; | 10 | import javax.ejb.Stateless; |
9 | import javax.inject.Inject; | 11 | import javax.inject.Inject; |
@@ -26,7 +28,9 @@ public class RoleService { | @@ -26,7 +28,9 @@ public class RoleService { | ||
26 | * | 28 | * |
27 | * @return alle Rollen, oder eine leere Collection, falls keine existieren. | 29 | * @return alle Rollen, oder eine leere Collection, falls keine existieren. |
28 | */ | 30 | */ |
29 | - public Collection<Role> findAllRoles() { return dao.findAll(Role.class); } | 31 | + public Collection<Role> findAllRoles() { |
32 | + return dao.findAll(Role.class); | ||
33 | + } | ||
30 | 34 | ||
31 | /** | 35 | /** |
32 | * Findet die Rolle mit der übergebenen Id. | 36 | * Findet die Rolle mit der übergebenen Id. |
@@ -129,4 +133,41 @@ public class RoleService { | @@ -129,4 +133,41 @@ public class RoleService { | ||
129 | return false; | 133 | return false; |
130 | } | 134 | } |
131 | 135 | ||
136 | + /** | ||
137 | + * Verknüpft zwei Rollen in einer Vater-/Kindbeziehung. | ||
138 | + * | ||
139 | + * @param childName der Name der gewünschten Kindrolle | ||
140 | + * @param parentName der Name der gewünschten Vaterrolle | ||
141 | + * @return <code>true</code>, wenn die Verknüpfung erfolgreich durchgeführt werden konnte. | ||
142 | + */ | ||
143 | + public boolean linkRoles(final String childName, final String parentName) { | ||
144 | + final Role childRole = dao.findByName(childName); | ||
145 | + if (childRole != null) { | ||
146 | + final Role parentRole = dao.findByName(parentName); | ||
147 | + if (parentRole != null) { | ||
148 | + childRole.setParent(parentRole); | ||
149 | + return dao.saveOrUpdate(childRole) != null; | ||
150 | + } | ||
151 | + } | ||
152 | + return false; | ||
153 | + } | ||
154 | + | ||
155 | + /** | ||
156 | + * Fügt einer Rolle ein neues Recht hinzu. | ||
157 | + * | ||
158 | + * @param id die Id der gewünschten Rolle | ||
159 | + * @param rightName der Name des gewünschten Rechts | ||
160 | + * @return <code>true</code>, wenn das Hinzufügen erfolgreich durchgeführt werden konnte. | ||
161 | + */ | ||
162 | + public boolean addRight(final Long id, final String rightName) { | ||
163 | + final Role role = dao.findById(id); | ||
164 | + if (role != null) { | ||
165 | + final RightState right = RightState.getByName(rightName); | ||
166 | + if (right != null) { | ||
167 | + return role.addRight(right); | ||
168 | + } | ||
169 | + } | ||
170 | + return false; | ||
171 | + } | ||
172 | + | ||
132 | } | 173 | } |
src/main/java/net/ziemers/swxercise/lg/user/service/UserService.java
@@ -176,20 +176,30 @@ public class UserService { | @@ -176,20 +176,30 @@ public class UserService { | ||
176 | if (rightsSet.contains(RightState.Constants.LOGGED_IN)) { | 176 | if (rightsSet.contains(RightState.Constants.LOGGED_IN)) { |
177 | return true; | 177 | return true; |
178 | } | 178 | } |
179 | - // besitzt dieser Benutzer eine zugewiesene Rolle? | 179 | + // besitzt dieser Benutzer eine zugewiesene Rolle, in der eines der gewünschten Rechte enthalten ist? |
180 | final Role role = user.getProfile().getRole(); | 180 | final Role role = user.getProfile().getRole(); |
181 | if (role != null) { | 181 | if (role != null) { |
182 | - // sämtliche Rechte iterieren, die den Benutzer berechtigen würden, um zu ermitteln, | ||
183 | - // ob der Benutzer eines dieser Rechte besitzt | ||
184 | - for (String right : rightsSet) { | ||
185 | - // besitzt der Benutzer das betrachtete Recht? | ||
186 | - if (role.hasRight(RightState.getByName(right))) { | ||
187 | - return true; | ||
188 | - } | ||
189 | - } | 182 | + return isUserAllowed(role, rightsSet); |
190 | } | 183 | } |
191 | } | 184 | } |
192 | return false; | 185 | return false; |
193 | } | 186 | } |
194 | 187 | ||
188 | + private boolean isUserAllowed(final Role role, final Set<String> rightsSet) { | ||
189 | + // sämtliche Rechte iterieren, die den Benutzer berechtigen würden, um zu ermitteln, | ||
190 | + // ob der Benutzer eines dieser Rechte besitzt | ||
191 | + for (String right : rightsSet) { | ||
192 | + // besitzt der Benutzer das betrachtete Recht? | ||
193 | + if (role.hasRight(RightState.getByName(right))) { | ||
194 | + return true; | ||
195 | + } | ||
196 | + } | ||
197 | + // wenn diese Rolle von einer Vaterrolle erbt, prüfen wir dessen Rechte ebenfalls | ||
198 | + if (role.getParent() != null) { | ||
199 | + // TODO Zyklen werden hier noch nicht erkannt! | ||
200 | + return isUserAllowed(role.getParent(), rightsSet); | ||
201 | + } | ||
202 | + return false; | ||
203 | + } | ||
204 | + | ||
195 | } | 205 | } |
src/main/java/net/ziemers/swxercise/ui/RoleViewController.java
@@ -120,6 +120,26 @@ public class RoleViewController { | @@ -120,6 +120,26 @@ public class RoleViewController { | ||
120 | return new RestResponse(ResponseState.FAILED); | 120 | return new RestResponse(ResponseState.FAILED); |
121 | } | 121 | } |
122 | 122 | ||
123 | + /** Fügt der angegebenen Rolle das angegebene Recht hinzu. | ||
124 | + * <p> | ||
125 | + * Aufruf: | ||
126 | + * PUT http://localhost:8080/swxercise/rest/v1/role/add/42/admin | ||
127 | + * | ||
128 | + * @param id die Id der gewünschen Rolle | ||
129 | + * @param rightName der Name des gewünschten Rechts | ||
130 | + * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. | ||
131 | + */ | ||
132 | + @PUT | ||
133 | + @Path("v1/role/add/{id}/{rightname}") | ||
134 | + @Produces(MediaType.APPLICATION_JSON) | ||
135 | + @RolesAllowed(RightState.Constants.ADMIN) | ||
136 | + public RestResponse addRight(@PathParam("id") Long id, @PathParam("rightname") String rightName) { | ||
137 | + if (roleService.addRight(id, rightName)) { | ||
138 | + return new RestResponse(); | ||
139 | + } | ||
140 | + return new RestResponse(ResponseState.FAILED); | ||
141 | + } | ||
142 | + | ||
123 | /** | 143 | /** |
124 | * Aktualisiert das Role-Objekt des zurzeit angemeldeten Benutzers mit den | 144 | * Aktualisiert das Role-Objekt des zurzeit angemeldeten Benutzers mit den |
125 | * Eigenschaften, welche mittels {@link RoleDto} definiert werden. Der | 145 | * Eigenschaften, welche mittels {@link RoleDto} definiert werden. Der |
@@ -136,7 +156,7 @@ public class RoleViewController { | @@ -136,7 +156,7 @@ public class RoleViewController { | ||
136 | @Path("v1/role") | 156 | @Path("v1/role") |
137 | @Consumes(MediaType.APPLICATION_JSON) | 157 | @Consumes(MediaType.APPLICATION_JSON) |
138 | @Produces(MediaType.APPLICATION_JSON) | 158 | @Produces(MediaType.APPLICATION_JSON) |
139 | - @RolesAllowed(RightState.Constants.LOGGED_IN) | 159 | + @RolesAllowed(RightState.Constants.ADMIN) |
140 | public RestResponse updateRole(RoleDto dto) { | 160 | public RestResponse updateRole(RoleDto dto) { |
141 | if (roleService.updateRole(dto)) { | 161 | if (roleService.updateRole(dto)) { |
142 | return new RestResponse(); | 162 | return new RestResponse(); |
@@ -145,6 +165,27 @@ public class RoleViewController { | @@ -145,6 +165,27 @@ public class RoleViewController { | ||
145 | } | 165 | } |
146 | 166 | ||
147 | /** | 167 | /** |
168 | + * Verknüpft eine Rolle (die "Kindrolle") mit einer anderen Rolle (der "Vaterrolle"). | ||
169 | + * <p> | ||
170 | + * Aufruf: | ||
171 | + * PUT http://localhost:8080/swxercise/rest/v1/role/childname/parentname | ||
172 | + * | ||
173 | + * @param childName die Kindrolle, welche mit der Vaterrolle verknüpft werden soll | ||
174 | + * @param parentName die Vaterrolle, welche mit der Kindrolle verknüpft werden soll. | ||
175 | + * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. | ||
176 | + */ | ||
177 | + @PUT | ||
178 | + @Path("v1/role/link/{childname}/{parentname}") | ||
179 | + @Produces(MediaType.APPLICATION_JSON) | ||
180 | + @RolesAllowed(RightState.Constants.ADMIN) | ||
181 | + public RestResponse linkRoles(@PathParam("childname") String childName, @PathParam("parentname") String parentName) { | ||
182 | + if (roleService.linkRoles(childName, parentName)) { | ||
183 | + return new RestResponse(); | ||
184 | + } | ||
185 | + return new RestResponse(ResponseState.FAILED); | ||
186 | + } | ||
187 | + | ||
188 | + /** | ||
148 | * Löscht das Role-Objekt mit der gewünschten Id. | 189 | * Löscht das Role-Objekt mit der gewünschten Id. |
149 | * <p> | 190 | * <p> |
150 | * Aufruf: | 191 | * Aufruf: |
@@ -173,7 +214,7 @@ public class RoleViewController { | @@ -173,7 +214,7 @@ public class RoleViewController { | ||
173 | @DELETE | 214 | @DELETE |
174 | @Path("v1/role") | 215 | @Path("v1/role") |
175 | @Produces(MediaType.APPLICATION_JSON) | 216 | @Produces(MediaType.APPLICATION_JSON) |
176 | - @RolesAllowed(RightState.Constants.LOGGED_IN) | 217 | + @RolesAllowed(RightState.Constants.ADMIN) |
177 | public RestResponse deleteRole() { | 218 | public RestResponse deleteRole() { |
178 | if (roleService.deleteRole()) { | 219 | if (roleService.deleteRole()) { |
179 | return new RestResponse(); | 220 | return new RestResponse(); |
@@ -181,20 +222,4 @@ public class RoleViewController { | @@ -181,20 +222,4 @@ public class RoleViewController { | ||
181 | return new RestResponse(ResponseState.FAILED); | 222 | return new RestResponse(ResponseState.FAILED); |
182 | } | 223 | } |
183 | 224 | ||
184 | - /** | ||
185 | - * Verknüpft eine Rolle (die "Kindrolle") mit einer anderen Rolle (der "Vaterrolle"). | ||
186 | - * | ||
187 | - * @param childName die Kindrolle, welche mit der Vaterrolle verknüpft werden soll | ||
188 | - * @param parentName die Vaterrolle, welche mit der Kindrolle verknüpft werden soll. | ||
189 | - * @return ein {@link ResponseState}-Objekt mit den Ergebnisinformationen des Aufrufs. | ||
190 | - */ | ||
191 | - @PUT | ||
192 | - @Path("v1/role/link/{childname}/{parentname}") | ||
193 | - @Produces(MediaType.APPLICATION_JSON) | ||
194 | - @RolesAllowed(RightState.Constants.ADMIN) | ||
195 | - public RestResponse linkRoles(@PathParam("childname") String childName, @PathParam("parentname") String parentName) { | ||
196 | - // TODO noch zu implementieren | ||
197 | - return null; | ||
198 | - } | ||
199 | - | ||
200 | } | 225 | } |