2017-01-29 2 views
0

Ich entwickle eine REST-basierte Web-Anwendung, wo Rest Services Apache Shiro integriert hat, um grundlegende Authentifizierung und rollenbasierte Autorisierung durchzuführen.Apache Shiro + HTTP-Methode Ebene Erlaubnis

Jetzt möchte ich die Autorisierung Funktionalität mit Berechtigungen Konfiguration auf Methodenebene (Micro-Service im Falle von REST) ​​zu verbessern. Wenn ich nicht falsch liege, bietet Apache shiro die HttpMethodPermissionFilter-Klasse, die als Filter verwendet werden kann, um eingehende Anfragen basierend auf ihrer HTTP-Methode (GET, POST, DELETE, HEAD usw.) zu beschränken, die intern nach den Berechtigungen aus der Tabelle roles_permissions sucht Datenbank, die wir konfiguriert haben oder INI-Konfigurationsdatei.

Um HTTP-basierte Berechtigungsfunktionen zu implementieren, muss ich Änderungen in meiner shiro.ini-Datei vornehmen. Oder mein JDBC-Bereich hat etwas zu tun.

shiro.ini Datei

[main] 
userRoles = org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 

jdbcRealm = my.custom.jdbc.realm.YhJdbcRealm 
securityManager.realms = $jdbcRealm 

[urls] 
# Allowing login page to any user 
/rest/login/** = anon 

# Page 1 
/rest/page1/** = noSessionCreation, authcBasic, userRoles[role1] 


# page 2 
/rest/page2/** = noSessionCreation, authcBasic, userRoles[role1,role2,role3] 


# page 3 
/yhrest/page3/** = noSessionCreation, authcBasic, userRoles[role1,role3] 

/rest/** = noSessionCreation, authcBasic 

benutzerdefinierte jdbc Reich

public class YhJdbcRealm extends JdbcRealm 
{ 
    public YhJdbcRealm() 
    { 
     loadDataSource(); 
    } 

    private void loadDataSource() 
    { 
     this.dataSource = JdbcConnection.initConnection(); 
     this.permissionsLookupEnabled = true; 
     this.authenticationQuery = "SELECT password FROM users WHERE username = ?"; 
     this.userRolesQuery = "SELECT role_name FROM user_roles WHERE username = ?"; 
     this.permissionsQuery = "SELECT permission FROM roles_permissions_temp WHERE role_name = ?"; 
    } 

    @Override 
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 
    { 
     AuthenticationInfo info = super.doGetAuthenticationInfo(token); 
     return info; 
    } 
} 

ich zu Apache Shiro bin hier so jeder Hinweis dankbar wäre. Danke.

Antwort

0

Werfen Sie einen Blick auf die doc für die HttpMethodPermissionFilter, können Sie die folgenden CRUD Berechtigungen für /rest/page1 sagen:

  • abc:create
  • abc:read
  • abc:update
  • abc:delete

Deine [urls] Mapping würde wie folgt aussehen:

[urls] 
/rest/page1/** = noSessionCreation, authcBasic, rest[abc] 

Alle GET-Anfragen an /rest/page1/** würde die Erlaubnis abgebildet werden rest[abc:read]

+0

Sie meinen also, „abc“ ist ein Benutzer hier, und es ist gonna haben Berechtigungen für alle CRUD für Seite1. Toll, In welchem ​​Format oder wie wäre es in der Datenbank gespeichert? Können Sie das Schema und die Werte teilen, die ich für die tatsächliche Berechtigungsprüfung für eine bestimmte Seite benötigen würde? –

+0

Ja, 'abc' wäre die Berechtigung des Basisbenutzers, ich würde 'page1' verwenden, wollte sie aber für die Erklärung getrennt halten. Das Schema liegt bei Ihnen, aber es sieht so aus, als würde die Spalte 'Erlaubnis' Berechtigungen für Rollen zuweisen. Sehen Sie sich die folgenden Links an, um weitere Informationen zu erhalten: [Blog auf Shiro-Berechtigungen] (https://stormpath.com/blog/protecting-jax-rs-resources-rbac-apache-shiro#authorize-the-stormtroopers- jax-rs-resource), [Shiro-Berechtigungen] (https://shiro.apache.org/permissions.html) –

Verwandte Themen