La mise en œuvre de la gestion des autorisations via le fichier beans.xml repose sur la déclaration d'une référence à un objet de type JwtSecurityConfiguration dans l'élément <jaxrs:server>:
<jaxrs:server ...> <jaxrs:properties> <entry key="jwtTokenConfiguration"> <ref bean="jwtTokenConfiguration"/> </entry> <entry key="jwtSecurityConfiguration"> <ref bean="jwtSecurityConfiguration"/> </entry> </jaxrs:properties> </jaxrs:server>
L'objet JwtSecurityConfiguration expose une liste de rôles (jwtSecurityRoles) et un ensemble de contraintes de sécurité (jwtSecurityConstraints).
<bean id="jwtSecurityConfiguration" class="com.hardis.adelia.webservice.JwtSecurityConfiguration"> <property name="jwtSecurityRoles"> <list> <value>admin</value> <value>customer</value> <value>supplier</value> </list> </property> <property name="jwtSecurityConstraints"> <list> <ref bean="jwtSecurityConstraint_1" /> <ref bean="jwtSecurityConstraint_2" /> </list> </property> </bean>
Une contrainte de sécurité (JwtSecurityConstraint) cible un ensemble de ressources (à travers les propriétés url_patterns et http_methods) et leur assigne des autorisations via une liste de rôles (role_names) :
url_patterns |
Une ou plusieurs url-pattern. Seul le caractère joker * est accepté dans l'url-pattern et uniquement en fin d'URL. Exemple : /a/b/c/* |
http_methods |
Une liste d'ordres HTTP (GET/PUT/POST/DELETE...). La propriété est facultative ; son absence indique que la contrainte porte sur tous les ordres HTTP. |
role_names |
Une liste de rôles autorisés. Les rôles doivent appartenir à la liste des rôles déclarés via l'objet JwtSecurityConfiguration. |
La propriété est facultative, son absence indique que la ressource n'est jamais accessible.
Changement du bloc ci-dessous en bloc de code
<bean id="jwtSecurityConstraint_1" class="com.hardis.adelia.webservice.JwtSecurityConstraint"> <property name="url_patterns"> <list> <value>/ws/jaxrc1/*</value> <value>/ws/jaxrc2/*</value> <value>/ws/jaxrc3/*</value> </list> </property> <!-- no method == all methods --> <property name="http_methods"> <list> <value>PUT</value> <value>POST</value> <value>DELETE</value> </list> </property> <!-- no role_names == access is forbidden --> <property name="role_names"> <list> <value>admin</value> </list> </property> </bean> <bean id="jwtSecurityConstraint_2" class="com.hardis.adelia.webservice.JwtSecurityConstraint"> <property name="url_patterns"> <list> <value>/ws/jaxrc1/voit2/*</value> </list> </property> <property name="role_names"> <list> <value>customer</value> <value>supplier</value> </list> </property> </bean>
Changement de couleur du paragraphe suivant : rouge bizarre devient noir
L'exemple ci-dessus déclare deux contraintes de sécurité nommées :
jwtSecurityConstraint_1 : contrainte imposant à l'utilisateur d'avoir le rôle admin pour toutes les requêtes PUT, POST et DELETE dont l'URL commence par l'un des trois segments suivants :
/<ContextPath>/ws/jaxrc1/
/<ContextPath>/ws/jaxrc2/
/<ContextPath>/ws/jaxrc3/
jwtSecurityConstraint_2 : contrainte imposant à l'utilisateur d'avoir soit le rôle customer, soit le rôle supplier, pour toutes les requêtes dont l'URL commence par :
/<ContextPath>/ws/jaxrc1/voit2/
Remarque : dans le cas où une ressource satisfait plusieurs contraintes de sécurité, les règles de désignation de la bonne contrainte suivent le schéma suivant :
[1] Concordance parfaite
[2] Précédence d'une concordance avec préfixe d'une concordance avec un préfixe plus court.
[3] Précédence d'une concordance avec préfixe d'une concordance universelle.
[4] Concordance universelle (url_pattern : /)