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 | } |