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