Commit bcfa4333a2ba10031ef3b727ddaca26ad28c9828

Authored by Thomas Ziemer
1 parent bb6de6b9

feature: Recht hinzufügen, Rollen verknüpfen

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