限制访问 java-旋律监听 url
Restrict access to java-melody monitoring url
有没有一种方法可以限制对使用 Shiro 角色的 Java-Melody 插件生成的 /monitoring url 的访问?
更新:更多细节。使用 shiro 保护大多数 Grails 资源是没有问题的。但是在 java 旋律插件的情况下,旋律过滤器似乎在执行 shiro 过滤器之前执行。这使 shiro 无用。
有一些解决方案说这可能会通过 web.xml 中的更改来解决,但这不是一个快速的解决方案,我 (rdmueller) 还没有设法让它工作。 web.xml 插件似乎也能提供一些帮助,但我不想为了保护一个插件而添加另一个插件。
在网络上发现的一些较旧的陈述指出,通过使用此文件中的 loadAfter
列表应该已经解决了这个问题:https://github.com/javamelody/grails-melody-plugin/blob/master/GrailsMelodyGrailsPlugin.groovy - 但似乎这只适用于较旧的Grails 版本。
Update2: 为了更容易提出解决方案,我创建了一个 Grails 2.2.4 示例:https://github.com/rdmueller/SO30739581
只需克隆项目,执行 grailsw run-app
并导航到
http://localhost:8080/SO30739581/dbdoc
您将通过 shiro 获得登录屏幕。导航到
http://localhost:8080/SO30739581/monitoring
你会在没有登录的情况下看到旋律屏幕:-(
我假设您使用的是 Grails 2.x,您可以这样硬编码:
<!-- 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')
}
}
}
}
我最终通过更改 web.xml 进行 HTTP 身份验证来完成此操作。将此添加到您的 web.config 文件。
<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>
然后将用户和角色添加到您的 tomcat-users.xml
<user username="yourusername" password="yourpassword" roles="monitoring"/>
仅列出所有可用选项:
shiro-protect-any - plugin 似乎可以工作,但是恕我直言,它似乎有点太复杂了,插件是 "not fully tested"(作者说)...
这不是 "quick hit",但以下方法应该适用于 Shiro 或您的 Grails 应用程序使用的任何安全框架。
在 web.xml 中,在任何现有 <filter>
元素之上添加以下元素:
<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>
这将在任何时候调用 /monitoring/*
url 模式时调用 com.your.package.MelodyFilter
。
接下来,您需要在 /src/java/com/your/package/MelodyFilter.java
中创建 MelodyFilter
Java class。
在 doFilter
方法的主体中,您可以调用 Grails 服务方法来执行任何所需的安全检查,如下所示:
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 { }
}
然后只需实施 myService.isUserAuthorized()
即可执行您想要的任何安全检查。
我已经通过 grails-melody:1.59.0
验证了该技术在 Grails-2.3.6 中有效
有没有一种方法可以限制对使用 Shiro 角色的 Java-Melody 插件生成的 /monitoring url 的访问?
更新:更多细节。使用 shiro 保护大多数 Grails 资源是没有问题的。但是在 java 旋律插件的情况下,旋律过滤器似乎在执行 shiro 过滤器之前执行。这使 shiro 无用。
有一些解决方案说这可能会通过 web.xml 中的更改来解决,但这不是一个快速的解决方案,我 (rdmueller) 还没有设法让它工作。 web.xml 插件似乎也能提供一些帮助,但我不想为了保护一个插件而添加另一个插件。
在网络上发现的一些较旧的陈述指出,通过使用此文件中的 loadAfter
列表应该已经解决了这个问题:https://github.com/javamelody/grails-melody-plugin/blob/master/GrailsMelodyGrailsPlugin.groovy - 但似乎这只适用于较旧的Grails 版本。
Update2: 为了更容易提出解决方案,我创建了一个 Grails 2.2.4 示例:https://github.com/rdmueller/SO30739581
只需克隆项目,执行 grailsw run-app
并导航到
http://localhost:8080/SO30739581/dbdoc
您将通过 shiro 获得登录屏幕。导航到
http://localhost:8080/SO30739581/monitoring
你会在没有登录的情况下看到旋律屏幕:-(
我假设您使用的是 Grails 2.x,您可以这样硬编码:
<!-- 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')
}
}
}
}
我最终通过更改 web.xml 进行 HTTP 身份验证来完成此操作。将此添加到您的 web.config 文件。
<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>
然后将用户和角色添加到您的 tomcat-users.xml
<user username="yourusername" password="yourpassword" roles="monitoring"/>
仅列出所有可用选项:
shiro-protect-any - plugin 似乎可以工作,但是恕我直言,它似乎有点太复杂了,插件是 "not fully tested"(作者说)...
这不是 "quick hit",但以下方法应该适用于 Shiro 或您的 Grails 应用程序使用的任何安全框架。
在 web.xml 中,在任何现有 <filter>
元素之上添加以下元素:
<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>
这将在任何时候调用 /monitoring/*
url 模式时调用 com.your.package.MelodyFilter
。
接下来,您需要在 /src/java/com/your/package/MelodyFilter.java
中创建 MelodyFilter
Java class。
在 doFilter
方法的主体中,您可以调用 Grails 服务方法来执行任何所需的安全检查,如下所示:
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 { }
}
然后只需实施 myService.isUserAuthorized()
即可执行您想要的任何安全检查。
我已经通过 grails-melody:1.59.0
验证了该技术在 Grails-2.3.6 中有效