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 | 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 | 78 | @ManyToOne |
73 | 79 | public Role getParent() { |
74 | 80 | return parent; | ... | ... |
src/main/java/net/ziemers/swxercise/lg/user/enums/RightState.java
... | ... | @@ -22,7 +22,8 @@ public enum RightState { |
22 | 22 | |
23 | 23 | public static RightState getByName(final String name) { |
24 | 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 | 27 | return value; |
27 | 28 | } |
28 | 29 | } | ... | ... |
src/main/java/net/ziemers/swxercise/lg/user/service/RoleService.java
1 | 1 | package net.ziemers.swxercise.lg.user.service; |
2 | 2 | |
3 | +import com.sun.mail.imap.Rights; | |
3 | 4 | import net.ziemers.swxercise.db.dao.user.RoleDao; |
4 | 5 | import net.ziemers.swxercise.lg.model.user.Role; |
5 | 6 | import net.ziemers.swxercise.lg.model.user.User; |
6 | 7 | import net.ziemers.swxercise.lg.user.dto.RoleDto; |
8 | +import net.ziemers.swxercise.lg.user.enums.RightState; | |
7 | 9 | |
8 | 10 | import javax.ejb.Stateless; |
9 | 11 | import javax.inject.Inject; |
... | ... | @@ -26,7 +28,9 @@ public class RoleService { |
26 | 28 | * |
27 | 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 | 36 | * Findet die Rolle mit der übergebenen Id. |
... | ... | @@ -129,4 +133,41 @@ public class RoleService { |
129 | 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 | 176 | if (rightsSet.contains(RightState.Constants.LOGGED_IN)) { |
177 | 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 | 180 | final Role role = user.getProfile().getRole(); |
181 | 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 | 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 | 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 | 144 | * Aktualisiert das Role-Objekt des zurzeit angemeldeten Benutzers mit den |
125 | 145 | * Eigenschaften, welche mittels {@link RoleDto} definiert werden. Der |
... | ... | @@ -136,7 +156,7 @@ public class RoleViewController { |
136 | 156 | @Path("v1/role") |
137 | 157 | @Consumes(MediaType.APPLICATION_JSON) |
138 | 158 | @Produces(MediaType.APPLICATION_JSON) |
139 | - @RolesAllowed(RightState.Constants.LOGGED_IN) | |
159 | + @RolesAllowed(RightState.Constants.ADMIN) | |
140 | 160 | public RestResponse updateRole(RoleDto dto) { |
141 | 161 | if (roleService.updateRole(dto)) { |
142 | 162 | return new RestResponse(); |
... | ... | @@ -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 | 189 | * Löscht das Role-Objekt mit der gewünschten Id. |
149 | 190 | * <p> |
150 | 191 | * Aufruf: |
... | ... | @@ -173,7 +214,7 @@ public class RoleViewController { |
173 | 214 | @DELETE |
174 | 215 | @Path("v1/role") |
175 | 216 | @Produces(MediaType.APPLICATION_JSON) |
176 | - @RolesAllowed(RightState.Constants.LOGGED_IN) | |
217 | + @RolesAllowed(RightState.Constants.ADMIN) | |
177 | 218 | public RestResponse deleteRole() { |
178 | 219 | if (roleService.deleteRole()) { |
179 | 220 | return new RestResponse(); |
... | ... | @@ -181,20 +222,4 @@ public class RoleViewController { |
181 | 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 | } | ... | ... |