2015-06-09 18 views
7

Gibt es eine Möglichkeit, den Zugriff auf/Überwachung URL von Java-Melody-Plugin in Grails mit Shiro Rollen zu beschränken?Beschränken Sie den Zugriff auf Java-Melody Überwachung URL

Update: ein wenig mehr Details. Es ist kein Problem, also sichern Sie die meisten Grails Ressourcen mit Shiro. Aber im Fall des Java-Melodie-Plugins scheint es, dass der Melodie-Filter ausgeführt wird, bevor der Shiro-Filter ausgeführt wird. Dies macht Shiro nutzlos.

Es gibt einige Lösungen, die sagen, dass dies durch eine Änderung in der web.xml behoben werden kann, aber das ist kein schneller Treffer und ich (rdmueller) schaffte es nicht, es noch zu arbeiten. Das web.xml-Plugin scheint auch etwas Hilfe zu versprechen, aber ich möchte kein weiteres Plugin hinzufügen, nur um ein Plugin zu sichern.

Einige ältere Aussagen im Internet geben an, dass dieses Problem bereits durch die Verwendung der loadAfter Liste in dieser Datei gelöst werden sollte: https://github.com/javamelody/grails-melody-plugin/blob/master/GrailsMelodyGrailsPlugin.groovy - aber es scheint, dass dies nur für ältere Versionen von Grails funktionierte.

Update2: Um es einfacher zu machen, eine Lösung vorzuschlagen, habe ich ein Grails 2.2.4 Beispiel erstellen: https://github.com/rdmueller/SO30739581

nur das Projekt klonen, ein grailsw run-app zu tun und zu

http://localhost:8080/SO30739581/dbdoc 
navigieren

und Sie erhalten einen Login-Bildschirm über Shiro. Navigieren Sie zu

http://localhost:8080/SO30739581/monitoring 

und Sie werden die Melodie Bildschirm erhalten, ohne :-(angemeldet werden

+1

PS: die: Shiro-Schutz-any: 0.1.0-Plugin scheint zu funktionieren, aber es scheint sei ein bisschen zu kompliziert und das Plugin ist "nicht vollständig getestet". Eine einfachere Lösung wäre großartig. – rdmueller

Antwort

3

Ich nehme an, Sie verwenden Grails 2.x, man könnte es so hart codieren:

<!-- language: java--> 
// grails-app/conf/MonitoringFilters.groovy 
import org.apache.shiro.SecurityUtils 
class MonitoringFilters { 

    def dependsOn = [ShiroSecurityFilters] 

    def filters = { 
     myMonitoringArea(uri: "/monitoring") { 
      before = {  
       SecurityUtils.subject.hasRole('ADMIN')    
      } 
     }  
    } 
} 
+0

OK. Beim Start der Bounty hätte ich das Problem ein wenig genauer erklären sollen: Es scheint, dass der Melodiefilter vor dem Shiro-Filter konfiguriert ist, der den Shiro-Filter nutzlos macht. Trotzdem werde ich Ihre Lösung ausprobieren und prüfen, ob sie sich von meiner Lösung unterscheidet. – rdmueller

+0

Sie könnten Filterabhängigkeit wie folgt definieren:

 class MonitoringFilters { ... \t def dependsOn = [ShiroSecurityFilters] } 
YeIIowsnow

+0

afaik, der Melodie-Filter ist innerhalb des Plugins - unerreichbar von meinem Projekt ... – rdmueller

3

landete ich durch Änderungen dabei bis zur HTTP-Authentifizierung web.xml. diese Datei web.config Sie hinzufügen.

<login-config> 
    <auth-method>BASIC</auth-method> 
    <realm-name>Monitoring</realm-name> 
</login-config> 
<security-role> 
    <role-name>monitoring</role-name> 
</security-role> 
<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Monitoring</web-resource-name> 
     <url-pattern>/monitoring</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>monitoring</role-name> 
    </auth-constraint> 
</security-constraint> 

dann einen Benutzer und Rolle zu Ihrem tomcat-users.xml

<user username="yourusername" password="yourpassword" roles="monitoring"/> 
+1

großartig - diese Lösung funktioniert. Aber ich werde noch etwas mehr untersuchen, da diese Lösung a) keinen Shiro benutzt. B) verwendet basic auth, was impliziert, dass https verwendet wird - andernfalls wird es nicht sicher genug sein. Trotzdem ist es ein guter Workaround! – rdmueller

+1

BTW: Ich habe ein 'Grails InstallTemplates' und fügte dann Ihren Abschnitt der web.xml-Datei hinzu. Scheint gut zu funktionieren. Danke! – rdmueller

+0

Ich gebe das Kopfgeld zu dieser Antwort, da es funktioniert. Es nutzt Shiro nicht, aber es funktioniert :-) Danke fürs Teilen ... – rdmueller

0

Fügen Sie einfach alle verfügbaren Optionen zur Liste:

die shiro-protect-any - plugin scheint zu funktionieren, aber IMHO, so scheint es zu sein, etwas zu sein, kompliziert und das Plugin ist "nicht vollständig getestet" (sagt der Autor) ...

0

Dies ist kein "Quick Hit", aber der folgende Ansatz sollte mit Shiro oder was auch immer Sicherheitsrahmen Ihre Grails App verwendet.

In web.xml, fügen Sie die folgenden Elemente über alle vorhandenen <filter> Elemente:

<filter> 
    <filter-name>melodyFilter</filter-name> 
    <filter-class>com.your.package.MelodyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>melodyFilter</filter-name> 
    <url-pattern>/monitoring/*</url-pattern> 
</filter-mapping> 

Dies ruft com.your.package.MelodyFilter jederzeit die /monitoring/* URL-Muster aufgerufen wird.

Als nächstes müssen Sie eine MelodyFilter Java-Klasse in /src/java/com/your/package/MelodyFilter.java erstellen.

Im Körper des doFilter Methode, können Sie eine Grails-Service-Methode aufrufen, alle gewünschten Sicherheitskontrollen durchzuführen, wie folgt:

package com.your.package; 

import com.my.grails.app.MyService; 
import org.springframework.context.ApplicationContext; 
import org.springframework.web.context.support.WebApplicationContextUtils; 

import javax.servlet.*; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpSession; 
import java.io.IOException; 

public class MelodyFilter implements Filter { 

    @Override 
    public void destroy() { } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     String uri = ((HttpServletRequest)request).getRequestURI(); 
     HttpSession session = ((HttpServletRequest)request).getSession(false); 
     ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()); 
     // replace MyService with your actual service 
     MyService myService = (MyService)ctx.getBean("myService"); 
     // replace isUserAuthorized with your actual service method; 
     // session and uri params included to demonstrate how to pass them 
     // your argument list can be whatever your service method requires 
     boolean authorized = myService.isUserAuthorized(session, uri); 
     if (authorized) { chain.doFilter(request,response); } 
     else { 
      request.setAttribute("error", "User is not authorized to access " + uri); 
      request.getRequestDispatcher("/someController/someAction").forward(request, response); 
     } 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { } 
} 

einfach Dann myService.isUserAuthorized() implementieren, um was auch immer Sie wünschen, Sicherheitsüberprüfungen durchführen.

ich diese Technik überprüft haben, arbeitet in Grails-2.3.6 mit Grails-Melodie: 1.59.0

Verwandte Themen